Hi! 大家好,我是Eric,這次要練習運用R語言中的ggplot2套件完成長條圖(bar)
緣起:根據高速公路局發布的108年2月國道易壅塞路段彙整表,挑選其中國1南向平日路段:台中系統至
大雅(花博影響)16:00-19:00,由於台中花博吸引龐大旅次量,我們想要知道起訖點分別為「台中系統至大雅」各自的迄點與起點,取其中出現次數前5名製作長條圖(bar plot)。
目標:運用[R語言]的[ggplot2]套件。
使用資料:交通部高速公路局交通資料庫ETC(Electronic Toll Collection )資料─各旅次路徑原始資料(TDCS_M06A),108年2月。
1. 載入套件
library(dplyr)
library(magrittr)
library(stringr)
library(ggplot2)
2. 載入資料與前置處理
setwd("C:/Users/admin123/Desktop/ETC data(M06A)_10802") #設定路徑
ETC10802_M06A<-do.call(rbind,lapply(list.files(path="C:/Users/admin123/Desktop/ETC data(M06A)_10802",pattern="*.csv"),read.table, header=FALSE, sep=",")) #載入資料,將目標資料夾中所有檔名以.csv結尾的資料全數載入
names(ETC10802_M06A)<-c("VehicleType","oTime","o","dTime","d","TripLength","TripEnd","TripInfomation") #命名欄位名稱
ETC10802_M06A_31<-ETC10802_M06A %>% dplyr::filter(VehicleType==31,TripEnd=="Y") #運用%>%使程式碼簡潔化;運用dplyr套件中的filter函數,篩選出車種為小客車及旅次正常結束
ETC10802_M06A_oISDT31<-ETC10802_M06A_31 %>% dplyr::filter(o=="01F1774S") #篩選出起點為目標路段
ETC10802_M06A_dISDT31<-ETC10802_M06A_31 %>% dplyr::filter(d=="01F1774S") #篩選出迄點為目標路段
3. 分別選擇出現次數前5名的起點及迄點。
s1<-sort(table(ETC10802_M06A_oISDT31$d),decreasing =TRUE)[1:5] #找出起點為「台中系統至大雅」的資料中,出現次數前5名的迄點。sort(decreasing =TRUE)[1:5]為將資料遞減排序,並選擇前5筆資料;table()為依照迄點與其出現次數進行列表
s2<-sort(table(ETC10802_M06A_dISDT31$o),decreasing =TRUE)[1:5] #找出迄點為「台中系統至大雅」的資料中,出現次數前5名的起點
oISDT_d<-as.data.frame(s1);oISDT_d$Var1<-as.character(oISDT_d$Var1) #前半段為將列表轉為數據框;後半段為將Var1變數,也就是迄點轉為字串型態
dISDT_o<-as.data.frame(s2);dISDT_o$Var1<-as.character(dISDT_o$Var1)#前半段為將列表轉為數據框;後半段為將Var1變數,也就是起點轉為字串型態
ETC10802_M06A_oISDT31_1<-ETC10802_M06A_oISDT31 %>% dplyr::filter(d %in% oISDT_d$Var1) #從起點為「台中系統至大雅」的資料中,篩選出出現次數前5名的迄點資料
ETC10802_M06A_dISDT31_1<-ETC10802_M06A_dISDT31 %>% dplyr::filter(o %in% dISDT_o$Var1) #從迄點為「台中系統至大雅」的資料中,篩選出出現次數前5名的起點資料
4. 將路段編碼改為中文字。
ETC10802_M06A_oISDT31_1$d<-as.character(ETC10802_M06A_oISDT31_1$d) #將迄點轉為字串型態
ETC10802_M06A_dISDT31_1$o<-as.character(ETC10802_M06A_dISDT31_1$o) #將起點轉為字串型態
for (i in 1:length(ETC10802_M06A_oISDT31_1$d)) {
if(ETC10802_M06A_oISDT31_1[i,5]=="01F1774S"){
ETC10802_M06A_oISDT31_1[i,5]<-"大雅-台中"
}else if(ETC10802_M06A_oISDT31_1[i,5]=="01F1802S"){
ETC10802_M06A_oISDT31_1[i,5]<-"台中-南屯"
}else if(ETC10802_M06A_oISDT31_1[i,5]=="01F1960S"){
ETC10802_M06A_oISDT31_1[i,5]<-"彰化系統-彰化(北)"
}else if(ETC10802_M06A_oISDT31_1[i,5]=="01F1839S"){
ETC10802_M06A_oISDT31_1[i,5]<-"南屯-王田"
}else{
ETC10802_M06A_oISDT31_1[i,5]<-"彰化(南)-埔鹽系統"
}
} #從第一筆資料開始依序判斷迄點代碼,並將其轉為中文字
for (i in 1:length(ETC10802_M06A_dISDT31_1$o)) {
if(ETC10802_M06A_dISDT31_1[i,3]=="01F1664S"){
ETC10802_M06A_dISDT31_1[i,3]<-"台中系統-豐原"
}else if(ETC10802_M06A_dISDT31_1[i,3]=="01F1725S"){
ETC10802_M06A_dISDT31_1[i,3]<-"豐原-大雅"
}else if(ETC10802_M06A_dISDT31_1[i,3]=="01F1774S"){
ETC10802_M06A_dISDT31_1[i,3]<-"大雅-台中"
}else if(ETC10802_M06A_dISDT31_1[i,3]=="01F1621S"){
ETC10802_M06A_dISDT31_1[i,3]<-"后里(南)-台中系統"
}else{
ETC10802_M06A_dISDT31_1[i,3]<-"大甲-中港系統"
}
} #從第一筆資料開始依序判斷起點代碼,並將其轉為中文字
5. bar plot
ggplot(ETC10802_M06A_oISDT31_1,aes(x=reorder(d,d,function(x)-length(x))))+
geom_bar(aes(fill=d))+
geom_text(stat = "count", aes(label = (..count..)), vjust = .1, color=I("blue"), size = 4) +
labs(title="Bar plot of the top one to five counts of \n Taiwan highway(origin is Daya Dist. to Taichung system)", x="destination", y="counts")+
theme(axis.text.x = element_text(angle = 20))+
theme(plot.title=element_text(hjust = 0.5,face = "bold",size = 15))
#ggplot()製作底圖;
geom_bar(aes(fill=d))製作長條圖,fill=d表示以顏色區分迄點;
geom_text(stat = "count", aes(label = (..count..)), vjust =-1, color=I("blue"), size = 4)加上資料標籤,並設定高度、顏色及大小;
label()設定標題、x軸、y軸名稱,\n表示換行;
theme(axis.text.x=element_text(angel))調整x軸資料角度; theme(plot.title=element_text(hjust,face,size)分別調整標題置中、粗體及大小
ggplot(ETC10802_M06A_dISDT31_1,aes(x=reorder(o,o,function(x)-length(x))))+
geom_bar(aes(fill=o))+
geom_text(stat = "count", aes(label = (..count..)), vjust = .1, color=I("red"), size = 4) +
labs(title="Bar plot of the top one to five counts of \n Taiwan highway(destination is Daya Dist. to Taichung system)", x="origin", y="counts")+
theme(axis.text.x = element_text(angle = 20))+
theme(plot.title=element_text(hjust = 0.5,face = "bold",size = 15))
6. 大功告成
起點為「台中系統至大雅」,出現次數前5名的迄點
迄點為「台中系統至大雅」,出現次數前5名的起點
您好 可以跟你要csv檔嗎 想要做練習 在網路上找了很久都找不到
您好,抱歉現在才看到,我的資料因為換電腦所以不在了,
不過可以去交通部高速公路局交通資料庫找各旅次路徑原始資料(TDCS_M06A)這個資料喔,(https://tisvcloud.freeway.gov.tw/history/TDCS/M06A/https://tisvcloud.freeway.gov.tw/history/TDCS/M06A/)