我有两个变量(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()
函数的灵活性。
这里有一个稍微简单的例子,它的灵感来自于Boris和Hooked给出的最重要的答案(感谢您的好主意!)以下内容:
一。离散颜色条
离散colorbar更为复杂,因为由
mpl.cm.get_cmap()
生成的colormap不是作为colorbar()
参数所需的可映射图像。需要生成一个可映射的假人,如下所示:这将生成一个具有离散颜色条的绘图:
2。连续色条
因为
mpl.cm.ScalarMappable()
允许我们获得colorbar()
的“图像”,所以连续的颜色栏不太重要。这将生成具有连续颜色条的绘图:
在这个例子中,我个人不知道为什么需要
cmap.set_array([])
(否则我们会收到错误消息)。如果有人理解这些原则,请评论:)这里有一种方法可以在仍然使用plt.plot()的情况下执行此操作。基本上,你做一个一次性的情节,从那里得到色条。
有点浪费,但很方便。如果您可以调用plt.colorbar()来生成多个图,而不必重新生成它的信息,这也不是很浪费。
(我知道这是个老问题,但是…)Colorbars需要一个
matplotlib.cm.ScalarMappable
,plt.plot
生成的行不是标量可映射的,因此,为了生成colorbar,我们需要使标量可映射。好的。因此,
ScalarMappable
的构造函数接受一个cmap
和一个norm
实例。(norms将数据缩放到0-1的范围,cmap是您已经使用过的,它采用0-1之间的数字并返回颜色)。所以在你的情况下:因为您的数据已经在0-1范围内,所以可以将
sm
创建简化为:希望能帮上忙。
编辑:对于matplotlib v1.2或更高版本,代码变为:
编辑:对于matplotlib v1.3或更高版本,代码变为:
编辑:对于matplotlib v3.1或更高版本,简化为:
相关问题 更多 >
编程相关推荐