Python 带有自定义渐变着色的单堆叠条形图

Python 带有自定义渐变着色的单堆叠条形图,python,matplotlib,Python,Matplotlib,下面是我通过绘制粗线段得出的结果。 颜色为蓝色,具有不同的α,0

下面是我通过绘制粗线段得出的结果。 颜色为蓝色,具有不同的α,0<α<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()

我认为解决方法是使用
plt.barh
。下面是一个使用标准化颜色贴图的示例。每种颜色在传递到
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_列表[idx]输入RGBA元组
colorVal
。由于某些原因,RGBA不喜欢负的alpha值,所以请注意,我将它们全部改为正

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()

我想alpha只是使用不同深浅蓝色的一种变通方法?在这种情况下,可以使用
蓝色
彩色贴图。
可以使用
线集合
绘制多条线

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()

您能提供您的代码吗?刚刚提供了,谢谢。我一直想知道如何使用
cmap
和线图。回答得好!谢谢,这太完美了!