我有以下代码:
import matplotlib.pyplot as plt
cdict = {
'red' : ( (0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)),
'green': ( (0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)),
'blue' : ( (0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45))
}
cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024)
plt.clf()
plt.pcolor(X, Y, v, cmap=cm)
plt.loglog()
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.colorbar()
plt.show()
这将使用指定的色图生成X轴与Y轴上的值v
的图形。X轴和Y轴是完美的,但色图在v
的最小值和最大值之间扩展。我想强制色彩Map表的范围在0和1之间。
我想到了使用:
plt.axis(...)
来设置轴的范围,但这只接受X和Y的最小值和最大值的参数,而不是颜色Map。
编辑:
为了清楚起见,假设我有一个图,其值范围为(0…0.3),以及另一个图,其值(0.2…0.8)。
在这两个图形中,我希望颜色条的范围为(0 ... 1).在两个图中,我希望使用上面的cdict
的完整范围使这个颜色范围相同(因此两个图中的0.25将是相同的颜色)。在第一个图表中,所有介于0.3和1.0之间的颜色都不会出现在图表中,但会出现在旁边的colourbar键中。在另一种情况下,0到0.2之间以及0.8到1之间的所有颜色都不会出现在图表中,但会出现在侧面的颜色条中。
5条答案
按热度按时间cuxqih211#
使用
vmin
和vmax
强制颜色的范围。下面是一个例子:6ovsh4lw2#
使用CLIM函数(相当于MATLAB中的CAXIS函数):
hyrbngr73#
不确定这是否是最优雅的解决方案(这是我使用的),但你可以将数据缩放到0到1之间,然后修改颜色条:
使用两个不同的限制,您可以控制颜色条的范围和图例。在本例中,栏中仅显示-0.5到1.5之间的范围,而颜色Map覆盖-2到2(因此这可能是您的数据范围,您在缩放之前记录该范围)。
因此,不是缩放颜色Map,而是缩放数据并使颜色条适合它。
cbjzeqam4#
使用图环境和.set_clim()
如果您有多个图,此替代方案可能更容易和更安全:
单个颜色条
最好的替代方法是对整个图使用单个颜色条。有不同的方法可以做到这一点,this教程对于理解最佳选择非常有用。我更喜欢这个解决方案,你可以简单地复制和粘贴,而不是以前的可视化colorbar部分的代码。
附言
我建议使用
pcolormesh
而不是pcolor
,因为它更快(更多的infos here)。nzrxty8p5#
colorbar范围也可以通过在
pcolormesh
/pcolor
调用中向clim=
kwarg传递元组来设置。如果在
pcolormesh
调用之后必须更新colorbar范围,那么最简单的方法是plt.clim
,正如其他人所提到的那样。另一种方法是通过pcolormesh
/pcolor
调用创建的QuadMesh
/PolyCollection
对象的colors.Normalize
对象。顺便说一下,
Quadmesh
驻留在Axes示例的collections
中,因此如果pcolormesh
的结果没有分配给变量,则也可以使用pmesh = plt.gca().collections[0]
。使用tom10's setup,可以写成如下形式。
在图的右侧附加一个颜色条可能会更“漂亮”,而不是为多个子图添加重复的颜色条。@ GM已经提出了一种解决方案,该解决方案通过对颜色条边界进行硬编码来实现,但是可以通过使用定义为here的函数来动态地设置边界。
对于手头的示例,其可以写成如下。