在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打开进行注释和标记,最终得到了文章开始的成品。



发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注