我在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()中的绘图边距theme(plot.margin = unit(c(2, 2, 2, 2), "cm")
然而,这没有帮助。
另外,我尝试了以下内容:
plot.title = element_text(size = 85,colour="black", vjust = -2)
这似乎调整了所有标题的位置,而不是分别调整副标题和标题。
另外,我在theme()中找不到任何命令,比如plot.subtitle来安排它的位置。它似乎不存在。
感谢任何帮助代码或相关链接。感谢。
答案 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.
如果您想要更多控制,还有另一种选择:只使用ggtitle
将标题或副标题放在图表上方,并使用annotate
作为另一个选项。 (请考虑作为下周的家庭作业;-))
答案 1 :(得分:0)
你可以使用这个技巧
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()))