ggplot2包可视化——折线图

参考文献:
张杰.R 语言数据可视化之美:专业图表绘制指南:增强版 —北京:电子工业出版社,2019
Winston chang.R数据可视化手册—北京:人民邮电出版社,2014

一.简单折线图

折线图通常用来对两个连续变量之间的相互依存关系进行可视化,其中,x轴对应于自变量,y轴对应于因变量。一般来说,折线图的x轴对应的是时间变量,但也可以用来表示诸如实验对象的药剂量等连续型变量。而在ggplot2中,我们可以使用geom_line()函数绘制,下面是绘制简单折线图的一个案例

library(ggplot2)
#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
BOD$Time<-factor(BOD$Time)  #将time转为因子变量
ggplot(BOD,aes(x=Time,y=demand,group=1))+geom_line()+ylim(0,max(BOD$demand))

注:当x对应于因子型变量时,必须使用命令aes(group=1)以确保ggplot()知道这些数据点属于同一个分组,从而应该用一条折线连在一起。而ylim则可以限制y轴的取值范围,使数据表示更加直观。

如果需要在折线图中添加数据标记(点)时,可以使用geom_point()函数。

下面介绍几种不同的折线图绘制。

二.多重折线图

#ToothGrowth数据集
     len supp dose
1   4.2   VC  0.5
2  11.5   VC  0.5
3   7.3   VC  0.5
4   5.8   VC  0.5
5   6.4   VC  0.5
 …

library(plyr)
tg<-ddply(ToothGrowth,c("supp","dose"),summarise,length=mean(len))
ggplot(tg,aes(x=dose,y=length,linetype=supp))+geom_line()

例子中的数据集是supp(维C)的dose(剂量)对牙齿生长的实验,因为数据本身并不容易画折线图,因此这里使用plyr包中的ddply()函数进行数据处理,具体是以dose和supp两个变量为分类依据,对满足不同len的一些数值进行平均处理,最后生成新的一列length。最后画图,结果如下:

若要讲does这个变量转为因子,那必须要加入group=supp语句,这时输出的图像如下

ggplot(tg,aes(x=factor(dose),y=length,colour=supp,group=supp))+geom_line()

如果折线图上有数据标记,可以将分组变量映射在标记属性上,如shape=supp就是不同组对应不同的数据点形(如一个圆形一个菱形),fill就是对应不同颜色的线型。

有时候数据标记有可能会相互重叠,需要彼此错开,用此例举个例子

ggplot(tg,aes(x=dose,y=length,shape=supp))+
       geom_line(position = position_dodge(0.2))+ #将连接线左右移动0.2
       geom_point(position = position_dodge(0.2),size=4)  #将点的位置移动0.2

三.面积图

使用geom_area()函数可绘制面积图,以下面的例子为例:

sunspotyear<-data.frame(
   Year = as.numeric(time(sunspot.year)),   #提取时间,作为第一列
   Sunspots = as.numeric(sunspot.year))     #提取数据的值
#展示sunspotyear数据
 Year Sunspots
1 1700        5
2 1701       11
3 1702       16
…
288 1987     29.2
289 1988    100.2

ggplot(sunspotyear,aes(x=Year,y=Sunspots))+
     geom_area(fill ="blue",alpha=0.2)+geom_line()

其中geom_area()函数中的参数fill表示面积填充的颜色,alpha=0.2表示将面积图的透明度设定为80%,geom_line()为空表示仅绘制轨迹线,不绘制边框线,最后输出结果如下:

四.堆积面积图

同样使用geom_area()函数,不过此时需要加入参数fill映射一个因子型变量即可

library(gcookbook)
ggplot(uspopage,aes(x=Year,y=Thousands,fill=AgeGroup))+geom_area()

在默认情况下,图例的堆积顺序与面积图的堆积顺序是相反的,可通过设定标度中的切分(breaks)参数可翻转堆积顺序,下面进行这一调整,并在各个区域之间添加细线(size=0.2),填充区域设定为半透明(alpha=0.4)

ggplot(uspopage,aes(x=Year,y=Thousands,fill=AgeGroup))+
  geom_area(colour="black", size=.2, alpha=.4) +
  scale_fill_brewer(palette="Blues", breaks=rev(levels(uspopage$AgeGroup)))

而若要反转堆积面积图的堆积顺序时,可在aes()函数内部设定order=desc()指令,这里就可以放入AgeGroup。

若想绘制百分比堆积面积图,可用ddply()函数,产生一列新列,便于绘图

library(plyr)
uspopage_prop<-ddply(uspopage,"Year",
                     transform,Percent=Thousands/sum(Thousands)*100)
ggplot(uspopage_prop,aes(x=Year,y=Percent,fill=AgeGroup))+
  geom_area(colour="black", size=0.2, alpha=0.4) +
  scale_fill_brewer(palette="Blues", breaks=rev(levels(uspopage$AgeGroup)))

这里是调用ddply()函数,按照变量Year 将数据集拆分为多个独立的数据框,对所有数据框执行transform()函数并计算每个数据框对应的Percent 。最后再将所有数据框重组在一起,对于不同的问题,还需要具体分析。

五.图形调整

1.修改线条样式

设置线型(linetype)、线宽(size)、颜色(colour)等参数时,将对应参数的值传递给geom_line()函数就可对应的修改

例如想得到一个线宽为1的蓝色虚线图,就可使用以下代码:

ggplot(BOD,aes(x=Time,y=demand))+geom_line(linetype="dashed",size=1,colour="blue")

2.修改数据标记样式

而修改数据标记的样式时,可在geom_point()函数之下进行,如下例所示:

ggplot(BOD,aes(x=Time,y=demand))+geom_line()+
      geom_point(shape=22,size=4,colour="darkred",fill="white")

在shape参数中可选择不同的点形,点形种类如下所示:

3.添加置信区域

使用geom_ribbon()函数,然后分别映射一个变量给ymin和ymax

climate

数据集中的Anomaly10y 变量表示了各年温度相对于1950—1980平均水平变异(以摄氏度衡量)的10年移动平均。变量Unc10y表示其95%置信水平下的置信区间。我们令ymax和ymin分别设定为Anomaly10y加减Unc10y

clim<-subset(climate,Source=="Berkeley",select = c("Year","Anomaly10y","Unc10y")
# clim数据展示
   Year Anomaly10y Unc10y
1   1800     -0.435  0.505
2   1801     -0.453  0.493
3   1802     -0.460  0.486
…
203 2002      0.856  0.028
204 2003      0.869  0.028
205 2004      0.884  0.029

ggplot(clim, aes(x=Year, y=Anomaly10y)) +
  geom_ribbon(aes(ymin=Anomaly10y-Unc10y, ymax=Anomaly10y+Unc10y),alpha=0.2) +
  geom_line()

注意,上面的绘图命令中geom_ribbon()函数的调用顺序在geom_line() 函数之前,因而,折线被绘制在阴影区域上面的图层上。如果颠倒调用顺序的话,阴影区域的颜色有可能使折线模糊不清。

同样,对于此例,也可使用虚线作为置信域的上下边界

ggplot(clim, aes(x=Year, y=Anomaly10y)) +
  geom_line(aes(y=Anomaly10y-Unc10y), colour="grey50", linetype="dotted") +
  geom_line(aes(y=Anomaly10y+Unc10y), colour="grey50", linetype="dotted") +
  geom_line()

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值