【发布时间】:2021-08-14 16:07:05
【问题描述】:
假设我有下面使用ggplot2 包的情节
library(ggplot2)
Data = data.frame('Date' = as.Date("2028-01-01") + 1:7,
'y' = c(0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0),
'yLow' = c(0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0) - 2.2,
'yUp' = c(0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0) + 2.2,
'Pt1' = c(-1, 1.0, NA, NA, 4.0, 5.0, NA) + 3.2,
'Pt2' = c(NA, 1.0, 2, NA, 4.0, 5.0, NA) + 4.2)
Data
ggplot(Data, aes(x = Date, y = y)) +
geom_line(size = 1, alpha = 0.8) +
geom_ribbon(aes(ymin = yLow, ymax = yUp), fill = "blue", alpha = 0.2) +
geom_point(aes(x = Date, y = Pt1), color = "blue", shape = 23)
现在我想在这个情节中制作一个自定义图例。此图例仅将yLow 和yUp 之间区域的信息显示为一个填充有蓝色(alpha 0.2) 的矩形,并将y 的信息显示为line 和 Pt1 的信息作为 形状为 23 的点
这里是一个例子,我想如何拥有图例-
我也想把图例放在绘图区。
有什么办法可以做到吗?
任何指针都将受到高度赞赏。
谢谢,
根据@bird 的回答编辑
只要我只有一个变量被绘制为点,即Pt1,答案就有效。但是如果我添加另一个类似的变量Pt2,我会得到错误:
ggplot(Data, aes(x = Date, y = y)) +
geom_line(size = 1, alpha = 0.8, aes(linetype = "My line")) +
geom_ribbon(aes(ymin = yLow, ymax = yUp, fill = "My area"), alpha = 0.2) +
geom_point(aes(x = Date, y = Pt1, col = "My point"), shape = 23) +
scale_color_manual("",values = c("My point"="blue")) +
scale_fill_manual("",values = c("My area"="blue")) +
scale_linetype_manual("", values = c("My line"="solid")) +
geom_point(aes(x = Date, y = Pt2, col = "My point2"), shape = 23) +
scale_color_manual("",values = c("My point2"="red"))
这给出了错误
Scale for 'colour' is already present. Adding another scale for 'colour',
which will replace the existing scale.
Error: Insufficient values in manual scale. 2 needed but only 1 provided.
我很少有这样的变量可以绘制为点。有什么办法可以解决这个问题吗?
【问题讨论】:
-
例如,在功能区中,您可以在 aes 中使用您希望在图例中显示的名称添加填充美学(例如,
aes(ymin = yLow, ymax = yUp, fill="area")),然后使用 scale_fill_manual 对其进行自定义(例如,@ 987654335@)。任何美学都可以这样做 -
ggplot 图例是通过
aes、col、fill、alpha或其他参数创建的。自定义图例需要深入了解 grobs 的工作原理,不推荐使用。取而代之的是有一列指示它们与哪个组(例如区域)和线型相关联,并通过各种scale*函数进行自定义。 -
好的。那么如何使用这些信息手动创建某种静态矩形,以便在我保存具有不同高度、宽度信息等的绘图时能够管理正确的纵横比等?这会有效吗?
-
我建议使用
grid库 bookdown.org/rdpeng/RProgDA/the-grid-package.html 在我(仍然非常有限)的经验中使用 ggplot 处理图例可能是一场噩梦,将 ggplot 对象转换为 grob 会给你很多额外的控制