Python Matplotlib:如何为图例添加“坏”颜色?

7uzetpgm  于 2023-10-24  发布在  Python
关注(0)|答案(3)|浏览(166)

matplotlib中的颜色图允许用特定的颜色标记“坏”值,即NaN。当我们绘制颜色条时,这个颜色不包括在内。是否有一种首选的方法,既有连续的颜色条,又有一个离散的图例来表示坏值的特定颜色?

**编辑:**当然,可以使用“扩展”功能。但是,这种解决方案并不令人满意。图例/颜色条的功能是向用户阐明颜色的含义。在我看来,这种解决方案并没有传达值是NaN。

代码示例:

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

data = np.random.rand(10, 10)
data[0:3, 0:3] = np.nan  # some bad values for set_bad

colMap = cm.RdBu
colMap.set_bad(color='black')

plt.figure(figsize=(10, 9))
confusion_matrix = plt.imshow(data, cmap=colMap, vmin=0, vmax=1)
plt.colorbar(confusion_matrix)
plt.show()

它产生:

beq87vna

beq87vna1#

图例元素可以按如下方式创建和使用:

from matplotlib.patches import Patch

legend_elements = [Patch(facecolor=colMap(np.nan), label='Bad values')]
plt.legend(handles=legend_elements)
tquggr8v

tquggr8v2#

您可以使用https://matplotlib.org/3.1.1/tutorials/colors/colorbar_only.html#discrete-intervals-colorbar上显示的用于超范围绘图的方法之一来完成此操作
将坏值的颜色设置为-999,并使用关键字extend
另一种方法是使用掩码绘图,如here所示。
另一种方法是使用cmap.set_bad()。一个例子是here

qyzbxkaa

qyzbxkaa3#

虽然将其添加到图例是一个选项(请参阅JohanC's answer),但颜色在语义上属于颜色条,我通常不希望在带有颜色条的颜色编码图上有单独的图例。
经过长时间的实验,我发现最好的方法是添加一个单独的单色colorbar,与适当的colorbar相关联:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.cm as cm

data = np.random.rand(10, 10)
data[0:3, 0:3] = np.nan  # some bad values for set_bad

colMap = cm.RdBu
colMap.set_bad(color='purple')

plt.figure(figsize=(10, 9))
plt.grid(False)
confusion_matrix = plt.imshow(data, cmap=colMap, vmin=0, vmax=1)
cbar= plt.colorbar(confusion_matrix)

sm = cm.ScalarMappable(cmap= mpl.colors.ListedColormap([colMap.get_bad()]))
divider = make_axes_locatable(cbar.ax)  # for tight_layout compatibility
nan_ax = divider.append_axes("bottom", size= "5%", pad= "3%", aspect= 1, anchor= cbar.ax.get_anchor())
nan_ax.grid(visible=False, which='both', axis='both')  # required for Colorbar constructor below
nan_cbar = mpl.colorbar.Colorbar(ax=nan_ax, mappable=sm, orientation='vertical')
nan_cbar.set_ticks([0.5], labels=['NaN'])
nan_cbar.ax.tick_params(length= 0)  # optional to drop the unnecessary tick line

NaN颜色条的大小和距离可以通过上面的sizepad进行调整。

  • 关于拟议的替代办法 *

正如你在编辑中所写的,另一个选择是滥用extend,但是颜色将直接添加到颜色条的下方/上方,没有可见的间隙,并且在API中没有明确的方法将标签与它关联起来:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.cm as cm

data = np.random.rand(10, 10)
data[0:3, 0:3] = np.nan  # some bad values for set_bad

colMap = cm.RdBu
colMap.set_under(color='purple')

plt.figure(figsize=(10, 9))
plt.grid(False)
confusion_matrix = plt.imshow(data, cmap=colMap, vmin=0, vmax=1)
cbar= plt.colorbar(confusion_matrix, extend='min', extendrect=True)

第三种选择是创建一个新的色彩Map表,并为NaN值保留一部分,但这也很麻烦,并且与真实的颜色没有明显的差距。

相关问题