为什么不让我在R中的ggplot2上的图形中添加图例?

时间:2018-12-12 16:44:57

标签: r ggplot2 legend

我想为此添加一个图例,但正在努力寻找方法。有人可以帮忙吗?

  df1 <- data.frame(Rate=rnorm(10, 500, 100), Damage=rnorm(10, 50, 15))
  x1 <- data.frame(R=rnorm(20, 550, 50), V=rnorm(20, 35, 10))

  ggplot(df1,aes(x=Rate,y=Damage)) +
  geom_smooth(method="auto",se=FALSE) +
  geom_smooth(data=x1, mapping=aes(x=R, y=V), 
  method="auto",col="firebrick",se=FALSE) +
  coord_cartesian(xlim=c(0,1000), ylim=c(0, 100)) +
  ggtitle("", subtitle="PPS post-emergence") +
  theme_bw() +
  scale_y_continuous(breaks=seq(0, 100, 20),) +
  xlab("Rate (mg/Ha)") +
  ylab("")

2 个答案:

答案 0 :(得分:2)

执行所需操作的最简单方法是合并数据。但是您也可以进行手动颜色映射。我会在下面给大家展示。

不合并数据

您要创建手动色标。诀窍是在aes中传递颜色,然后添加scale_color_manual以将名称映射到颜色。

ggplot(df1,aes(x=Rate,y=Damage)) +
  geom_smooth(aes(col = "val1"), method="auto",se=FALSE) +
  geom_smooth(data=x1, mapping=aes(x=R, y=V, col="val2"), 
              method="auto",se=FALSE) +
  coord_cartesian(xlim=c(0,1000), ylim=c(0, 100)) +
  ggtitle("", subtitle="PPS post-emergence") +
  theme_bw() +
  scale_y_continuous(breaks=seq(0, 100, 20),) +
  xlab("Rate (mg/Ha)") +
  ylab("") +
  scale_color_manual("My legend", values=c("val1" = "firebrick", 
                                           "val2" = "steelblue"))

Plot with legend

通过练习减少行数

通过一种简单的方法,可以使用labs设置标题(或字幕)和轴标签。您不必传递标题,从而获得一些垂直空间并传递NULL(而不是""),因为y标签实际上将其删除而获得了一些水平空间。

下面,图片大小相同,但是图形占据了很大一部分。

ggplot(df1,aes(x=Rate,y=Damage)) +
  geom_smooth(aes(col = "val1"), method="auto",se=FALSE) +
  geom_smooth(data=x1, mapping=aes(x=R, y=V, col="val2"), 
              method="auto",se=FALSE) +
  coord_cartesian(xlim=c(0,1000), ylim=c(0, 100)) +
  theme_bw() +
  scale_y_continuous(breaks=seq(0, 100, 20),) +
  labs(subtitle="PPS post-emergence", 
       x = "Rate (mg/Ha)",
       y = NULL) +
  scale_color_manual("My legend", values=c("val1" = "firebrick", 
                                           "val2" = "steelblue"))

Plot using labs instead of ggtitle

合并数据

最好的方法实际上是在跟踪源的同时合并数据,然后使用source作为颜色。更清洁,但并非总是可行。

df <- bind_rows(
  mutate(df1, source="df1"),
  x1 %>% rename(Rate = R, Damage = V) %>%
    mutate(source="x1")
)

ggplot(df, aes(x=Rate, y=Damage, col=source)) +
  geom_smooth(method="auto", se=FALSE) +
  coord_cartesian(xlim=c(0,1000), ylim=c(0, 100)) +
  theme_bw() +
  scale_y_continuous(breaks=seq(0, 100, 20),) +
  labs(subtitle="PPS post-emergence", 
       x = "Rate (mg/Ha)",
       y = NULL)

enter image description here

答案 1 :(得分:0)

我们可以行绑定然后绘图:

.top_section {
  display: flex;
  height: 10%;
  background-color: #8ac858;
}

enter image description here