我有一个两个变量(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参考,这将不起作用,因为图的列表不是“可Map的”,无论这意味着什么。
我使用LineCollection
创建了一个替代的plot函数:
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
是对每行着色的不同条件的列表。虽然感觉有点像cludge ......我认为会有一种更简洁的方法来做到这一点。我喜欢plt.plot()
函数的灵活性。
4条答案
按热度按时间osh3o9ms1#
(我知道这是一个老问题,但是...)Colorbars需要一个
matplotlib.cm.ScalarMappable
,plt.plot
产生的线不是标量可Map的,因此,为了制作一个colorbar,我们需要制作一个标量可Map的。好的。所以
ScalarMappable
的构造函数接受一个cmap
和一个norm
示例。(norms将数据缩放到0-1的范围,cmaps您已经使用过,并接受0-1之间的数字并返回颜色)。所以在您的例子中:由于您的数据已经在0-1的范围内,因此可以将
sm
的创建简化为:编辑:matplotlib v1.2或更高版本的代码变为:
编辑:matplotlib v1.3或更高版本的代码变为:
编辑:matplotlib v3.1以上版本简化为:
uidvcgyl2#
这里有一种方法可以在使用plt.plot()的同时完成这个任务,基本上,你可以做一个一次性的图,然后从那里得到颜色条。
这有点浪费,但很方便。如果你制作多个图,这也不是很浪费,因为你可以调用plt.colorbar()而不重新生成它的信息。
u3r8eeie3#
下面是一个稍微简单的例子,灵感来自于Boris和Hooked给出的最佳答案(谢谢你的好主意!):
1.离散彩条
离散colorbar更复杂,因为
mpl.cm.get_cmap()
生成的colormap不是colorbar()
参数所需的可Map图像。需要生成一个dummie可Map图像,如下所示:这将生成一个带有离散色条的图:
2.连续色条
连续色条较少涉及,因为
mpl.cm.ScalarMappable()
允许我们获得colorbar()
的“图像”。这将生成一个带有连续色条的图:
**[旁注]**在这个例子中,我个人不知道为什么
cmap.set_array([])
是必要的(否则我们会得到错误消息)。如果有人了解幕后的原理,请评论:)l3zydbqr4#
由于这里的其他答案尝试使用虚拟图,这不是真正的好风格,这里是一个通用的代码
离散彩条
离散色条的生成方式与连续色条的生成方式相同,只是使用了不同的Normalization。在这种情况下,应该使用
BoundaryNorm
。