matplotlib 具有自定义渐变着色的堆叠条形图

ltskdhd1  于 2023-11-22  发布在  其他
关注(0)|答案(2)|浏览(113)


的数据
这是我通过绘制粗线段得出的结果。颜色是蓝色的,有不同的alpha值,0 < alpha < 1。
我的解决方法不像我想的那样工作,因为我没有图例(我想要一个在不同alpha下显示蓝色渐变的图例)。
另外,我发现matplotlib的缩放方式很有趣,线条之间不应该有重叠,但是如果我调整窗口大小,线段之间的差距就会改变。

这是和上一个相同的图,只是在我用鼠标调整了图窗口的大小之后。
我不确定是否有更好的方法来实现这一点,或者是否有不同的包可以使用。

import matplotlib.pyplot as plt
x1  =[0, 19, 39, 46, 60, 79]
x2 = [19, 39, 46, 60, 79, 90]
alpha_list = [-0.8402, -0.6652, 0.0, -0.5106, -0.8074, 0.0]
plt.figure()
for idx,x in enumerate(x1):
    plt.plot([x1[idx],x2[idx]],[0,0],color = 'blue',alpha=alpha_list[idx],linewidth =20)
plt.show()

字符串

4szc88ey

4szc88ey1#

我想alpha只是使用不同深浅的蓝色的一种变通方法?在这种情况下,可以使用Blues颜色Map表。
可以使用LineCollection绘制几条线。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

x1  =[0, 19, 39, 46, 60, 79]
x2 = [19, 39, 46, 60, 79, 90]
alpha_list = [-0.8402, -0.6652, 0.0, -0.5106, -0.8074, 0.0]

verts = np.dstack((np.c_[x1, x2], np.zeros((len(x1), 2))))

fig, ax = plt.subplots()
lc = LineCollection(verts, linewidth=40, cmap="Blues_r", array=np.array(alpha_list))
ax.add_collection(lc)

ax.autoscale()
ax.set_ylim(-1,1)
fig.colorbar(lc)
plt.show()

字符串


的数据

uujelgoq

uujelgoq2#

我认为一个解决办法是使用plt.barh。这里有一个使用归一化颜色Map的例子。每个颜色在传递给plt.barh之前都会转换为RGBA。

import matplotlib.pyplot as plt
from matplotlib import colors
import matplotlib.cm as cmx

x1  =[0, 19, 39, 46, 60, 79]
x2 = [19, 39, 46, 60, 79, 90]

values = range(len(x1))
jet = cm = plt.get_cmap('jet') 
cNorm  = colors.Normalize(vmin=0, vmax=values[-1])
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet)

fig, ax = plt.subplots()

for idx, x, y in zip(values,x1, x2):          
    colorVal = scalarMap.to_rgba(values[idx])  
    start = x
    end = y
    width=end-start
    ax.barh(y = 0, width = width, left=start, height = 0.1, label = str(idx), color=colorVal)         
ax.set_ylim(-.5,0.5)
ax.legend()

字符串
返回:

如果您真的只想更改单个颜色的alpha透明度,则只需将最后一个元素的alpha_list[idx ]输入到RGBA元组colorVal中。

fig, ax = plt.subplots()
alpha_list = [0.8402, 0.6652, 0.01, 0.5106, 0.8074, 0.0]
for idx, x, y in zip(values,x1, x2):          
    colorVal = (0.0, 0.3, 1.0, alpha_list[idx])
    start = x
    end = y
    width=end-start
    ax.barh(y = 0, width = width, left=start, height = 0.1, label = str(idx), color=colorVal)         

ax.set_ylim(-.5,0.5)
ax.legend()


相关问题