ggplot2:計數圖(Counts Plot)
- 2020 年 3 月 3 日
- 筆記
前幾天發現一個非常有意思的數據可視化小例子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看起來數據就多出來許多
代碼
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),如下:

代碼
ggplot(mpg,aes(cty,hwy))+ geom_count(color="tomato3",show.legend = F)+theme_bw()+ labs(title="Counts Plot",caption="Author: MingYan")
接下來重複開頭提到的數據可視化教程里的圖片

代碼
df<-read.csv("../Desktop/data_analysis_practice/basketball_data_visualization-master/baseball_data.csv",header=T)
按照以上的思路作圖,發現結果和目標相差比較大,才意識到目標圖片不是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)

嘗試着添加標籤時遇到了問題暫時還不知道如何解決

同時還遇到了其他問題
- 有兩個圖例如果想只刪掉其中一個應該如何做?
- aes中size參數控制點的大小,互相之間可能是按比例來的,並非是實際大小,如果想整體放大應該怎麼做?突然想到scale_size是否可以,嘗試了一下遇到點小問題,有時間再來探討