【发布时间】:2011-12-01 14:02:14
【问题描述】:
对于变量 z 的许多不同值,我有两个变量 (x,y) 的一系列线图。我通常会添加带有这样的图例的线图:
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() 函数的灵活性。
【问题讨论】:
-
您的问题有点令人困惑——您是要创建自己的 colormap 以对应您的 z 值颜色,还是只是创建一个可以附加到一系列线图以节省空间?颜色条的一种替代方法可能是在定义图例时使用
bbox_to_anchor在图形边界之外添加包含图例。 -
只是为了附加一个颜色条。我不介意使用其中一种内置颜色图。
-
即使在图表之外,图例也不是一个可行的选项。我在这张图中有 50 多条线。此外,图例将比读者需要的信息多得多。它会使图表混乱。它们是不同温度值的模拟曲线。颜色条将在视觉上充分告知读者每条曲线的温标(热、冷和非常冷)。每条线的确切温度值并不那么重要。
-
这样做的方法是通过一个行集合,就像你现在一样(尽管你可以稍微清理几个调用)。
plot返回Line2D对象,它们固有地具有离散颜色,而不是可以显示在颜色条上的“可映射”颜色。话虽如此,您可以从颜色图中创建一个“假”标量可映射对象并为其显示颜色条,但这比仅使用 LineCollection 更有效。 -
我知道这是超级旧的,但这似乎也很相关:stackoverflow.com/questions/26545897/…
标签: python matplotlib colorbar