在RI中,要通过添加图例正下方(在图的右侧,而图例保持在右侧)的文本,来创建一个接收ggplot对象和一些文本并返回并返回ggplot对象的函数。
myplot = ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, color=Species)) +
geom_line()
Run Code Online (Sandbox Code Playgroud)
我想在图例之后添加文本“ Sepal.Width的平均值= 3.05”(及其周围的方框)。我看了相关的问题,但它们将图例的位置更改为底部,因此无法作为函数工作,而是打印出图。
几种可能性。
第一个使用annotate(), 并涉及通过反复试验来定位文本。x 位置使用 调整hjust,y 位置选择为略低于图例。注意:文本周围没有边框。
第二个假设需要边界。组合的文本和框是使用grid. 然后使用 定位grob annotation_custom()。ymin并ymax设置为略低于图例。xmin并xmax通过反复试验设置以使文本和图例对齐。
这两种方法都涉及在绘图面板外绘图,因此需要关闭对绘图面板的剪辑。但如果文字大小或长度发生变化,则需要调整标签的位置。
第三种方法对文本长度和大小的更改相当稳健。与方法 2 类似,组合文本和框 grob 是使用 构造的grid。然后,使用gtable函数,grob 附加到图例(图例的中间列)。
# 1.
library(ggplot2)
library(grid)
library(gtable)
# The label
label = "Mean of Sepal.Width = 3.05"
# The plot - Note the extra margin space for the label
myplot = ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, color=Species)) +
geom_line() +
annotate("text", x = Inf, y = 2.9, label = label, hjust = -0.08, size = 3) +
theme(plot.margin = unit(c(.5,6,.5,.5),"lines"),
legend.background = element_rect(colour = "black"))
# Turn off clipping to the plot panel
g = ggplotGrob(myplot)
g$layout$clip[g$layout$name == "panel"] = "off"
grid.draw(g)
# 2.
# Construct the label grob - a combination of text and box
textgrob = textGrob(label, gp = gpar(cex = .75), )
width = unit(1, "grobwidth",textgrob) + unit(10, "points")
height = unit(1, "grobheight", textgrob)+ unit(10, "points")
rectgrob = rectGrob(gp=gpar(colour = "black", fill = NA), height = height, width = width)
labelGrob = gTree("labelGrob", children = gList(rectgrob, textgrob))
# The plot - Note the extra margin space for the label
myplot = ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, color=Species)) +
geom_line() +
annotation_custom(labelGrob,
xmin = 1.137*max(iris$Sepal.Length), xmax = 1.137*max(iris$Sepal.Length),
ymin = 2.9, ymax = 2.9) +
theme(plot.margin = unit(c(0.5, 6, 0.5, 0.5), "lines"),
legend.background = element_rect(colour = "black"))
# Turn off clipping to the plot panel
g = ggplotGrob(myplot)
g$layout$clip[g$layout$name == "panel"] = "off"
grid.draw(g)
#3.
# The label
label = "Mean of\nSepal.Width = 3.05"
# Try a different label
# label = "a"
# The plot
myplot = ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, color=Species)) +
geom_line() +
theme(legend.background = element_rect(colour = "black"))
# Get the legend
g = ggplotGrob(myplot)
leg = g$grobs[[which(g$layout$name == "guide-box")]]
# Construct the label grob
xpos = 5
textgrob = textGrob(x = unit(xpos, "points"), label, gp = gpar(cex = .75), just = "left")
width = unit(1, "grobwidth",textgrob) + unit(2*xpos, "points") # twice the x position
height = unit(1, "grobheight", textgrob)+ unit(2*xpos, "points")
rectgrob = rectGrob(x = unit(0, "points"), just = "left",
gp = gpar(colour = "black", fill = NA), height = height, width = width)
labelGrob = gTree("labelGrob", children = gList(rectgrob, textgrob))
# Add the label grob to a new row added to the legend
pos = subset(leg$layout, grepl("guides", name), t:r)
leg = gtable_add_rows(leg, height, pos = pos$t+1)
leg = gtable_add_grob(leg, labelGrob, t = pos$t+2, l = pos$l)
# Adjust the middle width of the legend to be the maximum of the original width
# or the width of the grob
leg$widths[pos$l] = max(width, leg$widths[pos$l])
# Add some space between the two parts of the legend
leg$heights[pos$t+1] = unit(5, "pt")
# Return the modified legend to the origial plot
g$grobs[[which(g$layout$name == "guide-box")]] = leg
# Adjust the width of the column containing the legend to be the maximum
# of the original width or the width of the label
g$widths[g$layout[grepl("guide-box", g$layout$name), "l"]] = max(width, sum(leg$widths))
# Draw the plot
grid.newpage()
grid.draw(g)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3116 次 |
| 最近记录: |