R 带有ggplot的自定义图例

R 带有ggplot的自定义图例,r,ggplot2,R,Ggplot2,假设我使用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,

假设我使用
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
的信息显示为直线,将
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.
我很少有这样的变量被绘制为点。有没有办法解决这个问题?

一个解决方案是:

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

例如,在功能区中,您可以使用希望在图例中显示的名称在aes中添加填充美学(例如,
aes(ymin=yLow,ymax=yUp,fill=“area”)
),然后使用scale\u fill\u手册(例如,
scale\u fill\u手册(“图例标题”,values=c(“area”=“blue”))对其进行自定义。
)。通过
aes
、通过
col
fill
alpha
或其他参数,可以为任何美学图形创建相同的图例。自定义图例需要深入了解Grob的工作原理,不推荐使用。而是用一列指示它们与哪个组(例如区域)和线型关联,并通过各种
scale*
函数进行自定义。好的。那么,当我用不同的高度、宽度等信息保存绘图时,如何用这些信息手动创建某种静态矩形,以便它能够管理正确的纵横比等?这会有效吗?我建议使用
网格
库处理带有ggplot的图例在我(仍然非常有限)的经验中可能是一场噩梦,将ggplot对象转换为grob会给您带来很多额外的控制谢谢。是否可以将图例移动到图表区域的顶部中间位置并水平放置?您可以通过向绘图中添加以下行来完成此操作:
主题(legend.box=“水平”,legend.background=element_rect(fill=“transparent”),legend.position=c(0.5,0.98))
。图例位置对应于绘图中的x和y坐标(从0到1)。@bird当数据中有两个变量时,即
Pt1
Pt2
,我得到错误。我用这个发现修改了我的问题。我很少有这样的变量被绘制为点。有什么解决办法吗?@briemissh问题是你不能分别拥有两个相同的
geom\u颜色<代码>缩放颜色手册(“,值=c(“我的点”=“蓝色”,“我的点2”=“红色”))
应该可以做到这一点。