手把手教你使用ggplot2绘制折线图

浏览: 2260

折线图同样是应用非常广泛的统计图之一,通过折线图可以反映某种现象的趋势。通常折线图的横坐标是为时间变量,纵坐标则是一般性的数值型变量,当然,折线图也允许横坐标为离散型数值和数值型数值。下面来解释一下关于折线图的绘制。

一、绘制单条折线图

有关时间序列的折线图

library(ggplot2)
library(lubridate) #处理日期时间相关的R包,非常有用,强烈推荐
Year <- year(seq(from = as.Date('2006-01-01'), to = as.Date('2015-01-01'), by = 'year'))
Weight <- c(23,35,43,57,60,62,63,66,61,62)
df <- data.frame(Year = Year, Weight = Weight)

ggplot(data = df, mapping = aes(x = factor(Year), y = Weight, group = 1)) + geom_line() + xlab('Year')

image.png

有关离散变量的折线图

type <- c('A','B','C','D','E')
quanlity <- c(1,1.1,2.1,1.5,1.7)
df <- data.frame(type = type, quanlity = quanlity)
ggplot(data = df, mapping = aes(x = type, y = quanlity, group = 1)) + geom_line()

image.png

有关连续变量的折线图

set.seed(1234)
times <- 1:15
value <- runif(15,min = 5,max = 15)
df <- data.frame(times = times, value = value)
ggplot(data = df, mapping = aes(x = times, y = value)) + geom_line()

image.png

善于发现的你,可能会注意到上面三段代码有一个重要的不同之处,那就是第一段和第二段代码中含有‘group = 1’的设置这样做是因为横坐标的属性设置为了因子,即将连续型的年份和离散型的字符转换为因子,如果不添加‘group = 1’这样的条件,绘图将会报错。故务必需要记住这里的易犯错误的点!

往折线图中添加标记(点)

当数据点密度比较小或采集分布(间隔)不均匀时,为折线图做上标记将会产生非常好的效果。处理的方法非常简单,只需在折线图的基础上再加上geom_point()函数即可。

set.seed(1234)
year <- c(1990,1995,2000,2003,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015)
value <- runif(15, min = 10, max = 50)
df <- data.frame(year = year, value = vlaue)
ggplot(data = df, mapping = aes(x = year, y = value)) + geom_line() + geom_point()

image.png
从图中就可以非常明显的看出,刚开始采集的点分布非常散,而后面采集的点就比较密集,这也有助于对图的理解和应用。

二、绘制多条折线图

上面绘制的都是单条这折线图,对于两个或两个以上的折线图该如何绘制呢?也很简单,只需将其他离散变量赋给诸如colour(线条颜色)和linetype(线条形状)的属性即可,具体参见下文例子。

基于颜色的多条折线图

set.seed(1234)
year <- rep(1990:2015, times = 2)
type <- rep(c('A','B'),each = 26)
value <- c(runif(26),runif(26, min = 1,max = 1.5))
df <- data.frame(year = year, type = type, value = value)
ggplot(data = df, mapping = aes(x = year, y = value, colour = type)) + geom_line()

image.png


基于形状的多条折线图

ggplot(data = df, mapping = aes(x = year, y = value, linetype = type)) + geom_line()

image.png
同样需要注意的是,在绘制多条折线图时,如果横坐标为因子,必须还得加上‘group=分组变量’的参数,否则报错或绘制出错误的图形。

以上绘制的折线图,均采用默认格式,不论是颜色、形状、大小还是透明度,均没有给出自定义的格式。其实ggplot2包也是允许用户根据自己的想法设置这些属性的。

#自定义线条或点的颜色--scale_color_manual()

#自定义线条类型--scale_linetype_manual()

#自定义点的形状--scale_shape__manual()

#自定义点的大小或线条的宽度--scale_size__manual()

#自定义透明度--scale_alpha__manual()

综合的例子:

ggplot(data = df, mapping = aes(x = year, y = value, linetype = type, colour = type, shape = type, fill = type))
+ geom_line() + geom_point() #绘制线图和点图
+ scale_linetype_manual(values = c(1,2)) #自定义线条类型
+ scale_color_manual(values = c('steelblue','darkred')) #自定义颜色
+ scale_shape_manual(values = c(21,23)) #自定义点形状
+ scale_fill_manual(values = c('red','black')) #自定义点的填充色

image.png
虽然这幅图画的优点夸张,目的是想说明可以通过自定义的方式,想怎么改就可以怎么改。前提是aes()属性的内容与自定义的内容对应上。

三、绘制堆积面积图

绘制堆叠的面积图只需要geom_area()函数再加上一个离散变量映射到fill就可以轻松实现,先忙咱小试牛刀一下。

set.seed(1234)
year <- rep(1990:2015, times = 2)
type <- rep(c('A','B'),each = 26)
value <- c(runif(26),runif(26, min = 1,max = 1.5))
df <- data.frame(year = year, type = type, value = value)
ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area()

image.png
一幅堆叠的面积图就轻松绘制成功,但我们发现,堆叠的顺序与图例的顺序恰好相反,不用急,只需要加一句命令即可:

ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area() + guides(fill = guide_legend(reverse = TRUE))

image.png

如果需要为每一块面积图的顶部加上一条直线,可以通过如下两种方式:

ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(colour = 'black', size =1, alpha = .7) + guides(fill = guide_legend(reverse = TRUE))

image.png
其中,colour设置面积图边框的颜色;size设置边框线的粗细;alpha设置面积图和边框线的透明度。

ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(alpha = 0.6) + geom_line(colour = 'black', size = 1, position = 'stack', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))

image.png
该方法是通过添加堆叠线条(必须设置geom_line()中position参数为‘stack’,否则只是添加了两条线,无法与面积图的顶部重合)。这两幅图的区别在于第二种方式没有绘制面积图左右边框和底边框。在实际应用中,建议不要在面积图中绘制边框线,因为边框的存在可能产生误导

四、绘制百分比堆积面积图

在上一期中,我们绘制了堆叠条形图和百分比堆叠面积图,具体可参见:

手把手教你使用ggplot2绘制条形图

在面积图中,也可以方便快捷的绘制出百分比堆积面积图,具体操作如下:

set.seed(1234)
year <- rep(1990:2015, times = 4)
type <- rep(c('A','B','C','D'),each = 26)
value <- c(runif(26),runif(26, min = 1,max = 1.5), runif(26, min = 1.5,max = 2), runif(26, min = 2,max = 2.5))
df <- data.frame(year = year, type = type, value = value)
ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(position = 'fill', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))

image.png
但通过这种方式(设置面积图的positon='fill')存在一点点小缺陷,即无法绘制出百分比堆积面积图顶部的线条,该如何实现呢?这里只需要对原始数据集做一步汇总工作,让后按部就班的绘制面积图即可。

library(dplyr)
df_by_type <- group_by(.data = df, year)
df_summarize <- mutate(.data = df_by_type, value2 = value/sum(value))

有关dplyr包的用法可参考:

强大的dplyr包实现数据预处理

ggplot(data = df_summarize, mapping = aes(x = year, y = value2, fill = type)) + geom_area(alpha = 0.6) + geom_line(colour = 'black', size = 1, position = 'stack', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))

image.png
哈哈,大功告成,就这么简单。

参考资料:

R语言_ggplot2:数据分析与图形艺术

R数据可视化手册



推荐 3
本文由 每天进步一点点2015 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

1 个评论

很详细

要回复文章请先登录注册