ggplot2:Counts Plot(计数图)
前几天发现一个非常有意思的数据可视化小例子https://github.com/nanli-7/basketball_data_visualization,自带数据和代码,非常好的学习材料,自己重复了其中绝大部分内容,但是最后一幅非常漂亮的图没有找到对应的代码,自己也没有思路应该如何入手;今天刷知乎的时候发现了一篇文章 深度好文 |Matplotlib 可视化最有价值的 50 个图表(附完整 Python 源代码), 发现里面有一张图和自己没能画出来的非常像,才知道这类图叫计数图(Counts plot),但是印象里ggplot2好像没有现成的函数来做这个事情,在不知如何下手之际突然想到之前看过一篇文章Top 50 ggplot2 Visualizations - The Master List (With Full R Code), 应该会有对应的内容,果不其然,发现了 ggplot2 包中的 geom_count() 函数,以下内容记录自己重复计数图的代码
绘制散点图的时候如果数据较多会出现散点重叠的情况,这样图中展示的数据看起来会比实际数据显得少一些(The original data has 234 data points but the chart seems to display fewer points. This is because there are many overlaping points appearing as a single dot.)。那么如何解决这个问题呢?(So how to handle this?)其中一种解决办法是用 jitter plot (这个jitter自己也不知道如何翻译)来代替 Scatter plot(散点图)ggplot2 对应的函数为 geom_jitter(),他可以让重叠的点随机分布在原始位置的周围,width参数(argument)控制的应该是点距离原始位置的距离,通过两幅图片可以非常直观的看出差别
上图使用的数据为R语言自带的数据包 mpg
代码
library(ggplot2)
library(ggpubr)
p1<-ggplot(mpg,aes(cty,hwy))+
geom_point()+theme_bw()+
labs(title="Scatterplot with overlapping points",
caption = "Author: Mingyan")
p2<-ggplot(mpg,aes(cty,hwy))+
geom_jitter(width=0.5,size=1)+
theme_bw()+labs(title="Jittered Points",caption="Author: Mingyan")
ggarrange(p1,p2,ncol=2,labels=LETTERS[1:2])
另外一种解决办法就是文章开头提到的Counts Plot(计数图),散点重叠的位置只画一个点,用这个点的大小来代表这个位置重叠点的多少(there is more points overlap, the size of the circle gets bigger),如下:
Rplot20.png
代码
ggplot(mpg,aes(cty,hwy))+
geom_count(color="tomato3",show.legend = F)+theme_bw()+
labs(title="Counts Plot",caption="Author: MingYan")
接下来重复开头提到的数据可视化教程里的图片
Rplot21.png按照以上的思路作图,发现结果和目标相差比较大,才意识到目标图片不是counts plot
目标图片是以惯用手和身高来分组计算击球率的平均值,点的大小反映的是HR的平均值,明白了目标图片传达的含义,那么作图也有了思路:
整理数据
library(dplyr)
df<-read.csv("../Desktop/data_analysis_practice/basketball_data_visualization-master/baseball_data.csv",header=T)
colnames(df)
df1<-df%>%
group_by(handedness,height)%>%
summarise(avg=mean(avg),n=n(),hr=mean(HR))
绘图
ggplot(df1,aes(height,avg,color=handedness,size=hr))+
geom_point(alpha=0.8)+theme_bw()+
scale_color_manual(values=c("red","blue","darkgreen"))+
labs(x="Players' Height (inches)",
y= "Average of Players' Batting Performance (avg)",
title="Baseball Player Performance",
caption="Author:MingYan")+
scale_x_continuous(breaks=df1$height,labels=df1$height)
Rplot22.png
遇到的问题:尝试添加图例时不知道为什么成了下图的样子
Rplot23.png同时还遇到了其他问题
- 有两个图例如果想只删掉其中一个应该如何做?
- aes中size参数控制点的大小,互相之间可能是按比例来的,并非是实际大小,如果想整体放大应该怎么做?突然想到scale_size是否可以,尝试了一下遇到点小问题,有时间再来探讨