iT邦幫忙

0

[R語言]資料視覺化G03─運用ggplot2完成長條圖(bar)

  • 分享至 

  • xImage
  •  

Hi! 大家好,我是Eric,這次要練習運用R語言中的ggplot2套件完成長條圖(bar)/images/emoticon/emoticon01.gif

緣起:根據高速公路局發布的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名的迄點
https://ithelp.ithome.com.tw/upload/images/20190304/20115774guJTV3iB18.png

迄點為「台中系統至大雅」,出現次數前5名的起點
https://ithelp.ithome.com.tw/upload/images/20190304/201157740KMRaA2muK.png


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
jeremy910715
iT邦新手 5 級 ‧ 2022-04-14 02:33:49

您好 可以跟你要csv檔嗎 想要做練習 在網路上找了很久都找不到

您好,抱歉現在才看到,我的資料因為換電腦所以不在了,
不過可以去交通部高速公路局交通資料庫找各旅次路徑原始資料(TDCS_M06A)這個資料喔,(https://tisvcloud.freeway.gov.tw/history/TDCS/M06A/https://tisvcloud.freeway.gov.tw/history/TDCS/M06A/)

我要留言

立即登入留言