Python 带有自定义渐变着色的单堆叠条形图
下面是我通过绘制粗线段得出的结果。 颜色为蓝色,具有不同的α,0<α<1 我的解决方案并没有像我希望的那个样工作,因为我并没有一个图例(我想要一个在不同alpha处显示蓝色渐变的图例) 此外,我发现matplotlib的缩放很有趣。条形图应该没有重叠,但是如果我调整窗口大小,线段之间的间隙将改变。这是与前面的图相同的图,只是在我用鼠标调整了图窗口的大小之后 我不确定是否有更好的方法来实现这一点,或者是否有一个不同的包我可以使用。 下面是我正在使用的代码片段Python 带有自定义渐变着色的单堆叠条形图,python,matplotlib,Python,Matplotlib,下面是我通过绘制粗线段得出的结果。 颜色为蓝色,具有不同的α,0
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
和线图。回答得好!谢谢,这太完美了!