这篇文章我们来介绍线形图的进阶画法,如何画出适合数据的线形图。
首先导入必要的包
library (ggplot2)
library(cowplot)#将图片组合在一起
library(gcookbook)#数据集
library(plyr)#后面用到ddply函数
首先我们以BOD数据集为例画出最基础的线形图
> BOD
Time demand
1 1 8.3
2 2 10.3
3 3 19.0
4 4 16.0
5 5 15.6
6 7 19.8
注意看这里Time并不是连续的,当Time=6时没有值
p1 <- ggplot(BOD,aes(x=Time,y=demand))+
geom_line()
p1
这里虽然Time=6时没有值,但是在横坐标上还是出现6,那么我们如何操作才能让横坐标显示的不是连续型而是离散的1 2 3 4 5 7 呢
p2 <- ggplot(BOD,aes(x=factor(Time),y=demand,group=1))+#只有1个group
geom_line()
p2
这里需要加上group=1,告诉ggplot你的分组映射情况
如何自定义x轴y轴的范围?
利用函数xlim()、ylim(),下面以y轴范围为例介绍其用法
#自定义图像中y轴的范围
p3 <- p2 + ylim(0,max(BOD$demand))
p3
在线形图上加上点方便查看各个点的取值
p4 <- p1 + geom_point()
p4
其实这样我们也可以清晰的看出来,在Time=6时是没有值的
如果数据里有两个影响因子,需要我们做对比,这时该怎么画呢?
#以ToothGrowth为例
ToothGrowth
tg <- ddply(ToothGrowth,c("supp","dose"),summarise,m=mean(len))
> tg
supp dose m
1 OJ 0.5 13.23
2 OJ 1.0 22.70
3 OJ 2.0 26.06
4 VC 0.5 7.98
5 VC 1.0 16.77
6 VC 2.0 26.14
p5 <- ggplot(tg,aes(x=dose,y=m,colour=supp))+
geom_line(size=.8)
p5
p6 <- ggplot(tg,aes(x=dose,y=m,linetype=supp))+
geom_line(size=.8)
p6
p5是以supp为类别分别用不同颜色表示
p6是以supp为类别分别用不同线型表示
这里同样有一个问题,对于横坐标dose我们的数据只有0.5 1.0 2.0,但是我们的图片显示的是连续型的,那么如何使横坐标只展示dose的值呢?
p7 <- ggplot(tg,aes(x=factor(dose),y=m,colour=supp,group=supp))+#以supp为group
geom_line(size=.8)
p7
注意这里同p2一样,也需要告诉ggplot你的分组情况,如果不加group=supp会出现空图
加上点
#加上点
p8 <- ggplot(tg,aes(x=dose,y=m,shape=supp,colour=supp))+#注意关于点的映射关系需要在aes()标清
geom_line(size=.8)+
geom_point(size=4)
p8
#等价写法,说白了就是两个图层分开画
ggplot(tg)+
geom_line(aes(x=dose,y=m,colour=supp),size=.8)+
geom_point(aes(x=dose,y=m,shape=supp,colour=supp),size=4)
如何修改线型?
首先我们必须了解有什么线型
library(ggpubr)
show_line_types()
下面我以solid,dashed,dotted为例展示如何修改线型
#修改线型
p9.1 <- ggplot(BOD,aes(x=Time,y=demand))+
geom_line(linetype="solid",size=1,colour="blue")+
ggtitle("linetype='soild'")#标题
p9.2 <- ggplot(BOD,aes(x=Time,y=demand))+
geom_line(linetype="dashed",size=1,colour="blue")+
ggtitle("linetype='dashed'")
p9.3 <- ggplot(BOD,aes(x=Time,y=demand))+
geom_line(linetype="dotted",size=1,colour="blue")+
ggtitle("linetype='dotted'")
cowplot::plot_grid(p9.1,p9.2,p9.3,nrow = 1)
修改线型只需在geom_line()中添加语句linetype="?"即可
修改点的类型
首先看一下有什么类型的点
library(ggpubr)
show_point_shapes()
#修改点的类型
p10 <- ggplot(BOD,aes(x=Time,y=demand))+
geom_line()+
geom_point(size=4,shape=21,colour="red",fill="pink")
p10
如何将线以下部分画成阴影
#将线以下区域绘制成阴影
p11 <- ggplot(BOD,aes(x=Time,y=demand))+
geom_area(colour="black",#边框颜色
fill="blue",#填充颜色
alpha=.5)#透明度
p11
这样看感觉有点画出阴影部分并不实用,我们换一个数据集来感受以下这样画的美感
sun <- data.frame(
year = as.numeric(time(sunspot.year)),
Sunspots = as.numeric(sunspot.year)
)
p12 <- ggplot(sun,aes(x=year,y=Sunspots))+
geom_area(fill="blue",alpha=.5)
p12
当数据中有多个类别时我们可以考虑画堆叠柱状图
以uspopage数据集为例
> uspopage
Year AgeGroup Thousands
1 1900 <5 9181
2 1900 5-14 16966
3 1900 15-24 14951
4 1900 25-34 12161
5 1900 35-44 9273
6 1900 45-54 6437
7 1900 55-64 4026
8 1900 >64 3099
9 1901 <5 9336
10 1901 5-14 17158
p13 <- ggplot(uspopage,aes(x=Year,y=Thousands,fill=AgeGroup))+
geom_area()+
geom_line(position = "stack")+#加线
scale_fill_brewer(palette = "Blues")#调色板
p13
如何手动添加置信区间
置信区间形如(x0-e,x0+e),因此我们需要先将e计算出来
,以climate数据集中的Berkeley为例展示一下如何画出置信区间
climate
#可以看出数据中存在NA列和不同城市的信息,我们可以利用subset()先筛选一下
Berkeley <- subset(climate,#数据
Source=="Berkeley",#筛选Source为Berkeley的行
select = c("Source","Year","Anomaly10y","Unc10y"))#仅展示这四列
p14 <- ggplot(Berkeley,aes(x=Year,y=Anomaly10y))+
geom_line()+
geom_ribbon(aes(ymin=Anomaly10y-Unc10y,ymax=Anomaly10y+Unc10y),alpha=0.2)+#画出置信区间阴影部分
geom_line(aes(y=Anomaly10y-Unc10y),colour = "black",linetype = "dashed")+#画出质心区间下边界
geom_line(aes(y=Anomaly10y+Unc10y),colour = "black",linetype = "dashed")#画出质心区间上边界
p14