2017年9月9日 星期六

網路抓取 R CRAN 套件清單, 使用 ggplot2 套件繪圖, 建立第2個y軸座標.

主題: 網路抓取 R CRAN 套件清單, 使用 ggplot2 套件繪圖, 建立第2個y軸座標.
說明:

# ggplot2
# packages list
# XML
# geom_col
# goem_line
# geom_point
# scale_y_continuous



  • [#1-2] 首先載入 XML, ggplot2 套件.
  • [#3] 使用CRAN網站-依日期排列抓取現有1萬多個套件清單,
    例: http://cran.csie.ntu.edu.tw/web/packages/available_packages_by_date.html
  • [#4] 使用 readHTMLTable {XML} 函數以讀取網站中的套件清單表格, 將結果儲存為mydf資料物件.
  • [#7] 使用 trimws {base} 函數以刪除欄位名稱空白字元.
  • [#8] 原匯入第1欄 Date為字串資料型態, 使用 as.Date {base} 轉換為 日期(Date) 資料型態.
  • [#9] 使用 format {base}並取出套件更新年, 使用 table {base} 以計算各年套件個數.
  • [#10] 使用 cumsum {base}計算累計套件數並新增為 AccumulatedPAckages 欄位.
  • [#11] 使用 names {base} 設定前二欄名稱為 Year, Packages.
  • [#14] 使用 geom_col {ggplot2} 繪製"套件數(年)"長條圖, 另可使用 geom_bar {ggplot2} 繪製.
  • [#15-18] 設定主標題, x軸標題, y軸標題. theme {ggplot2} 可設定標題左右置中.
  • [#19] 使用 scale_y_continuous {ggplot2}可在繪圖區之右側建立y軸第2座標軸. 右側y軸對應長條圖的刻度. ggplot2 採用資料轉換概念, 因此左側y軸第1座標軸的刻度,對應至累計套件數, 其中最大值約11405, 右側最大值約4502, 11405/4502=2.5, 考慮以2倍計算, 即將左側刻度除以2, 轉換為右側刻度, 一般使用 trans = ~. /2 表示.
  • [#21] 使用 annotate {ggplot2} 可加上文字標題.
  • [#22-24] 使用 goem_line {ggplot2} 繪製累計套件數線圖.
  • [#25-27] 使用 goem_point {ggplot2} 繪製累計套件數點圖.

library(XML)
library(ggplot2)
urls <- "http://cran.csie.ntu.edu.tw/web/packages/available_packages_by_date.html"
mydf <- readHTMLTable(urls, stringsAsFactors = FALSE)
str(mydf)
mydf <- mydf[[1]]
names(mydf) <- trimws(names(mydf))
mydf$Date <- as.Date(mydf$Date)
mydf <- data.frame(table(format(mydf$Date, "%Y")), stringsAsFactors=FALSE)
mydf$AccumulatedPAckages <- cumsum(mydf$Freq)
names(mydf)[1:2] <- c("Year", "Packages")
mydf
ggplot(mydf, aes(x = Year)) +
geom_col(aes(y = Packages*2), fill="grey") + 
theme(plot.title = element_text(hjust = 0.5)) + 
xlab("年") + 
ylab("累計套件數") +
ggtitle("CRAN-套件統計圖 - by RWEPA") + 
scale_y_continuous(sec.axis = sec_axis(trans = ~. /2)) + 
theme(axis.title.y = element_text(colour = "blue")) + 
annotate("text", x=13, y=5500, label= "套件數(年)", angle = -90) + 
geom_line(aes(y = AccumulatedPAckages, group = 1), linetype = 2, color = "blue") +
theme(axis.text.x = element_text(face="bold", angle=45),
axis.text.y = element_text(face="bold", color="black", size=10)) +
geom_point(aes(y = AccumulatedPAckages, group = 1), color = "blue") +
geom_text(aes(y = AccumulatedPAckages, label = AccumulatedPAckages), 
vjust = -0.3, size = 4, color = "blue")
# end


1 則留言:

  1. #16 可改成以下內容, 使得結束日期由系統自動取得:
    xlab(paste0("年 (2005-01 ~ ", format(Sys.Date(), "%Y-%m"), ")")) +

    回覆刪除