【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的三种制图方式的理解与运用,欢迎批评指正。

发布了14 篇原创文章 · 获赞 24 · 访问量 1625

猜你喜欢

转载自blog.csdn.net/weixin_46124302/article/details/104886017