【问题标题】:Custom legend with ggplot带有ggplot的自定义图例
【发布时间】: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) 

现在我想在这个情节中制作一个自定义图例。此图例仅将yLowyUp 之间区域的信息显示为一个填充有蓝色(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 图例是通过aescolfillalpha 或其他参数创建的。自定义图例需要深入了解 grobs 的工作原理,不推荐使用。取而代之的是有一列指示它们与哪个组(例如区域)和线型相关联,并通过各种 scale* 函数进行自定义。
  • 好的。那么如何使用这些信息手动创建某种静态矩形,以便在我保存具有不同高度、宽度信息等的绘图时能够管理正确的纵横比等?这会有效吗?
  • 我建议使用 gridbookdown.org/rdpeng/RProgDA/the-grid-package.html 在我(仍然非常有限)的经验中使用 ggplot 处理图例可能是一场噩梦,将 ggplot 对象转换为 grob 会给你很多额外的控制

标签: r ggplot2


【解决方案1】:

一种解决方案是:

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"))

【讨论】:

  • 谢谢。是否可以在顶部中心位置移动图表区域内的图例并水平放置?
  • 您可以通过在图中添加以下行来做到这一点:theme(legend.box = "horizontal", legend.background = element_rect(fill="transparent"), legend.position = c(0.5,0.98))。图例位置对应于图中的 x 和 y 坐标(从 0 到 1)。
  • @bird 当我在数据中有两个变量时,即Pt1Pt2,我得到错误。我已经用这个发现修改了我的问题。我很少有这样的变量可以绘制为点。有什么解决办法吗?
  • @BrianSmith 问题是您不能分别拥有 2 个相同的 geom_colorscale_color_manual("",values = c("My point"="blue", "My point2"="red")) 应该可以解决问题。
猜你喜欢
  • 2014-08-26
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2020-07-28
  • 2018-09-15
  • 2022-01-09
相关资源
最近更新 更多