iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 29
0
AI & Data

機器學習_資料採礦_透過數據協助決策_R語言系列 第 29

[Day 29]R語言_ggplot2長條圖的吹毛求疵_細節決定的成敗

為了讓一張圖上的資料更豐富,我在這張長條圖上做了許多小細節的改動,稍微介紹一下一些需要注意的點。

就這樣,過去29天了,不得不說一開始寫文章的時候是真的很盡心盡力,甚至我同學都明顯感受到我胖了,(每天多坐在電腦桌前幾個小時不胖也說不過去),然後去趟北海道的那幾天真的很硬,坐飛機都還在想鐵人賽的事,終於最後一篇了(Day30我估計是感謝文啦哈哈),後來覺得時間調配上真的不行這樣一直坐在電腦前,才慢慢的寫的比較輕鬆。這篇要介紹的也是工作上需求,要畫一張能放很多資訊的圖,然後才做的研究。

讀檔

library(jsonlite) 
library(tidyverse)
data <- fromJSON("https://od.cdc.gov.tw/eic/Weekly_Age_County_Gender_0703.json")
data[,8] = ifelse(nchar(data[,8]) == 1 | grepl("5-9",data[,8])  , paste0("0",(data[,8])), data[,8])
data

https://ithelp.ithome.com.tw/upload/images/20181110/20111603hYs0GyQPcW.png
這裡的細節是
1.plyr跟dplyr兩個package有衝突,要使用的時候記得要解除安解除安裝(detach)另外一個。
2.然後factor(.$性別)的部分,雖然性別本來就是因子變數,但是我在工作上的資料這邊是樹執行的連續變數,會導致資料雖然能畫圖但是會不知所云。要改成因子變數才行。
3.我其實是用累積長條圖的方式去畫百分比長條圖的,因為我找不到百分比長條圖如何加文字,因此我是將資料變成百分比的形式,才去做累積長條圖,這樣就會讓累積長條圖每個都累積到100%看起來就像是百分比長條圖了。

library(plyr)
#----統計起來為了做長條圖----#
ess2 = ddply(data,.(年齡層),function(.){
  res = prop.table(table(factor(.$性別)))
  res2 = table(factor(.$性別))
  data.frame(lab=names(res), y=c(res),yy =c(res2))
})
detach("package:plyr", unload=TRUE)

https://ithelp.ithome.com.tw/upload/images/20181110/20111603rpeEC9agoh.png
我建立for_show資料集,單純是因為我想要將每一條長條圖的資料數量記錄在圖片上,因此透過group_by跟summarise統計每一條長條圖的數量為何。

library(dplyr)
for_show = data %>% group_by(年齡層) %>% summarise(length(年齡層))

https://ithelp.ithome.com.tw/upload/images/20181110/20111603kDwBQuvkVw.png

內建字體不是說不好看,不過我喜歡微軟正黑體,也方便如果有需求想要換華康少女體的時候,可以直接修改這裡。

windowsFonts(A=windowsFont("微軟正黑體"))

因為我並不是畫百分比長條圖,所以我必須用畫累積長條圖的方式去做畫。
geom_bar(stat = "identity") 這部分算是預設
theme_classic(base_size = 16) 這行可以讓X軸、Y軸線條好看一些
geom_text(mapping = aes(label = sprintf("%.2f%%",y100)),
size = 5, colour = 'black', vjust = 2, hjust = .5, position = position_stack())
這行就是加字了(百分比的部分) 顏色為black黑色,大小size為5,vjust表示上下的距離hjust是左右
sprintf("%.2f%%",y
100) 是讓數字變成百分比的方法
theme(axis.text.x=element_text(face="bold",size=20,angle=360,color="#333333")) 因為X軸的字顯示太小了,用這行可以把size調成20比較方便看
scale_y_continuous(breaks = c(0,0.25,0.5,0.75,1) ,labels =c("0%","25%","50%","75%","100%"))
把Y軸的0 0.25 改成%數 0% 25% ,也可以改成文字,用法很多樣
scale_fill_discrete(name="性別",labels=c("女","男")) 這部分是改右邊的圖例
labs( x= "年齡層",y = "比例") 改變X、Y軸呈現的文字
geom_hline(yintercept=0.5,linetype="twodash",colour="#0000ff",size = 1) #增加一條中線,可以加強判斷

ggplot(ess2,aes(x = 年齡層,y=y,fill = lab))+
  geom_bar(stat = "identity") + 
  theme_classic(base_size = 16)+
  geom_text(mapping = aes(label = sprintf("%.2f%%",y*100)),
            size = 5, colour = 'black', vjust = 2, hjust = .5, position = position_stack())+
  annotate('text',x = 1:nrow(for_show),y=0.1,label= unlist(for_show[,2]),family = "A",size = 5.5,fontface =2)+
  theme(axis.text.y=element_text(face="bold",size=15,color="#333333"))+##調整y軸字型
  theme(axis.text.x=element_text(face="bold",size=20,angle=360,color="#333333"))+#x軸字型(筆數的數字)
  scale_y_continuous(breaks = c(0,0.25,0.5,0.75,1) ,labels =c("0%","25%","50%","75%","100%"))+
  scale_fill_discrete(name="性別",labels=c("女","男"))+
  labs( x= "年齡層",y = "比例")

https://ithelp.ithome.com.tw/upload/images/20181110/20111603oyQ6LUB0Q2.png

這樣就完成啦~


上一篇
[Day 28] R語言_ggplot2長條圖的吹毛求疵(百分比累積長條圖加上文字,網路上沒找到相關的寫法,我自己來寫吧)
下一篇
[Day 30] 不瘋魔、不成佛_未完待續
系列文
機器學習_資料採礦_透過數據協助決策_R語言30

尚未有邦友留言

立即登入留言