lecture
website icon
統計繪圖
簡介 直方圖 密度圖 長條圖 折線圖 圓餅圖 散布圖 箱型圖 雷達圖 動畫
×
website icon 資料管理 統計分析 相關資源 巨人肩膀 語法索引 關於作者

簡介

本部分介紹直方圖,使用到的指令包含:

Facebook Icon Twitter Icon LinkedIn Icon LINE Icon

直方圖常被用來檢視資料分布的情況,適用於變數屬於連續變數的情況。hist()是R基本的直方圖指令,ggplot2裡的直方圖指令是geom_histogram()。因為是計算次數或機率,所以只需要在指令中輸入一個變數。

直方圖

hist()繪製直方圖時,R會自動判斷資料的切點。breaks參數可自行設定資料切點。

> data<-data.frame(value=rnorm(100))
> hist(data$value, col="aquamarine4", main="Histogram", xlab="Value", ylab="Frequency")
> hist(data$value, breaks=10, col="aquamarine4", main="Histogram", xlab="Value", ylab="Frequency")
R Base 直方圖 R Base直方圖設定分組

ggplot2的geom_histogram()繪製直方圖時,配合fill設定圖型顏色、color設定外框顏色,ggtitle設定標題文字,並指定theme_minimal()繪圖風格。binwidth則是調整資料切點的參數。

> library(ggplot2)
> p<-ggplot(data, aes(x=value))+
+ geom_histogram(fill="aquamarine4", color="grey", alpha=0.9)+
+ theme_minimal()+
+ ggtitle("ggplot Histogram")
> p
> p+geom_histogram(binwidth=1, fill="aquamarine4", color="grey")
ggplot2直方圖 ggplot2直方圖設定分組

群組直方圖

有時我們需要比較2個以上群組的次數分配,這時候將兩個群組以上的直方圖畫在一起是個好方法。R Base可以用par(mfrow())來分割畫面。

> gender<-c(rep("Male",times=100), rep("Female", times=100))
> score<-c(rnorm(100, mean=0, sd=1), rnorm(100, mean=3, sd=2))
> data<-data.frame(gender, score)
> library(dplyr)
> Female<-filter(data, gender=="Female")
> Male<-filter(data, gender=="Male")
> par(mfrow=c(1,2))
> hist(Female$score, col="aquamarine4", main="Female", xlab="score", ylab="count")
> hist(Male$score, col="aquamarine3", main="Male", xlab="score", ylab="count")

ggplot2則是用facet_wrap()。

> gender<-c(rep("Male",times=100), rep("Female", times=100))
> score<-c(rnorm(100, mean=0, sd=1), rnorm(100, mean=3, sd=2))
> data<-data.frame(gender, score)
> p<-ggplot(data, aes(x=score, fill=gender))+
+ geom_histogram()+
+ scale_fill_manual(values=c("aquamarine4", "aquamarine3"))+
+ theme_minimal()+
+ theme(legend.position="none")+
+ facet_wrap(~gender)
> p
R Base分割直方圖 ggplot2分割直方圖

疊合密度圖

如果要創造疊圖的視覺效果,在R Base可以透過add=T參數並配合alpha透明度的設定來創造疊圖效果。

> male<-c(rnorm(100, mean=0, sd=1))
> female<-c(rnorm(100, mean=3, sd=2))
> hist(female, breaks=10 ,col=rgb(0.4,0.8,0.67,0.6), xlab="score", ylab="count", main="")
> hist(male, breaks=10, col=rgb(0.27,0.55,0.45,0.6), add=TRUE)
> legend("topright", c("Male", "Female"), bty="n", cex=0.7, fill=c(rgb(0.27,0.55,0.45,0.6),rgb(0.4,0.8,0.67,0.6)))

ggplot2當然也能創造出相同的疊圖效果。

> gender<-c(rep("Male",times=100), rep("Female", times=100))
> score<-c(rnorm(100, mean=0, sd=1), rnorm(100, mean=3, sd=2))
> data<-data.frame(gender, score)
> p<-ggplot(data, aes(x=score, fill=gender))+
+ geom_histogram(alpha=0.5, position="identity")+
+ scale_fill_manual(values=c("aquamarine4", "aquamarine3"))+
+ theme_minimal()+
+ theme(legend.title=element_blank())
> p
R Base疊合直方圖 ggplot2疊合直方圖

鏡像直方圖

另一種鏡像表示法,需先以par(mfrow(c=(2,1))將輸出分為2列1欄,再以par(mar=c(b,l,t,r))調整圖的位置。上方圖以xaxt="n"參數取消x軸,下方圖以ylim設定y軸由大到小,達到圖型顛倒的效果。

> male<-c(rnorm(100, mean=0, sd=1))
> female<-c(rnorm(100, mean=3, sd=2))
> par(mfrow=c(2,1))
> par(mar=c(0,5,1,1))
> hist(male, main="", xlab="", ylab="count", xaxt="n", ylim=c(0,30), breaks=10, col="aquamarine4")
> legend("topright", c("Male"), bty="n", fill="aquamarine4")
> par(mar=c(3,5,0,1))
> hist(female, main="", xlab="score", ylab="count", ylim=c(30,0), breaks=10, col="aquamarine3")
> legend("bottomright", c("Female"), bty="n", fill="aquamarine3")

ggplot2的鏡像圖,需要注意將下方圖的y座標設為負號,並指定y軸以計數為單位。

> male<-c(rnorm(100, mean=0, sd=1))
> female<-c(rnorm(100, mean=3, sd=2))
> data<-data.frame(male, female)
> p<-ggplot(data, aes(x=x))+
+ geom_histogram( aes(x=male, y=..count..), fill="aquamarine4", color="grey")+
+ geom_label( aes(x=6, y=10, label="Male"), color="aquamarine4")+
+ geom_histogram( aes(x=female, y=-..count..), fill="aquamarine3", color="grey")+
+ geom_label( aes(x=6, y=-10, label="Female"), color="aquamarine3")+
+ xlab("Score")+
+ ylab("Count")+
+ theme_minimal()
> p
R Base鏡像直方圖 ggplot2鏡像直方圖