【R語言】疫情期間的三大熱詞“湖北”“肺炎”“蝙蝠”百度搜索次數變化統計(3月15日學習筆記:R語言製圖)

我的老師最近在進行一項研究:與此次冠狀病毒有關的關鍵字的檢索次數變化
老師給了我們三個關鍵詞在百度上的每日檢索次數:“湖北”“肺炎”“蝙蝠”
要求我們用R語言繪製這三個關鍵詞的搜索次數變化趨勢
我想到了三種圖片繪製方式:1.折線圖2.時間序列3.多重摺線圖

1.折線圖

以“湖北”一詞爲例,首先附上我的代碼↓

#######
#思路1:畫折線圖
#1.更改工作路徑
setwd("C://Users//Administrator//Desktop//R//CH04")
getwd()
#2.讀入數據
date <- read.csv('關鍵詞-湖北.csv',header=FALSE)
#3.以讀入數據繪製數據框
Time = date[,1]
Freq = date[,2]
TF <- data.frame(Time,Freq)
TF
#4.繪製折線圖
library(ggplot2)
######
#把X軸的數字改成時間類型
TF$Time <- as.Date(as.character(TF$Time),"%Y%m%d")
#class(TF$Time)
plot <- ggplot(TF, aes(x=Time, y=Freq, group=1)) + geom_line(linetype="dotted") + scale_x_date(date_breaks =  "2 month")
plot

我的思路是這樣的,首先需要讀取數據,所以前面兩步分別做了工作路徑的修改和數據的讀入。
讀入數據後就可以把excel表格中的數據製成一個數據框,以便作圖。
在作圖的時候我發現了三個問題:
1.如果不對X軸做一個刻度標識,比如隔多久才顯示一次的話,所有的時間會擠在一起,導致X軸座標看不見
2.這時候X軸的數據不是時間date類型,在R語言中此時應該是discrete類型
3.X軸變量不連續,是離散型變量,生成的圖中間會有一段爲0的線

對此我一開始想到了兩種解決問題
1.看成離散型變量的情況
將原問題的時間進行變量因子化,確定其爲離散型變量,然後再每隔100出現一次數字

#法一:看成離散型變量的情況
#不能成功
date1 <- TF # 賦值數據
date1$Time <- factor(date1$Time)#變量因子化
ggplot(date1, aes(x=Time, y=Freq, group=1)) + geom_line(linetype="dotted") + scale_x_continuous(breaks = seq(, , 100))
+ scale_x_date(breaks = 100)
#X或Y 軸設置成 discrete,而 data卻是 continuous,反之如此。比如 設置了 scale_x_continuous(blablabla),但是x軸的data卻是 c(“val1”,“val2”,blabal2),這就造成了衝突,所以error

ggplot(date1, aes(x=Time, y=Freq, group=1)) + geom_line(linetype="dotted") + scale_x_discrete(breaks=seq(,,50))
#↑只能用連續型變量

但是上述代碼報了兩次錯,第一次錯在

ggplot(date1, aes(x=Time, y=Freq, group=1)) + geom_line(linetype="dotted") + scale_x_continuous(breaks = seq(, , 100))
+ scale_x_date(breaks = 100)

因爲X軸現在是discrete類型,但是數據只有是continuous類型纔可以用上面的方式進行分割,每隔100出現一次,所以把連續型定位離散型的這種思路行不通。

2.把X軸的數字改成時間類型
直接把Time轉成data類型

#把數字轉化爲日期
TF$Time <- as.Date(as.character(TF$Time),"%Y%m%d")
#如果報錯“無效輸入”:日期轉換隻處理類日期的對象
class(TF$Time)
plot <- ggplot(TF, aes(x=Time, y=Freq, group=1)) + geom_line(linetype="dotted") + scale_x_date(date_breaks =  "2 month")
plot

最終得到結果如下圖
湖北

2.時間序列

同樣以“湖北”一詞爲例
前面的準備步驟和畫折線圖差不多

#1.更改工作路徑
setwd("C://Users//Administrator//Desktop//R//CH04")
getwd()
library(ggplot2)
#2.讀入數據
date <- read.csv('關鍵詞-湖北.csv',header=FALSE)
#3.以讀入數據繪製數據框
Time = date[,1]
Freq = date[,2]
TF <- data.frame(Time,Freq)
TF

#4.把數字轉化爲日期
TF$Time <- as.Date(as.character(TF$Time),"%Y%m%d")
class(TF$Time)
#把年月日時分秒轉換成日期格式

畫圖的時候需要用

library(zoo)
plot(zoo(TF$Freq,as.Date(TF$Time,"%d/%m/%Y %H:%M")),   #zoo簡化plot函數的參數設置
     xlab="Time", ylab="Freq",
     main="Time trend of Oxides of Nitrogen")

這個函數,以及zoo包

接下來附上時間序列表示的完整代碼

#Time trend of HuBei
######
#1.更改工作路徑
setwd("C://Users//Administrator//Desktop//R//CH04")
getwd()
library(ggplot2)
#2.讀入數據
date <- read.csv('關鍵詞-湖北.csv',header=FALSE)
#3.以讀入數據繪製數據框
Time = date[,1]
Freq = date[,2]
TF <- data.frame(Time,Freq)
TF

#4.把數字轉化爲日期
TF$Time <- as.Date(as.character(TF$Time),"%Y%m%d")
class(TF$Time)
#plot(TF$Time~as.Date(TF$Time,"%d/%m/%Y %H:%M",type="l",xlab="Time", ylab="Freq",main="Time trend of Oxides of Nitrogen"))
#把年月日時分秒轉換成日期格式

#5.畫圖
#install.packages("zoo")
library(zoo)
plot(zoo(TF$Freq,as.Date(TF$Time,"%d/%m/%Y %H:%M")),   #zoo簡化plot函數的參數設置
     xlab="Time", ylab="Freq",
     main="Time trend of Oxides of Nitrogen")


得到的時間序列圖如下
在這裏插入圖片描述

這一時間序列畫圖方法借鑑了哈密瓜不甜前輩的方法,下面代碼爲該前輩的源代碼

> air<-read.csv("openair.csv")
> plot(air$nox~as.Date(air$date,"%d/%m/%Y %H:%M"),  #把年月日時分秒轉換成日期格式
+ type="l",
+ xlab="Time", ylab="Concentration (ppb)",
+ main="Time trend of Oxides of Nitrogen")

> library(zoo)
> plot(zoo(air$nox,as.Date(air$date,"%d/%m/%Y %H:%M")),   #zoo簡化plot函數的參數設置
+ xlab="Time", ylab="Concentration (ppb)",
+ main="Time trend of Oxides of Nitrogen")

3.多重摺線圖

也就是把三個詞的折線圖放在同一張圖中,顯示效果如下圖
多重摺線圖

#1.更改工作路徑
setwd("C://Users//Administrator//Desktop//R//CH04")
getwd()
#2.讀入數據
date1 <- read.csv('關鍵詞-湖北.csv',header=FALSE)
date2 <- read.csv('關鍵詞-肺炎.csv',header=FALSE)
date3 <- read.csv('關鍵詞-蝙蝠.csv',header=FALSE)
#3.以讀入數據繪製數據框
#3.1湖北框
Time = date1[,1]
Freq = date1[,2]
TF1 <- data.frame(Time,Freq)
TF1 <- transform(TF1,name="HuBei")
TF1
#3.2肺炎框
Time = date2[,1]
Freq = date2[,2]
TF2 <- data.frame(Time,Freq)
TF2 <- transform(TF2,name="FeiYan")
TF2

#3.2蝙蝠框
Time = date3[,1]
Freq = date3[,2]
TF3 <- data.frame(Time,Freq)
TF3 <- transform(TF3,name="Bat")
TF3
#4.合併數據框
DF <- rbind (TF1,TF2,TF3)
DF

#5.把X軸的數字改成時間類型
DF$Time <- as.Date(as.character(DF$Time),"%Y%m%d")
class(DF$Time)

#5.繪製折線圖
library(plyr)
library(ggplot2)
# Summarize the ToothGrowth
#Pic <- ddply(DF, c("HuBei", "FeiYan","Bat"), summarise, length=mean(len))
Pic <- ddply(DF,.(name))
#ddply(數據集,變量,)
Pic
str(Pic)
# Map supp to colour
ggplot(Pic, aes(x=Time, y=Freq, colour=name)) + geom_line() + scale_x_date(date_breaks =  "2 month")
# Map supp to linetype
ggplot(Pic, aes(x=Time, y=Freq, linetype=name)) + geom_line() + scale_x_date(date_breaks =  "2 month")

上述代碼的思路就是,先把三個詞保存在三個不同的數據框中,再用rbind()函數合併成一個數據框,根據name的不同畫成三條不同的線
結尾的Map supp分別指兩種不同的展示方法

ggplot(Pic, aes(x=Time, y=Freq, colour=name)) + geom_line() + scale_x_date(date_breaks =  "2 month")

將線條以顏色區分

ggplot(Pic, aes(x=Time, y=Freq, linetype=name)) + geom_line() + scale_x_date(date_breaks =  "2 month")

將線條以不同的線條狀態(如連線,點線等)區分。

關於str()

上述代碼中

str(Pic)

關於str()的用法,R的help如此描述↓

Compactly display the internal structure of an R object, a diagnostic function and an alternative to summary (and to some extent, dput). Ideally, only one line for each ‘basic’ structure is displayed. It is especially well suited to compactly display the (abbreviated) contents of (possibly nested) lists. The idea is to give reasonable output for any R object. It calls args for (non-primitive) function objects.

簡潔地顯示R對象的內部結構、診斷函數和summary(在某種程度上還有dput)的替代品。理想情況下,每個“基本”結構只顯示一行。它特別適合於緊湊地顯示(可能是嵌套的)列表的(縮寫的)內容。其思想是爲任何R對象提供合理的輸出。它爲(非原語)函數對象調用參數。

簡單來說就是顯示Pic這個物件裏面的變量和取值,執行結果如下

str(Pic)
‘data.frame’: 1296 obs. of 3 variables:
$ Time: Date, format: “2019-01-01” “2019-01-02” “2019-01-03” …
$ Freq: int 3347 3740 3737 3847 3631 3732 3994 3969 4176 4018 …
$ name: Factor w/ 3 levels “HuBei”,“FeiYan”,…: 1 1 1 1 1 1 1 1 1 1 …

對結果是沒有影響的。

以上是我對R的三種製圖方式的理解與運用,歡迎批評指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章