Matplotlib:如何绘制一个填充有颜色映射的小矩形作为图例

6

我希望在我的绘图旁边不是画一个色条,而是画一个填充了颜色映射的小矩形作为图例。

我已经可以通过以下方法绘制填充任何颜色的小矩形:

axis0, = myax.plot([], linewidth=10, color='r')

axis =[axis0]
legend=['mytext']

plt.legend(axis,
           legend)

我可以使用颜色映射来做同样的事情吗?谢谢!
2个回答

4
据我所知,除了从头开始创建矩形和图例之外,没有其他方法可以完成这个任务。以下是一种方法(主要基于this answer):
import numpy as np                                    # v 1.19.2
import matplotlib.pyplot as plt                       # v 3.3.2
import matplotlib.patches as patches
from matplotlib.legend_handler import HandlerTuple

rng = np.random.default_rng(seed=1)

ncmaps = 5     # number of colormaps to draw for illustration
ncolors = 100  # number high enough to draw a smooth gradient for each colormap

# Create random list of colormaps and extract list of colors to 
# draw the gradient of each colormap
cmaps_names = list(rng.choice(plt.colormaps(), size=ncmaps))
cmaps = [plt.cm.get_cmap(name) for name in cmaps_names]
cmaps_gradients = [cmap(np.linspace(0, 1, ncolors)) for cmap in cmaps]
cmaps_dict = dict(zip(cmaps_names, cmaps_gradients))

# Create a list of lists of patches representing the gradient of each colormap
patches_cmaps_gradients = []
for cmap_name, cmap_colors in cmaps_dict.items():
    cmap_gradient = [patches.Patch(facecolor=c, edgecolor=c, label=cmap_name)
                     for c in cmap_colors]
    patches_cmaps_gradients.append(cmap_gradient)

# Create custom legend (with a large fontsize to better illustrate the result)
plt.legend(handles=patches_cmaps_gradients, labels=cmaps_names, fontsize=20,
           handler_map={list: HandlerTuple(ndivide=None, pad=0)})

plt.show()

legend_colormap

如果您计划对多个图进行此操作,您可能需要创建一个自定义图例处理程序,如此答案所示。您还可以考虑其他显示色条的方式,例如在这里这里这里所示的示例中。文档:图例指南

谢谢@Patrick FitzGerald,我会尝试一下! - firefly2517

0
在我的 CMasher 包中,我实现了一个名为 set_cmap_legend_entry() 的函数,可以为您完成此任务。 您只需提供一个绘图元素和一个标签,它就会自动为其创建一个色图图例项,就像下面显示的图片一样(有关此内容的文档,请参见这里):

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接