第 8 章 Facet 切圖
依照data frame中某些欄位將資料切成很多小的data frame, 一一套上相同的ggplot設計切割出很多小張但有相同幾何美學設計的圖群。
::download_file("https://www.dropbox.com/s/v8rchkn63fzgjj3/drake_facet.Rdata?dl=1")
xfunload("drake_facet.Rdata")
8.1 Facet wrap (單切面圖)
目標 不同行政區,三黨得票率面向欄位:原始資料要存在一個能區分不同行政區的欄位變數(假設叫地區)。
基本圖設計:先畫好單一行政區「data frame」下,三黨得票率的直方圖(基本設計):
ggplot_object
facet_wrap: 使用facet,自動將相同基本設計套用在不同行政區資料進行繪圖。
ggplot Object +
facet_wrap(...)
8.2 2020總統大選全國資料
- 資料來源:
library(ggplot2)
library(dplyr)
<- "https://db.cec.gov.tw/histQuery.jsp?voteCode=20200101P1A1&qryType=ctks"
dataSource <- readxl::read_excel("~/Dropbox/github-data/109-1-econDV/election2020.xls") predElection2020
8.2.1 Pseudo-codes
# 資料整理
<- {
df_byCounty
}
# 基本設計
<- function(Xdata){
ggByCounty ggplot(
data=Xdata
+
) geom_col(
aes(
x=號次, y=得票率, fill=號次
)
)
}%>%
df_byCounty filter(地區=="新北市") %>%
ggByCounty()
# 切圖
<- {
ggfacet_election %>%
df_byCounty ggfacet_election() +
facet_wrap(
vars(地區)
) }
8.2.2 資料整理
= {
predElection2020rev %>%
predElection2020 filter(
!is.na(號次)
-> predElection2020_b
) $地區 %>%
predElection2020_bna.omit() %>%
::map(
purrr~{rep(.x,3)}
%>%
) unlist() ->
$地區
predElection2020_b
attr(predElection2020_b, "data source") <- dataSource
%>%
predElection2020_b group_by(
地區%>%
) mutate(
=sum(得票數)
地區票數%>%
) ungroup() -> predElection2020rev
}
各地區得票率統計
%>%
predElection2020rev group_by(號次, 地區) %>%
summarise(
=sum(得票數)/sum(地區票數)
得票率%>%
) ungroup() -> df_byCounty
8.2.3 基本設計:單一地區
# 基本設計
<- function(Xdata){
ggByCounty ggplot(
data=Xdata
+
) geom_col(
aes(
x=號次, y=得票率, fill=號次
)
)
}%>%
df_byCounty filter(地區=="新北市") %>%
ggByCounty()
8.2.4 切圖
%>%
df_byCounty # 刪除
# filter(
# 地區=="新北市"
# ) %>%
ggplot() +
geom_col(
aes(
x=號次, y=得票率, fill=號次
)+
) # 加上
facet_wrap(
vars(地區)
)
8.3 Facet grid (雙切面圖)
8.4 2012-2020總統大選
目標 藍綠兩黨在北部各縣市的三次大選得票率走勢8.4.1 資料來源處理
<- readxl::read_excel("~/Dropbox/github-data/109-1-econDV/election2012.xls")
predElection2012<- readxl::read_excel("~/Dropbox/github-data/109-1-econDV/election2016.xls")
predElection2016 <- function(predElection2020){
fix_electionData %>%
predElection2020 filter(
!is.na(號次)
-> predElection2020_b
) $地區 %>%
predElection2020_bna.omit() %>%
::map(
purrr~{rep(.x,3)}
%>%
) unlist() ->
$地區
predElection2020_b
attr(predElection2020_b, "data source") <- dataSource
%>%
predElection2020_b group_by(
地區%>%
) mutate(
=sum(得票數)
地區票數%>%
) ungroup() -> predElection2020rev
}<- fix_electionData(predElection2012)
predElection2012rev <- fix_electionData(predElection2016) predElection2016rev
8.4.2 Pseudo-codes
<- {
electionDataMerged
}<- function(Xdata)(
ggfacet_base_function ggplot(
data=Xdata,
mapping=aes(
x=year,
y=得票率
)+
) geom_point() +
geom_line()
)<- {
ggfacet_base %>%
electionDataMerged filter(
=="dpp", 地區=="新北市"
party%>%
) ggfacet_base_function()
}<- {
ggfacet_2012_2020elections %>%
electionDataMerged ggfacet_base_function() +
facet_grid(
rows=vars(地區),
cols=vars(party)
) }
8.4.3 資料整理
<- {
electionDataMerged $year = 2020
predElection2020rev$year = 2012
predElection2012rev$year = 2016
predElection2016rev
<-
electionDataMerged ::bind_rows(
dplyr
predElection2012rev, predElection2016rev, predElection2020rev
)$姓名 %>% factor() ->
electionDataMerged$party
electionDataMergedlevels(electionDataMerged$party) <- c("pfp", "kmt", "dpp", "kmt", "kmt")
%>%
electionDataMerged mutate(
= dplyr::if_else(地區=="桃園縣", "桃園市", 地區)) ->
地區
electionDataMerged
%>%
electionDataMerged filter(
!= "pfp",
party ::str_detect(地區,"北|桃|基|竹")
stringr-> electionDataMerged
)
electionDataMerged }
8.4.4 基本設計
= function(Xdata)(
ggfacet_base_function ggplot(
data=Xdata,
mapping=aes(
x=year,
y=得票率
)+
) geom_point() +
geom_line() +
scale_x_continuous(
breaks=c(2012, 2016, 2020),
labels=c(2012, 2016, 2020)
) )
%>%
electionDataMerged filter(
=="dpp", 地區=="新北市"
party%>%
) ggfacet_base_function()
8.4.5 切圖
<- {
ggfacet_2012_2020elections %>%
electionDataMerged ggfacet_base_function() +
facet_grid(
rows=vars(地區),
cols=vars(party)
+
) theme_bw()
}
8.5 更多facet_grid的使用
8.6 KMT北中南東各區得票率
8.6.1 Pseudo-codes
<- {
electionKmtWithRegions
}
# 基本設計
<- function(Xdata){
ggfacet_base_regional ggplot(
data=Xdata,
aes(
x=地區,
y=得票率,
fill=region
)
)
}%>%
electionKmtWithRegions filter(
=='北部'
region%>% #View()
)
# 切圖
<- {
ggfacet_electionByRegion %>%
electionKmtWithRegions ggfacet_base_regional() +
facet_grid(
cols=vars(region)
)
}
8.6.2 資料整理
$year = 2020
predElection2020rev$year = 2012
predElection2012rev$year = 2016
predElection2016rev
<-
electionDataMerged ::bind_rows(
dplyr
predElection2012rev, predElection2016rev, predElection2020rev
)$姓名 %>% factor() ->
electionDataMerged$party
electionDataMergedlevels(electionDataMerged$party) <- c("pfp", "kmt", "dpp", "kmt", "kmt")
%>%
electionDataMerged mutate(
= dplyr::if_else(地區=="桃園縣", "桃園市", 地區)) ->
地區
electionDataMerged
%>%
electionDataMerged filter(
== 2020
year -> electionDataMerged2020
)
%>%
electionDataMerged2020 filter(
=="kmt"
party%>%
) mutate(
region =
::case_when(
dplyr::str_detect(地區,"[北基竹桃宜]") ~ "北部",
stringr::str_detect(地區,"[中苗彰投雲]") ~ "中部",
stringr::str_detect(地區,"[高南嘉屏澎]") ~ "南部",
stringrTRUE ~ "東部" # 其他
)-> electionKmtWithRegions )
8.6.3 基本設計
<- function(Xdata){
ggfacet_base_regional ggplot(
data=Xdata,
aes(
x=地區,
y=得票率,
fill=region
)+
) geom_col() +
coord_flip()
}
%>%
electionKmtWithRegions filter(
=='北部'
region%>% #View()
) ggfacet_base_regional()
8.6.4 切圖
%>%
electionKmtWithRegions ggfacet_base_regional() +
facet_grid(
rows=vars(region)
)
%>%
electionKmtWithRegions ggfacet_base_regional() +
facet_grid(
rows=vars(region),
scales = "free_y"
)
%>%
electionKmtWithRegions ggfacet_base_regional() +
facet_grid(
rows=vars(region),
scales = "free_y",
space = "free_y"
+ theme_classic() )