python画图渐变颜色,用python画渐变色
本文主要详细介绍Python实现渐变颜色的水平堆栈图。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。
本文分享Python实现渐变水平叠加图的具体代码,供大家参考。具体内容如下
关键词:python,matplotlib,barh,堆栈
缘起:做数据处理的时候,需要做一张图,如下图:
示例图
正好最近在学python,然后想尝试用Python实现,因为接触了一点matplotlib库,然后想用它实现。
首先通过查资料,才知道这种图的名字叫做“水平堆叠条状图”,然后使用Matplotlib.plot.barh()就可以实现水平堆叠的效果;
或者横向和纵向叠加的效果。网上有不少教程,这里就不描述了,主要是记录如何实现渐变。
一开始找资料,没找到这个叠图的渐变颜色怎么做。
如果有大哥找到了简单的方法,请告诉我!然后自己试着写一些语句来实现它;现在把研究过程做个记录。
首先是绘图函数的认识
barh函数的参数很多,但我们只关注几个参数:X表示坐标比如上图中的E1 E2 E3(可以理解为刻度值),width表示当前栈的长度。这个值很关键!值是当前堆叠部分的起点,left这个值也很关键表示当前堆叠部分的颜色,遵循color顺序。但是它的范围(0——0.1),也就是我们需要把实际的(R,G,B)值除以255然后传入表示当前堆叠部分颜色透明度的RGB,也就是和上面的颜色参数一起形成(RGBA)。alpha表示当前堆叠部分的图形样本,即上图中类似“标签=二级索引1”的图例;当此参数为空时,将不会创建图例。如果不为空,将根据输入字符串创建图例。默认情况下,不支持中文。如果要使用中文,需要在导入matplotlib后添加以下两句话。
#用于正常显示中文。
PLT . RC params[ font . sans-serif ]=[ sim hei , Times New Roman]
PLT . RC params[ axes . unicode _ MINUS ]=False
`
label
x是数轴上显示的刻度值(也可以重命名);
宽度代表堆积(填充)长度,左边是本次填充的起点。那么结合这两个参数,我们就可以把本来应该一次填充的长度分成若干次填充,然后对这几次填充分别使用相邻的RGB值,就会呈现出一种渐变的效果。
#填充完成后。
将matplotlib.pyplot作为plt导入
将numpy作为np导入
PLT . RC params[ font . sans-serif ]=[ sim hei , times new Roman] #用于正常显示中文标签。
PLT . RC params[ 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的选择;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。