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

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

作者:刘顺祥 R语言中文社区作者
公众号:数据分析1480(微信ID:lsxxx2011)
配套教程:手把手教你做文本挖掘 edu.hellobi.com/course/


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

一、绘制单条折线图

有关时间序列的折线图

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')



有关离散变量的折线图

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()



有关连续变量的折线图

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()



善于发现的你,可能会注意到上面三段代码有一个 重要的不同之处 ,那就是 第一段和第二段代码中含有‘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()


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

二、绘制多条折线图

上面绘制的都是单条这折线图,对于两个或两个以上的折线图该如何绘制呢?也很简单,只需将其他离散变量赋给诸如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()



基于形状的多条折线图

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


同样需要注意的是,在绘制多条折线图时, 如果横坐标为因子,必须还得加上‘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')) #自定义点的填充色


虽然这幅图画的优点夸张,目的是想说明可以通过自定义的方式,想怎么改就可以怎么改。前提是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()


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

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



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

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))


其中, 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))


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

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

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

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

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

set.seed(1234)
year <- rep(1990:2015, times = 4)