一圖勝千言:用好圖表,好好說話

一圖勝千言:用好圖表,好好說話

作者:herain R語言中文社區專欄作者

知乎ID:https://www.zhihu.com/people/herain-14

前言

從數據需求的角度選擇恰當的圖表,更好的以圖的形式彰顯數據的潛在性,規律性,價值性,數據的描述性分析包括用圖表展示數據和用統計量描述數據等內容。避免使用圖表上的誤區,區分扇形圖與餅圖(很多人都把餅圖當作扇形圖),不要用時間年份做橫軸的條形圖(真的很傻),本文將常有的圖表根據恰當的用途歸位五大類,同時提供R繪圖方法。

五大類

  1. 展示【類別頻數】的圖表:簡單的條形圖, 帕累託圖,複式條形圖和脊形圖,馬賽克圖,餅圖,扇形圖,洛倫茨曲線
  2. 展示【數據分佈】的圖表:直方圖,莖葉圖,箱線圖,小提琴圖,點圖,核密度圖
  3. 展示【數據關係】的圖表:散點圖,矩陣散點圖,氣泡圖
  4. 展示【數據相似性】的圖表:輪廓圖,雷達圖,星圖,臉譜圖
  5. 時間之上【看趨勢】的圖表: 時間序列圖

1.展示類別頻數的圖表

# 單變量頻度表
> data1> summary(data1)
社區性別 態度
A社區:27 男:36 反對:31
B社區:17 女:44 贊成:49
C社區:21
D社區:15
> count1 > prop.table(count1)*100
#二聯列表
> count1 > addmargins(count1)
#多維列聯表
> count1> count1
1.1 簡單的條形圖
> par(mfrow=c(1,3), mai=c(0.7,0.7,0.6,0.1),cex=0.7,cex.main=0.8)
> barplot(count1, xlab="頻數", ylab="社區",horiz=TRUE, main = "(a) 水平條形圖", col=2:5, family='SimSun')
> barplot(count2, xlab="性別", ylab="頻數",col=8:9, main = "(b) 垂直條形圖", family='SimSun')
> barplot(count3, xlab="態度", ylab="頻數",col=2:3, main = "(c) 垂直條形圖", family='SimSun')

一圖勝千言:用好圖表,好好說話


1.2 帕累託圖:
> par(mai=c(0.7,0.7,0.1,0.8),cex=0.7,cex.main=0.8)
> barplot(x, xlab="社區", ylab="頻數", col=2:5, family="SimSun")
> y> par(new=T)
> plot(y, type="b", lwd=1.5, pch=15, axes=F, xlab=' ', ylab=' ', main=' ')
> axis(4)
> par(las=0)
> mtext("累積頻數", side=4, line=3)
> mtext("累積頻數", side=4, line=3, family='SimSun')
> mtext("累積分佈曲線", line=-2.5, cex=0.8, adj=0.75,family='SimSun')
一圖勝千言:用好圖表,好好說話

1.3:複式條形圖和脊形圖

par(mfcol=c(1,2), cex=0.6)
barplot(mytable, xlab="社區", ylab="頻數", ylim=c(0,16),col=c("red", "blue"),legent=rownames(mytable), args.legend=list(x=12), beside=TRUE, main=“(a)社區條形圖”,family=‘SimSun’)
barplot(mytable, xlab="社區", ylab="頻數", ylim=c(0,30),col=c("green", "blue"),legend=rownames(mytable), args.legend=list(x=4.8), main=“(b)社區 堆疊條形圖”,family='SimSun')
一圖勝千言:用好圖表,好好說話

1.4:馬賽克圖

mosaicplot(~性別+社區+態度, data=data1, color=2:3, main="")
一圖勝千言:用好圖表,好好說話

1.5:餅圖

data1> count1> count1
A社區 B社區 C社區 D社區
27172115
> name> name
[1] "A社區" "B社區" "C社區" "D社區"
> precent> label> par(pin=c(3,3),mai=c(0.1,0.4,0.1,0.4), cex=0.8)
> pie(count1,labels=label,init.angle=90)
> pie(count1,labels=label,init.angle=90,family="SimSun")
pie3D(count1,labels=label,explode=0.1,labelcex=0.7,family="SimSun")
一圖勝千言:用好圖表,好好說話

1.6: 扇形圖

fan.plot(count1, labels=label, ticks=200, col=c(4:9))
一圖勝千言:用好圖表,好好說話

1.7: 洛倫茨曲線

example2_10library(DescTools)
plot(Lc(example2_10$組中值, example2_10$人數), xlab="人數比例", ylab="收入比例",col=4,panel.first=grid(10,10,col="gray70"))

2.展示數據分佈的圖表

2.1 :直方圖

example2_2 > par(mfcol=c(2,2), cex=0.7, family='SimSun')
> hist(example2_2$銷售額,xlab="銷售額", ylab="頻數", main="(a)普通")
> hist(example2_2$銷售額,freq=FALSE, breaks=20, xlab="銷售額", ylab="頻率", main="(c)增加軸線須線和密度線")
> curve(dnorm(x,mean(example2_2$銷售額), sd(example2_2$銷售額)), add=T, col="red")
>rug(example2_2$銷售額)
一圖勝千言:用好圖表,好好說話

2.2:莖葉圖

> stem(example2_2$銷售額)
The decimal point is 1 digit(s) to the right of the |
16 | 17
17 | 1222
18 | 1136788
19 | 11234566667889999
20 | 000012333334455566677778899
21 | 00224556666777788889
22 | 0222344445556689
23 | 0334455678889
24 | 0133368
25 | 2234
26 | 15
27 | 2

2.3:箱線圖

boxplot(example2_2$銷售額, col="lightblue", cex.axis=0.5)
一圖勝千言:用好圖表,好好說話

> example2_3 > par(mfcol=c(1,1), cex=0.7, family='SimSun')
> boxplot(example2_3, col="lightblue",xlab="運動員", ylab="射擊環數", cex.lab=0.8, cex.axis=0.6, family="SumSin")
一圖勝千言:用好圖表,好好說話

2.4:小提琴

library(vioplot)
par(cex=0.5)
x1x2x3x4x5x6vioplot(x1,x2,x3,x4,x5,x6, col="lightblue", names=c('亞歷山大.彼得裡夫利','拉爾夫.許曼',
'克里斯蒂安.賴茨','列昂尼德.葉基莫夫','基思.桑德森','羅曼.邦達魯克'))
一圖勝千言:用好圖表,好好說話

2.5:點圖

> example2_3_1 > par(mfcol=c(1,1), cex=0.7, family='SimSun')
> dotchart(example2_3_1$射擊環數, groups=example2_3_1$運動員, xlab="射擊環數", pch=20)
一圖勝千言:用好圖表,好好說話

> par(mfcol=c(1,1), cex=0.7, family='SimSun')
> dotplot(射擊環數~運動員, data=example2_3_1, col="black", pch=9, family='SimSun')
一圖勝千言:用好圖表,好好說話

2.6:核密度圖

> par(cex=0.7, family='SimSun')
> densityplot(~射擊環數|運動員, data=example2_3_1,col="blue",cex=0.5, family='SimSun')
一圖勝千言:用好圖表,好好說話

3.展示數據關係的圖表

3.1:散點圖

> x> y> d> plot(d)
> polygon(d[chull(d),], col='pink', lty=3,lwd=2)
> points(d)
> abline(lm(y~x),lwd=2,col=4)
> abline(v=mean(x),h=mean(y),lty=2,col="gray70")
一圖勝千言:用好圖表,好好說話

3.2:矩陣散點圖

example2_4> par(cex=0.7, family='SimSun')
> plot(example2_4, cex=0.6, gap=0.5, family="SimSun")
一圖勝千言:用好圖表,好好說話

3.3:氣泡圖

> attach(example2_4)
> r> symbols(廣告費用,銷售網點數,circle=r, inches=0.3, fg="white", bg="lightblue",ylab="銷售網點數", xlab=" 廣告費用")
> text(廣告費用,銷售網點數, rownames(example2_4),cex=0.4)
一圖勝千言:用好圖表,好好說話

4.展示數據相似性的圖表

4.1:輪廓圖

> example2_5> par(mai=c(0.7,0.7,0.1,0.1),cex=0.8, family="SimSun")
> matplot(t(example2_5[2:9]),type='b',lty=1:7,col=1:7,xlab="消費項目",ylab="支出金額",pch=1,xaxt='n')
> axis(side=1, at=1:8, labels=c("食品","衣著","居住","家電設備用品及服務","醫療保健", "交通和通信", "教育文化娛樂服務","其他商品和服務"),cex.axis=0.6)
"高收入戶", "最高收入戶"))
> legend(x="topright", legend=c("最低收入戶", "低收入戶","中等偏下戶", "中等收入戶", "中等偏上戶", "高收入戶", "最高收入戶"), lty=1:7, col=1:7, text.width=1, cex=0.7)
一圖勝千言:用好圖表,好好說話

4.2:雷達圖

> library(fmsb)
> radarchart(example2_5[,2:9], axistype=0, seg=4, maxmin=F, vlabels=names(example2_5[,2:9]), pcol=1:7, plwd=1.5)
> legend(x="topright", legend=c("最低收入戶", "低收入戶","中等偏下戶", "中等收入戶", "中等偏上戶", "高收入戶", "最高收入戶"), lty=1:7, col=1:7, text.width=1, cex=0.7)
一圖勝千言:用好圖表,好好說話

4.3:星圖

> mat25 > rownames(mat25)> par(cex=0.7, family='SimSun') 

> stars(mat25, key.loc=c(7,2,5),cex=0.8)
一圖勝千言:用好圖表,好好說話

5.展示數據隨時間變化的圖表

example2_9> par(mai=c(0.7,0.7,0.1,0.1), cex=0.8, family="SimSun")
> plot(example2_9[,2], lwd=1.5, ylim=c(2000,30000), xlab="年份", ylab="居民消費水平",type="n")
> grid(col="gray60")
> points(example2_9[,2], type="o", lwd=1.5, xlab="年份", ylab="居民消費水平")
> lines(example2_9[,3], type="b", lty=2, lwd=1.5, xlab="年份", col="blue")
> legend(x="topleft",legend=c("農村居民消費水平","城鎮居民消費水平"), lty=1:2, col=c(1,4), cex=0.8)
一圖勝千言:用好圖表,好好說話

一圖勝千言:用好圖表,好好說話

往期精彩:


  • R語言圖表排版之一頁多圖
  • 圖表色彩運用原理的全面解析
  • 常用圖表的用法-分佈類
一圖勝千言:用好圖表,好好說話

回覆 爬蟲 爬蟲三大案例實戰

回覆 Python 1小時破冰入門

回覆 數據挖掘 R語言入門及數據挖掘

回覆 人工智能 三個月入門人工智能

回覆 數據分析師 數據分析師成長之路

回覆 機器學習 機器學習的商業應用

回覆 數據科學 數據科學實戰

回覆 常用算法 常用數據挖掘算法


分享到:


相關文章: