2016-02-11 7 views
1

Я создаю следующий график на ggplot и нужно аннотировать некоторую информацию на каждом графике в качестве подзаголовка, график выглядит следующим образом: enter image description here Для названия и целей субтитров, я написал следующий код :ggplot субтитры и название позиция - перекрывая названия

plot.title <- "Link A" 
Common <- paste("Percentage:", "10%", sep=" ") 
Average <- paste("Average:", "83", sep= " ") 
plot.subtitle <- paste(Common, AverageSearchSpace, sep="\n") 

и добавить в ggplot как:

ggtitle(bquote(atop(.(plot.title), atop(.(plot.subtitle), "")))) 

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

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

theme(plot.margin = unit(c(2, 2, 2, 2), "cm") 

Однако это не помогло.

Кроме того, я попытался следующие:

plot.title = element_text(size = 85,colour="black", vjust = -2) 

Это, кажется, чтобы настроить все позиции заголовка, а не субтитров и заголовка отдельно.

Кроме того, я не мог найти команду в теме(), такую ​​как plot.subtitle, чтобы расположить ее позицию. Кажется, этого не существует.

Подсказка Любая часть кода помощи или связанная ссылка оценивается. Благодарю.

+1

вы не представляете воспроизводимый пример, так что это трудно помочь; это может помочь, также недавно спросил http://stackoverflow.com/questions/35367095/multi-line-ggplot-title-with-different-font-size-face-etc?noredirect1_comment58440550_35367095 – MLavoie

+0

Большое спасибо. Я ищу его, но никогда не думал о написании многострочной строки в поиске. Я искал несколько заголовков субтитров и т. Д. Не мог найти этого. Спасибо за ваше время. @MLavoie – kukushkin

ответ

2

Положение титров и субтитров автоматически регулируется, однако, это позиционирование явно терпит неудачу, если названия/субтитры имеют более чем одну строку, и если размер относительно велик, как в вашем случае. Таким образом, перекрытие. Самый простой способ справиться с этим - просто добавить дополнительную (пустую) строку в свой заголовок. Поскольку название затем сдвигается вверх, вам нужно отрегулировать поля.

library(ggplot2) 
library(grid) 
#first some toy data, next time please provide some yourself! 
data <- data.frame(x=5*rep(1:100,each=5),type=rep(c("BM1","BM2","BM3","NB1","NB2"),20),y=10*(2+rnorm(500))) 

plot.title <- "Link A\n" # added an extra line here 
Common <- paste("Percentage:", "10%", sep=" ") 
Average <- paste("Average:", "83", sep= " ") 
plot.subtitle <- paste(Common, Average, sep="\n") 
plot.tottitle <- paste(plot.title,Common, Average, sep="\n") 

ggplot(data,aes(x=x,y=y,color=type))+ 
    geom_line() + ggtitle(bquote(atop(.(plot.title), atop(.(plot.subtitle), "")))) + 
    theme(plot.title = element_text(size = 50,colour="black", vjust = 0)) + 
    theme(plot.margin = unit(c(2, 0, 0, 0), "cm")) #margin adjusted because title moves off plot. 

Результирующая картина: enter image description here

Существует еще один вариант, если вы хотите большего контроля: поставить только заголовок или подзаголовок над сюжетом с ggtitle и использовать annotate для другого. (пожалуйста, подумайте, что в качестве домашней работы на следующей неделе ;-))

+0

Большое спасибо за ваш ответ. Я использовал аннотацию в начале. Однако я явно не смог этого. Я попробую еще раз с аннотацией, чтобы лучше учиться. Замечательный ответ, еще раз спасибо! @RHA – kukushkin

0

Вы можете использовать этот трюк

enter image description here

require(ggplot2) 
require(gridExtra) # tableGrob 

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

    mytheme <- ttheme_minimal(colhead = list(fg_params = list(parse=TRUE, fontsize = 16)), 
          core = list(fg_params = list(parse=TRUE))) 
    disect <- strsplit(label, "\\n")[[1]] 
    m <- as.matrix(disect[-1]) 
    g1 <- tableGrob(m, cols = disect[1], 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 = "element_custom") 
} 

# gTrees don't know their size 
grobHeight.element_custom = heightDetails.element_custom = function(x, ...) 
    x$height 
# silly wrapper to fool ggplot2's inheritance check... 
element_custom <- function() { 
    structure(list(), class = c("element_custom", "element_text")) 
} 

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


ggplot(iris, aes(Sepal.Length, Sepal.Width)) + 
    geom_line() + ggtitle(title) + 
    (theme_grey() %+replace% theme(plot.title = element_custom())) 
+0

благодарит за ваш комментарий и направляет меня на другую ссылку, которую я не смог найти. Понятно, что. – kukushkin