在R中绘制颜色渐变折线图
折线图是最常见的数据可视化形式,通过在折线图中加入不同颜色,绘制成为渐变折线图,可以告诉读者你想表达的另一层含义。
学习资料
来自Nathan Yau的专题教程How to Make a Line Chart with a Color Gradient in R,教程里面有非常详细的步骤。最重要的是作者将绘制颜色渐变线段的原理讲得非常透彻:先指定配色方案,然后绘制颜色渐变线段。可以从以下代码来学习其中的原理:
gradientLine <- function(x, y, breaks, shades, nterp, lwd=2) {
segcols <- sapply(y, function(val) {
i <- min(which(breaks > val))-1
return(shades[i])
})
for (i in 2:length(x)) {
# In between coordinates.
x_curr <- seq(x[i-1], x[i], length.out=nterp)
y_curr <- seq(y[i-1], y[i], length.out=nterp)
# Start and finish colors.
shade_start <- segcols[i-1]
shade_end <- segcols[i]
# Color palette
pal <- colorRampPalette(c(shade_start, shade_end))
inbetween_colors <- pal(nterp)
# Segments.
segments(x0=x_curr[1:(nterp-1)],
x1=x_curr[2:nterp],
y0=y_curr[1:(nterp-1)],
y1=y_curr[2:nterp],
col=inbetween_colors, lwd=lwd)
}
}
参数 | 含义 |
---|---|
x | 折线图上目标值的x坐标 |
y | 折线图上目标值的y坐标 |
breaks | 依据目标值的分布设置的合理区间切分,向量类型 |
shades | 依据目标值落在breaks的不同区间设置的配色方案,向量类型 |
nterp | 设置两个目标值线段间的分段数,分段数越大,颜色渐变越平滑 |
实际数据
通过国家统计局获取卷烟工业产量的月度数据。值得注意的是原始数据质量存在一定问题,主要是部分月度数据缺失,以及产量数据与同比数据存在矛盾的问题,经过清洗和整理形成如下格式的CSV文件,计算后的数据存在误差。
关于同比2000年增长率的计算
重点说明此折线图上标识的0%的基线表示2000年各月份的卷烟产量,横坐标轴上各年份刻度位置表达了当年的一月,因此两个连续刻度之间分布了前一刻度年份的12个月的产量数据同比2000年月份产量的增长率。计算代码如下:
# 2000 base.
cigar2000 <- cigar$Cigar[cigar$Year == 2000]
# Calculate change since 2003 during same month.
cigar$change_since2000 <- apply(cigar, 1, function(x) {
curr_cigar <- as.numeric(x[3])
from2000 <- cigar2000[as.numeric(x[2])]
return( (curr_cigar - from2000) / from2000 )
})
教程上没有提及的事项
Nathan Yau在教程中绘制颜色渐变的代码如下:
plot(x, y, xlab="Months Since January 2003", ylab="% Difference", type="n")
gradientLine(x, y, breaks=breaks, shades=shades, nterp=20, lwd=3)
代码输出的颜色渐变折线会满足你的预期,但坐标轴会让你不爽(R会根据x,y值的范围自己判断刻度位置),因为实际数据中横坐标的x值将是从2001年1月开始的观测数(数据行数),这肯定不是你想要的。因此我们应该自定义坐标轴。
# Plot without axis and outline
plot(0,0,xlim=c(1,265),ylim=c(-50,210),xlab="Years Since 2001",ylab="Difference",main="Cigarette production",xaxt="n",yaxt="n",bty="n")
# Set X-axis
axis(side=1,at=c(13,25,37,49,61,73,85,97,109,121,133,145,157,169,181,193,205,217,229,241,253,265),labels = c(2001:2022))
# Set Y-axis
axis(side = 2, at = c(-30,0,30,60,90,120,150,180,210), labels = c("-30%","0%","30%","60%","90%","120%","150%","180%","210%"), las = 1)
图表的注释
通过以上坐标轴的定制,R输出的图形已经将已有的数据淋漓尽致的表达出来了,但加上一些必要的解读是非常重要的。通过输出PDF格式的折线图文件,使用Adobe Illustrator打开进行注释和标记,最终得到了文章开始的成品。