作者:莊閃閃
來源:莊閃閃的成長手冊
馬賽克圖(mosaic plot),顯示分類數據中一對變量之間的關係,原理類似雙向的100%堆疊式條形圖,但其中所有條形在數值/標尺軸上具有相等長度,並會被劃分成段。可以通過這兩個變量來檢測類別與其子類別之間的關係。
主要優點馬賽克圖能按行或按列展示多個類別的比較關係。
主要缺點難以閱讀,特別是當含有大量分段的時候。此外,我們也很難準確地對每個分段進行比較,因為它們並非沿著共同基線排列在一起。
適用馬賽克圖比較適合提供數據概覽。
注意非坐標軸非均勻的馬賽克圖也是統計學領域標準的馬賽克圖,一個非均勻的馬賽克圖包含以下構成元素:①非均勻的分類坐標軸;②面積、顏色均有含義的矩形塊;③圖例。對於非均勻的馬賽克圖,關注的數據維度非常多,一般的用戶很難直觀理解,在多數情況下可以被拆解成多個不同的圖表,以下我們會對其進行繪製。
數據介紹數據構建代碼來源《R數據可視化之美》,任意擬定一個數據框。並用melt()函數將數據轉化成以下結果:
library(ggplot2)
library(RColorBrewer)
library(reshape2) #提供melt()函數
library(plyr) #提供ddply()函數,join()函數
df <- data.frame(segment = c("A", "B", "C","D"),
Alpha = c(2400 ,1200, 600 ,250),
Beta = c(1000 ,900, 600, 250),
Gamma = c(400, 600 ,400, 250),
Delta = c(200, 300 ,400, 250))
melt_df<-melt(df,id="segment")計算出每行的最大,最小值,並計算每行各數的百分比。ddply()對data.frame分組計算,並利用join()函數進行兩個表格連接。
segpct<-rowSums(df[,2:ncol(df)])
for (i in 1:nrow(df)){
for (j in 2:ncol(df)){
df[i,j]<-df[i,j]/segpct[i]*100 #將數字轉換成百分比
}
}
segpct<-segpct/sum(segpct)*100
df$xmax <- cumsum(segpct)
df$xmin <- (df$xmax - segpct)
dfm <- melt(df, id = c("segment", "xmin", "xmax"),value.name="percentage")
colnames(dfm)[ncol(dfm)]<-"percentage"
#ddply()函數使用自定義統計函數,對data.frame分組計算
dfm1 <- ddply(dfm, .(segment), transform, ymax = cumsum(percentage))
dfm1 <- ddply(dfm1, .(segment), transform,ymin = ymax - percentage)
dfm1$xtext <- with(dfm1, xmin + (xmax - xmin)/2)
dfm1$ytext <- with(dfm1, ymin + (ymax - ymin)/2)
#join()函數,連接兩個表格data.frame
dfm2<-join(melt_df, dfm1, by = c("segment", "variable"), type = "left", match = "all")方法
繪製馬賽克圖可以使用ggplot2包的geom_rect()函數、ggmosaic包的geom_mosai()函數、graphics包的mosaicplot()函數,或者vcd包的mosaic()函數繪製馬賽克圖。接下來對他們進行一一實現。
1、ggplot2包的geom_rect()函數這個方法比較複雜,圖層一層一層疊加得到的,不過靈活性比較強,可根據自己喜好進行修改。
ggplot()+
geom_rect(aes(ymin = ymin, ymax = ymax, xmin = xmin, xmax = xmax, fill = variable),dfm2,colour = "black") +
geom_text(aes(x = xtext, y = ytext, label = value),dfm2 ,size = 4)+
geom_text(aes(x = xtext, y = 103, label = paste("Seg ", segment)),dfm2 ,size = 4)+
geom_text(aes(x = 102, y = seq(12.5,100,25), label = c("Alpha","Beta","Gamma","Delta")), size = 4,hjust = 0)+
scale_x_continuous(breaks=seq(0,100,25),limits=c(0,110))+
theme(panel.background=element_rect(fill="white",colour=NA),
panel.grid.major = element_line(colour = "grey60",size=.25,linetype ="dotted" ),
panel.grid.minor = element_line(colour = "grey60",size=.25,linetype ="dotted" ),
text=element_text(size=15),
legend.position="none")**圖形解釋:**這個馬賽克圖,從A這列縱向看可以看出各個指標(Delta,Gamma等)的佔比情況,從橫向來看,不同變量(A,B等)的寬度代表該變量佔所有數據的佔比情況,越寬說明該變量數據總和越大。
2、vcd包的mosaic()函數
用該函數,我們就不用前面那麼複雜的數據集進行繪製了,只要使用xtabs轉換成以下數據格式即可,方便簡單。
library(vcd)
table<-xtabs(value ~variable+segment, melt_df)
mosaic( ~segment+variable,table,shade=TRUE,legend=TRUE,color=TRUE)3、graphics包的mosaicplot()函數
該方法和上面類似,掉包就行,數據類型與上面相同。
library(graphics)
library(wesanderson) #顏色提取
mosaicplot( ~segment+variable,table, color = wes_palette("GrandBudapest1"),main = '')參考資料[1]
《R數據可視化之美》 : https://blog.csdn
[2][R語言][可視化] 之 Mosaic Plot(馬賽克圖): https://blog.csdn.net/tobeyourlover/article/details/52704333?%3E