在ggplot中覆盖来自不同数据帧的图而不会弄乱图例

时间:2019-02-15 16:05:18

标签: r dataframe ggplot2 legend

我想覆盖两个图:一个是简单的点图,其中使用变量来控制点的大小;另一个是一条简单的曲线。

这是第一个情节的虚拟示例;

library(ggplot2)
x <- seq(from = 1, to = 10, by = 1)
df = data.frame(x=x, y=x^2, v=2*x)
ggplot(df, aes(x, y, size = v)) + geom_point() + theme_classic() + scale_size("blabla")

enter image description here

现在,我们可以使用来自另一个数据框的数据将此曲线叠加到该图上:

df2 = data.frame(x=x, y=x^2-x+2)
ggplot(df, aes(x, y, size = v)) + geom_point() + theme_classic() + scale_size("blabla") + geom_line(data=df2, aes(x, y), color = "blue") + scale_color_discrete(name = "other", labels = c("nanana"))

它产生错误:

  

FUN(X [[i]],...)中的错误:找不到对象'v'

v中的值不用于绘制预期的诅咒,但是无论如何,我在df2中添加了一个虚拟v。

df2 = data.frame(x=x, y=x^2-x+2, v=replicate(length(x),0))  # add a dummy v
ggplot(df, aes(x, y, size = v)) + geom_point() + theme_classic() + scale_size("blabla") + geom_line(data=df2, aes(x, y), color = "blue") + scale_color_discrete(name = "other", labels = c("nanana"))

结果有一个混乱的图例:

enter image description here

获得理想情节的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以在geom_point()调用中添加大小aes来使其不使用df2中的虚拟v。

不确定有关图例的确切要求。如果更换以上部件,则蓝色部分消失。如果要为线条颜色添加图例,则必须在geom_line aes调用中放置颜色。

x <- seq(from = 1, to = 10, by = 1)
df = data.frame(x=x, y=x^2, v=2*x)
df2 = data.frame(x=x, y=x^2-x+2)

ggplot(df, aes(x, y)) + 
  geom_point(aes(size = v)) + 
  theme_classic() + 
  scale_size("blabla") + 
  geom_line(data=df2, aes(x, y, color = "blue")) +
  scale_color_manual(values = "blue", labels = "nanana", name = "other")

enter image description here