如何用Python实现有渐变的水平堆叠条状图
Admin 2022-10-31 群英技术资讯 1123 次浏览
起源:做数据处理时候需要制造一张如下的图片:
示例图
恰逢最近在学Python,然后就想试一下用python去实现,因为稍微接触过matplotlib这个库,然后就想着用它去实现
首先通过查资料,才知道这种图的名字叫做“水平堆叠条状图”,然后使用Matplotlib.plot.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的选择;
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本篇文章给大家带来了关于Python的相关知识,主要介绍了python爬虫如何爬取网页数据并解析数据,帮助大家更好的利用爬虫分析网页,下面一起来看一下,希望对大家有帮助。
这篇文章主要为大家详细介绍了python实现简单贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Python 数字类型用于数值的储存。数值类型是不允许改变的,如果改变数字数据类型的值,将重新分配内存空间。
9 月 10 日,张勇如期和蔡崇信完成阿里巴巴控股集团董事会主席的交接。但出人意料的是,他没有像 6 月说的 “专职担任阿里云智能集团董事长兼 CEO”,而是继续退出,以 “功勋阿里人” 的身份从阿里集团退休。
今天在做项目的时候遇到了要把图片转成base64格式,转成base64格式后可以直接显示,不用请求图片url,减少了http请求,但是转换成base64后,代码比图片的大小反而要大一点,所以各有利弊,可以根据自己的需要选择
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008