Python Matplotlib实现水平堆叠图的渐变色效果

Noah
Noah
发布时间:2026-10-15 | 5人浏览过
原创

本文介绍如何使用Python的Matplotlib库绘制水平堆叠条状图并实现渐变色效果。通过解析barh函数的width和left参数,将单个色块分割为多次填充,利用RGB颜色插值计算中间色值,从而消除分界线。文中详细演示了divid参数对渐变平滑度的影响及代码实现逻辑。

Python Matplotlib实现水平堆叠图的渐变色效果

本文分享使用Python实现具有渐变色效果的水平堆叠条状图的具体代码与方法,供读者参考。

关键词:python、matplotlib、barh、堆叠 背景:在进行数据处理时,需要生成如下所示的图表:

示例图

鉴于近期正在学习Python,尝试使用Python来实现该图表。由于之前接触过Matplotlib库,因此决定利用它来完成这一任务。

首先通过查阅资料,了解到这种图表被称为“水平堆叠条状图”,可以使用Matplotlib的plot.barh()函数来实现水平堆叠的效果。

关于水平或垂直堆叠效果的实现,网上已有大量教程,此处不再赘述。本文的重点在于记录如何实现堆叠图中的渐变色效果。

起初查找资料时,并未找到实现此类堆叠图渐变色效果的简便方法。若有读者知晓更简单的方案,欢迎告知。随后,通过自行编写代码尝试实现,现将研究过程记录如下。

barh函数关键参数解析

首先需要对绘图函数有基本认识。

barh函数包含众多参数,但在此主要关注以下几个关键参数: X:表示图表中的坐标值(如E1、E2、E3等,可理解为刻度值)。 width:表示当前堆叠部分的长度,此参数至关重要。 left:表示当前堆叠部分的起始位置,同样非常关键。 color:表示当前堆叠部分的颜色,遵循RGB顺序,但其取值范围为0到0.1,因此需要将实际的(R,G,B)值除以255后再传入。 alpha:表示当前堆叠部分的颜色透明度,与color参数结合构成RGBA格式。 label:表示当前堆叠部分的图形图例(如“label=二级指标1”)。若该参数为空,则不创建图例;若不为空,则根据传入字符串创建图例。默认情况下不支持中文,若需使用中文,需在import matplotlib后添加以下两行代码:

中文显示配置代码

#用来正常显示中文
plt.rcParams['font.sans-serif']=['SimHei','Times New Roman'] 
plt.rcParams['axes.unicode_minus']=False
`

渐变效果实现逻辑

接下来阐述实现渐变色效果的思考逻辑。

X对应数轴上显示的刻度值(也可重命名);width表示堆叠(填充)的长度,left表示本次填充的起始点。将这两个参数结合,可以将原本一次填充完成的长度分割为多次填充,并分别为这几次填充使用临近的RGB值,从而呈现出渐变效果。

基础堆叠图代码示例

# 一次填充完成
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei','Times New Roman'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False
    # 网上找到的渐变色的RGB配色方案
Color1 = np.array([131, 175, 155])
Color2 = np.array([200, 200, 169])
Color3 = np.array([249, 205, 173])

x = ["E1"]
Y1 = np.array([0.1])
Y2 = np.array([0.3])
plt.barh(x, Y1, align="center", color=Color1 / 255, alpha=1, label="ONE1")
plt.barh(x, Y2, left=Y1, color=Color2 / 255, alpha=1, label="ONE2")
plt.legend()
plt.show()

上述代码运行后的效果如下所示:

基于上述分析,我们对“ONE2”色块运用X、width、left、color参数进行分次填充,以实现渐变效果:

首先定义一个变量divid,该变量决定了填充的次数。

分次填充实现渐变

#填充次数,值越大渐变效果越好,但是计算量也会相应的增大
divid=20

其次,将原来的填充量以及颜色渐变差值分别除以divid。

颜色差值计算逻辑

Y2_rate=Y2/divid
#用下一个颜色减去当前色快的颜色;这也将会解释了我后来的完整代码里,将会严格要求Color个数大于 Y 的个数 
#实际上Color和Y大多数情况下是行向量,但仍然用“个数”来表述,为了更方便理解
Color_rate=(Color3-Color2)/divid

随后,将这两个计算后的值在barh函数中使用。

循环填充代码实现

for i in range(divid):
    if i==int( divid /2 ): #这里是去原先整个色块的中心RGB作为图例色
        plt.barh(x,Y_rate,left=Y1+Y_rate*i,color=(Color1+i*Color_rate) / 255, alpha=1.0,label='ONE2')
    else:
        plt.barh(x,Y_rate,left=Y1+Y_rate*i,color=(Color1+i*Color_rate) / 255, alpha=1.0)

运行后的效果如下:

为了说明divid对渐变效果的影响,我们分别使用递增的divid值进行演示。 当divid=2时,出现了明显的分界线。

当divid=8时,分界线被淡化,但仍隐约可见。

当divid=50时,几乎看不到分界线。

以上效果仅基于单个X和单个Y的色块渐变进行演示,旨在更好地展示方法和思路。在实际应用中,X和Y通常为较长的行向量,因此需要仔细斟酌divid的选择。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表