Вопрос по ggplot2, r, facet – Объединение новых линий и курсива в метках фасетов с помощью ggplot2

6

У меня проблема с получением некоторых слов, используемых в метках фасетов курсивом. Я использую следующий код для создания новых строк для меток:

    levels(length_subject$CONSTRUCTION) 
@joran I получить следующее сообщение об ошибке: Ошибка разбора (text = x): <текст>: 3: 5: неожиданный '-' 2: Извлечено 3: для - ^ user1504579
@joran Я обновлю пост, чтобы включить воспроизводимый пример. user1504579
вы можете'т действительно смешиватьexpression() и новые строки в R; обычный обходной путь заключается в использовании.atop baptiste
Мысль: попробуйlabeller = label_parsed внутриfacet_grid, Не уверен, что это будет делать с вашими новыми линиями, хотя. joran

Ваш Ответ

3   ответа
4

Изменить (2016)

С новой системой маркировки фасетов это решение больше не работает. Хитрость наследования отelement_blank сделать кастомный гробтеперь явно отключен, Я думаю, что урок заключается в том, чтобы признать, что некоторые вещи не могут быть сделаны в ggplot2,по дизайнуи не тратьте слишком много энергии на обходные пути, которые в будущем могут сломаться.

Оригинальный ответ

Вы можете попробовать создать подходящий кастомelement разместить в настройках темы. Дизайн темы не делает его очень простым, к сожалению,

require(ggplot2)
require(gridExtra) # tableGrob

element_grob.element_custom <- function(element, label="", ...)  {

  mytheme <- ttheme_minimal(core = list(fg_params = list(parse=TRUE)))
  disect <- strsplit(label, "\\n")[[1]]

  g1 <- tableGrob(as.matrix(disect), theme=mytheme)
  # wrapping into a gTree only because grobHeight.gtable would be too tight
  # cf. absolute.units() squashing textGrobs
  gTree(children=gList(g1), height=sum(g1$heights), 
        cl = "custom_strip")
}

# gTrees don't know their size and ggplot would squash it, so give it room
grobHeight.custom_strip = heightDetails.custom_axis = function(x, ...)
  x$height
# silly wrapper to fool ggplot2's inheritance check...
facet_custom <- function(...){
  structure(
    list(...), # this ... information is not used, btw
    class = c("element_custom","element_blank", "element") # inheritance test workaround
  ) 

}


title <- c("First~line \n italic('wait, a second')", 
           "this~is~boring",
           "integral(f(x)*dx, a, b)")

iris2 <- iris
iris2$Species <- factor(iris$Species, labels=title)
ggplot(iris2, aes(Sepal.Length, Sepal.Width)) +
  geom_line() + facet_grid(.~Species) +
  theme(strip.text.x = facet_custom())

8

вам нужно форматирование, описанное вplotmath (а затем для того, чтобы это было проанализировано как выражение). Тем не менееplotmath синтаксис не имеет операции разрыва строки. Вы можете получить что-то похожее сatop, хоть. В вашем примере вы можете установить метки

levels(length_subject$CONSTRUCTION) <- 
  c("atop(textstyle('THAT'),textstyle('Extraposed'))", 
    "atop(textstyle('THAT'),textstyle('Post-predicate'))",
    "atop(atop(textstyle('TO'),textstyle('Extraposed')),italic('for')*textstyle('-subject'))",
    "atop(atop(textstyle('TO'),textstyle('Post-predicate')),italic('for')*textstyle('-subject'))",
    "atop(atop(textstyle('THAT'),textstyle('Extraposed')),italic('that')*textstyle('-omission'))",
    "atop(atop(textstyle('THAT'),textstyle('Post-predicate')),italic('that')*textstyle('-omission'))")

а затем добавивlabeller=label_parsed кfacet_grid вызов

ggplot( length_subject, aes( x = SUBJECT ) ) +
  geom_histogram(binwidth=.6, colour="black", fill="grey") +
  ylab("Frequency") +  
  xlab("Subject length") +  
  scale_x_discrete(breaks=c(2,4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30)) + #
  facet_grid( SUBJECT_TYPE~CONSTRUCTION, scales="free_x", space="free", 
              labeller=label_parsed) +
  theme(strip.text.x = element_text(size = 8)) 

дает

Это'не идеально (интервал между строками не одинаковый, и расхождение будет только ухудшаться, если будет больше линий), но это единственный способмы нашли объединение двух (новые строки в выражениях plotmath).

Спасибо. Было бы неплохо найти способ исправить расстояние. user1504579
0

как исправить расстояние, я нашел решение. Добавить строку сatop(scriptscriptstyle("") перед последней строкой из 3 строк (делая это 4) или любые последующие строки и незабыть добавить) впоследствии

Похожие вопросы