ggplot字幕和标题位置 - 重叠标题

时间:2016-02-11 19:52:26

标签: r ggplot2 title overlapping

我在ggplot上创建以下图形,需要在每个图形上注释一些信息作为副标题,图形如下所示: enter image description here 出于标题和字幕的目的,我写了以下代码:

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()中的绘图边距
theme(plot.margin = unit(c(2, 2, 2, 2), "cm")

然而,这没有帮助。

另外,我尝试了以下内容:

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

这似乎调整了所有标题的位置,而不是分别调整副标题和标题。

另外,我在theme()中找不到任何命令,比如plot.subtitle来安排它的位置。它似乎不存在。

感谢任何帮助代码或相关链接。感谢。

2 个答案:

答案 0 :(得分: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作为另一个选项。 (请考虑作为下周的家庭作业;-))

答案 1 :(得分: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()))