ggplot2 绘图中关于图例的一些 Tips

ggplot2 绘图中关于图例的一些 Tips

昨天群里有个小伙伴在群里问了个关于 ggplot2 添加图例的问题,所以我今天就帮他解决下!

案例引入

我们还是从案例入手,下面的案例中我使用的 2020 年 3 月 22 日世界各国的新冠肺炎确诊病例数量的数据。首先我们读取并整理这份数据:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

df 是这样的:

1
2
# install.packages('reactable')
reactable::reactable(df)

2020 年 3 月 22 日世界各国的新冠肺炎总确诊病例数为:

1
2
3
4
current_total <- subset(df, date == "2020-03-22") %>% 
pull(confirmed) %>%
sum()
current_total

接下来绘制一幅折线图展示各国的增长趋势:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

下面我们进入今天的正题,为了方便,我仅仅选择截止 3 月 22 日确诊人数最多的是个国家,这里可以用 top_n 函数:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

这个图例其实是由三个映射生成的,因为我把 color = country 放在了 ggplot() 里面,所以这个参数会传递给下面的三个图层,最后这三个映射复合在一起才形成了这样的图例。

下面我们看一下如果我们把 color 映射为 confirmed:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

注意到这个时候这个图看起来就不太对了,这是因为我们把 confirmed 映射为 color 的时候 confirmed 变量也会自动被作为分组变量,所以这个时候我们还需要指定分组变量为 country: group = country

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

可以看到,这个时候的图例是连续的渐变色柱条(colorbar),我们还可以通过下面的设置把渐变色柱条变成分组着色的柱条(colorsteps):

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

这样的比较好看,最近我比较喜欢使用这种图例。guide_colorsteps() 提供了丰富的方法进行图例样式设计,例如图例的高度:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

再例如把图例的方向反过来:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

更多设置可以查看帮助文档:

1
?guide_colorsteps()

当然如果你想设置 colorbar() 可以查看 colorbar() 的帮助文档:

1
?guide_colorbar()

例如:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

这位小伙伴遇到的问题

大家注意到上面的图表的图例都是通过指定一个映射生成的,那么有时候我们会遇到下面的情况,我们先构造一个数据框:

1
2
3
4
df %>% 
dplyr::filter(country %in% country_list[1:2]) %>%
spread(key = "country", value = "confirmed") -> df_wide
df_wide

这种数据是宽型数据,我们也可以直接用 df_wide 绘图:

1
2
3
4
5
ggplot(df_wide, aes(x = date)) + 
geom_line(aes(y = China), color = "#E31A1C") +
geom_point(aes(y = China), color = "#E31A1C") +
geom_line(aes(y = Italy), color = "#18BC9C") +
geom_point(aes(y = Italy), color = "#18BC9C")

大家注意到这个时候就没有图例了,因为我们是单独把两个序列绘制出来的,当然想要图例的一个方法就是把宽型数据转换成长型数据(像上面的一样),不过其实也可以这样:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

看,图例是不是出来了!

或者把宽形数据转换成长形数据即可:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

这和上面的结果就是一样的了!大家在实际使用中可以根据自己的需要选择方法。

知识星球附件链接:https://t.zsxq.com/7iEM7Mr

#

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×