前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ggplot2:计数图(Counts Plot)

ggplot2:计数图(Counts Plot)

作者头像
用户7010445
发布2020-03-03 14:05:19
1.4K0
发布2020-03-03 14:05:19
举报

前几天发现一个非常有意思的数据可视化小例子https://github.com/nanli-7/basketballdatavisualization,自带数据和代码,非常好的学习材料,自己重复了其中绝大部分内容,但是最后一幅非常漂亮的图没有找到对应的代码,自己也没有思路应该如何入手;今天刷知乎的时候发现了一篇文章 深度好文 |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)控制的应该是点距离原始位置的距离,通过两幅图片可以非常直观的看出差别

同样的数据集,图B看起来数据就多出来许多

代码

代码语言:javascript
复制
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])

上图使用的数据为R语言自带的数据包 mpg

另外一种解决办法就是文章开头提到的Counts Plot(计数图),散点重叠的位置只画一个点,用这个点的大小来代表这个位置重叠点的多少(there is more points overlap, the size of the circle gets bigger),如下:

代码

代码语言:javascript
复制
ggplot(mpg,aes(cty,hwy))+
  geom_count(color="tomato3",show.legend = F)+theme_bw()+
  labs(title="Counts Plot",caption="Author: MingYan")
接下来重复开头提到的数据可视化教程里的图片

代码

代码语言:javascript
复制
df<-read.csv("../Desktop/data_analysis_practice/basketball_data_visualization-master/baseball_data.csv",header=T)

按照以上的思路作图,发现结果和目标相差比较大,才意识到目标图片不是counts plot 目标图片是以惯用手和身高来分组计算击球率的平均值,点的大小反映的是HR的平均值,明白了目标图片传达的含义,那么作图也有了思路:

整理数据

代码语言:javascript
复制
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))

绘图

代码语言:javascript
复制
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)

尝试着添加标签时遇到了问题暂时还不知道如何解决

同时还遇到了其他问题

  • 有两个图例如果想只删掉其中一个应该如何做?
  • aes中size参数控制点的大小,互相之间可能是按比例来的,并非是实际大小,如果想整体放大应该怎么做?突然想到scale_size是否可以,尝试了一下遇到点小问题,有时间再来探讨
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小明的数据分析笔记本 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码
  • 代码
  • 代码
  • 整理数据
  • 绘图
  • 同时还遇到了其他问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档