有没有办法让matplotlib的颜色图上的非零值区分开?

问题描述

我正在制作一个2d直方图,其值的范围可以从0到大约100,但是我希望1的值容易与0相区别。有没有简便的方法来实现此目的?我知道您可以制作自定义贴图,但是不确定是否有办法使0值成为一种颜色,其余的成为简单的连续贴图。

解决方法

您可以为颜色图使用'under'颜色,并将vmin设置为1。这样,所有值小于1的单元格都将被'under'颜色着色。 colorbarextend=选项显示“下”(和/或“上”)颜色。默认使用一个小三角形; extendrect=True将其显示为小矩形。

如果只想将零值保留为空白,则可以设置cmin=1,该值将切断所有低于1的值。

import numpy as np
import matplotlib.pyplot as plt
import copy

x = np.random.randn(10000).cumsum()
y = np.random.randn(2000,5).cumsum(axis=1).ravel()
fig,(ax1,ax2) = plt.subplots(ncols=2)

cmap = copy.copy(plt.get_cmap('hot'))
cmap.set_under('turquoise')
_,_,hist1 = ax1.hist2d(x,y,bins=(50,30),cmap=cmap,vmin=1)
ax1.set_title('Using $vmin$ and $set_under$')
plt.colorbar(hist1,ax=ax1,extend='min',extendrect=True)

_,hist2 = ax2.hist2d(x,cmap='inferno',cmin=1)
ax2.set_title('Using $cmin$')
plt.colorbar(hist2,ax=ax2)

plt.show()

example plot