如何从头开始创建一个 ggplot2 图表中不在 aes 中的图例?

5

继续我的问题:使用ggplot2进行变量行大小的绘制

我可以使用这些代码创建一个图形。

x <- 1:100
y <- x * x 
z <- abs(cos(x * pi / (max(x))))

df <- data.frame(x = x, y = y, z = z)
library(ggplot2)


mult <- 200
ggplot(df, aes(x, y)) + geom_line() + geom_ribbon(aes(ymin=y-mult*z, ymax=y+mult*z))

但是我现在的问题是如何创建一个图例来反映线条的大小。例如,这个图中的图例:

    ggplot(df, aes(x, y, size = z)) + geom_line()

有没有办法从头开始创建一个不在 aes 中的图例?

感谢任何建议。


1
这是一份关于如何在aes()之外添加额外图例的好指南:https://dev59.com/iGQo5IYBdhLWcg3wBLco - tonytonov
谢谢您的评论。对我来说非常有帮助。我刚刚创建了一个不可见的图层来创建图例。 - Bangyou
1个回答

5
您可以将第二个图的图例添加到第一个图中。

enter image description here

p1 <- ggplot(df, aes(x, y)) + geom_line() + geom_ribbon(aes(ymin=y-mult*z, ymax=y+mult*z))

p2 <- ggplot(df, aes(x, y, size = z)) + geom_line()

g_legend <- function(a.gplot){
  tmp <- ggplot_gtable(ggplot_build(a.gplot))
  leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
  legend <- tmp$grobs[[leg]]
  return(legend)
}
legend <- g_legend(p2)
library(gridExtra)
pp <- arrangeGrob(p1 ,legend,
                  widths=c(5/4, 1/4),
                   ncol = 2)

感谢您的评论。这是我问题的另一个解决方案。 - Bangyou
哪个是?其他人可能对这个其他解决方案感兴趣。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接