我有一系列的线图,用于表示两个变量(x,y)在不同变量z的数值下的情况。通常我会像这样添加带有图例的线图:
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
# suppose mydata is a list of tuples containing (xs, ys, z)
# where xs and ys are lists of x's and y's and z is a number.
legns = []
for(xs,ys,z) in mydata:
pl = ax.plot(xs,ys,color = (z,0,0))
legns.append("z = %f"%(z))
ax.legends(legns)
plt.show()
但是我有太多的图表,图例会覆盖图表。我宁愿有一个颜色条来指示与颜色相对应的z值。我在库中找不到类似的东西,而且我所有尝试处理颜色条的尝试都失败了。显然,在尝试添加颜色条之前,我必须创建一组图。
有没有简单的方法可以做到这一点?谢谢。
编辑(澄清):
我想做这样的事情:
import matplotlib.pyplot as plt
import matplotlib.cm as cm
fig = plt.figure()
ax = fig.add_subplot(111)
mycmap = cm.hot
# suppose mydata is a list of tuples containing (xs, ys, z)
# where xs and ys are lists of x's and y's and z is a number between 0 and 1
plots = []
for(xs,ys,z) in mydata:
pl = ax.plot(xs,ys,color = mycmap(z))
plots.append(pl)
fig.colorbar(plots)
plt.show()
但是根据Matplotlib的参考文档,这种方法行不通,因为一个图形列表并不是一个"可映射"的对象,无论这是什么意思。
我创建了一个替代的绘图函数,使用了LineCollection。
def myplot(ax,xs,ys,zs, cmap):
plot = lc([zip(x,y) for (x,y) in zip(xs,ys)], cmap = cmap)
plot.set_array(array(zs))
x0,x1 = amin(xs),amax(xs)
y0,y1 = amin(ys),amax(ys)
ax.add_collection(plot)
ax.set_xlim(x0,x1)
ax.set_ylim(y0,y1)
return plot
xs
和ys
是包含X和Y坐标的列表的列表,而zs
是用于为每条线设置不同条件颜色的列表。虽然如此,但感觉有点笨拙...我认为应该有更好的方法来实现。我喜欢plt.plot()
函数的灵活性。
c=cmap.to_rgba(i + 1)
应该是c=cmap.to_rgba(value)
,其中value
是应映射为该颜色的线所关联的值。 - Bobson Dugnutt