Matplotlib:如何绘制一个填充有颜色图的小矩形作为图例
Matplotlib: How to plot a small rectangle filled with a colormap as a legend
我不想在绘图旁边绘制颜色条,而是想绘制一个填充有颜色图的小矩形作为图例。
通过执行以下技巧,我已经可以绘制一个填充任何颜色的小矩形:
axis0, = myax.plot([], linewidth=10, color='r')
axis =[axis0]
legend=['mytext']
plt.legend(axis,
legend)
我可以对颜色图做同样的事情吗?谢谢!
据我所知,除了从头开始创建矩形和图例外,别无他法。这是一种方法(主要基于):
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()
如果您计划对多个地块执行此操作,您可能需要创建一个 custom legend handler as shown in . You may also want to consider other ways of displaying the colorbar, such as in the examples shown and here and here。
文档:legend guide
在我的 CMasher 包中,我实现了一个名为 set_cmap_legend_entry()
的函数,它就是为您完成的。
您可以给它一个绘图元素和一个标签,它会自动为它创建一个颜色图图例条目,如下图所示(请参阅 here 了解相关文档):
我不想在绘图旁边绘制颜色条,而是想绘制一个填充有颜色图的小矩形作为图例。
通过执行以下技巧,我已经可以绘制一个填充任何颜色的小矩形:
axis0, = myax.plot([], linewidth=10, color='r')
axis =[axis0]
legend=['mytext']
plt.legend(axis,
legend)
我可以对颜色图做同样的事情吗?谢谢!
据我所知,除了从头开始创建矩形和图例外,别无他法。这是一种方法(主要基于
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()
如果您计划对多个地块执行此操作,您可能需要创建一个 custom legend handler as shown in
文档:legend guide
在我的 CMasher 包中,我实现了一个名为 set_cmap_legend_entry()
的函数,它就是为您完成的。
您可以给它一个绘图元素和一个标签,它会自动为它创建一个颜色图图例条目,如下图所示(请参阅 here 了解相关文档):