📜  在图例中找不到带有标签的句柄 - Python (1)

📅  最后修改于: 2023-12-03 15:23:31.989000             🧑  作者: Mango

在图例中找不到带有标签的句柄 - Python

当你使用Python绘制图表时,你可能会遇到在图例中找不到带有标签的句柄的情况。这通常发生在使用matplotlib库时,它是Python中最流行的绘图库之一。在matplotlib中,每个数据系列都与一个句柄(handle)相关联,句柄通常是一个颜色及标记的组合。使用句柄可以轻松地创建和修改图例。图例是帮助理解图表内容的关键,因为它们解释了不同颜色和标记的含义。

然而,有时候你可能需要将额外的标签添加到已经存在的句柄上,比如添加一个线型或文字标签。这时候就需要在图例中找到带有标签的句柄。

如果你遇到了这种情况,可以尝试以下解决方案:

1.创建自定义句柄

一种解决方案是创建自定义句柄。通过创建一个带有标签的句柄,你可以将标签添加到图例中。下面是一个示例代码,展示如何创建自定义句柄:

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D

custom_handle = Line2D([0], [0], color='blue', label='custom label')

plt.plot([1, 2, 3], [4, 5, 6], color='blue', marker='o', linestyle='--', label='_nolegend_')
plt.legend(handles=[custom_handle])
plt.show()

在这个示例代码中,我们首先创建了自定义句柄custom_handle,它是一个蓝色线条,并带有标签“custom label”。接下来,我们在图表中绘制一条蓝色虚线,并使用‘_nolegend_’标记防止该线条出现在图例中。最后,我们将自定义句柄添加到图例中,并显示图表。

2.使用Proxy Artist

另一种解决方案是使用Proxy Artist。一个Proxy Artist是一个虚拟的句柄,可以用于代表其他句柄。使用Proxy Artist可以为每个句柄添加额外的标签,然后将Proxy Artist添加到图例中,以便标签能够显示。

下面是一个示例代码,展示如何使用Proxy Artist

import matplotlib.pyplot as plt
from matplotlib.projections import get_projection_class
from mpl_toolkits.axes_grid1 import make_axes_locatable
from matplotlib.transforms import Bbox

def get_image_handles(image, ax):
    """获取绘制图像的handle"""
    im_extent = ax.get_images()[0].get_extent()
    transform = ax.transData.inverted()
    bbox = Bbox.from_extents(transform.transform([[im_extent[0],im_extent[2]], [im_extent[1],im_extent[3]]]))
    image_handle = make_axes_locatable(ax).append_axes("right", size="5%", pad=0)
    image_handle.set_axes_locator(ax.figure.add_axes(ax.get_position(True), bbox_transform=ax.figure.transFigure))
    image_handle.axis('off')
    image_handle.imshow(image, extent=im_extent, aspect='auto')
    return image_handle

def add_custom_legend(handles, labels):
    """创建自定义图例"""
    fig, ax = plt.subplots(figsize=(0.1, 0.1))
    bbox = fig.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
    ax.set_position([0, 0, 1, 1])
    ax.axis('off')
  
    # 添加句柄和标签到图例
    for handle, label in zip(handles, labels):
        ax.add_artist(handle)
        handle.set_label(label)

    # 添加图例
    legend = ax.legend(handles=handles, loc='center', bbox_to_anchor=bbox, borderaxespad=0.)
    legend.get_frame().set_linewidth(0.0)
    legend.legendPatch.set_alpha(0.0)
  
    # 获取图例图像,并在标签后添加
    for line in legend.get_lines():
        image_handle = get_image_handles(line.get_segments(), ax)
        line.remove()
        image_legend = ax.legend([image_handle], [''], handlelength=0, handletextpad=0, markerscale=0, loc='center', bbox_to_anchor=bbox, borderaxespad=0.)
        image_legend.get_frame().set_linewidth(0.0)
        image_legend.legendPatch.set_alpha(0.0)

    plt.show()

# 创建自定义句柄
custom_handles = [plt.Line2D([0], [0], color='r', lw=2),
                  plt.Line2D([0], [0], color='b', lw=2)]

# 添加额外的标签
labels = ['label 1', 'label 2']

# 创建自定义图例
add_custom_legend(custom_handles, labels)

在这个示例代码中,我们首先创建了两个自定义句柄custom_handles,分别是红色和蓝色的线条。接下来,我们添加了额外的标签到句柄上。

然后,我们使用add_custom_legend()函数创建自定义图例。在这个函数中,我们首先创建了一个空的图表,并添加了两个自定义句柄和它们的标签。我们将这些句柄添加到图例中,并使用bbox参数控制了图例的位置。然后,我们获取每个句柄的图像,并在标签后添加它们到图例中。

最后,我们显示了包含自定义图例的图表,图例中带有标签。

总的来说,在matplotlib中找不到带有标签的句柄并不是一件难事。你可以创建自定义句柄或使用Proxy Artist,并将它们添加到图例中来显示带有标签的句柄。