突出显示图例中的标签,matplotlib

时间:2016-10-21 11:28:49

标签: python matplotlib plot legend

截至目前,我正在使用Matplotlib生成图表。

可以使用一些参数(as mentioned in this guide)调整图上的图例。但是我希望在图例中有一些特定内容,如下图所示。 enter image description here

我想突出显示图例中的一个标签,如图所示(截至目前使用MS绘图完成)。

如果还有其他突出显示特定标签的方法,那也就足够了。

2 个答案:

答案 0 :(得分:1)

FLab的回答实际上是非常合理的,因为回溯绘制项目的坐标会有多么痛苦。然而,出版级数字的要求往往是不合理的,看到MS Paint挑战matplotlib是回答这个问题的充分动力。

让我们从matplotlib图库中考虑this example作为起点:

N = 100
x = np.arange(N)
fig = plt.figure()
ax = fig.add_subplot(111)
xx = x - (N/2.0)
plt.plot(xx, (xx*xx)-1225, label='$y=x^2$')
plt.plot(xx, 25*xx, label='$y=25x$')
plt.plot(xx, -25*xx, label='$y=-25x$')
legend = plt.legend()
plt.show()

绘制图像后,我们可以回溯legend实例中的元素以找出它们的坐标。这有两个困难:

  1. 我们通过get_window_extent方法获得的坐标以像素为单位,而不是“数据”坐标,因此我们需要使用变换函数。对变换进行了很好的概述here
  2. 找到合适的边界很棘手。上面的legend实例有两个有用的属性,legend.legendHandleslegend.texts - 两个列表分别包含一行艺术家和文本标签。人们需要获得两个元素的边界框,同时记住实现可能不完美并且是特定于后端的(c.f。this SO问题)。这是一种正确的方法,但这不是这个答案中的那个,因为......
  3. ..因为幸运的是,在你的情况下,图例项似乎是均匀分开的,所以我们可以只获取图例框,将其拆分为多个等于图例中行数的矩形,然后绘制其中一个屏幕上的矩形。下面我们将定义两个函数,一个用于获取图例框的数据坐标,另一个用于将它们分割成块并根据索引绘制矩形:

    from matplotlib.patches import Rectangle
    
    def get_legend_box_coord(ax, legend):
        """ Returns coordinates of the legend box """
        disp2data = ax.transData.inverted().transform
        box = legend.legendPatch
        # taken from here:
        # https://stackoverflow.com/a/28728709/4118756
        box_pixcoords = box.get_window_extent(ax)
        box_xycoords = [disp2data(box_pixcoords.p0), disp2data(box_pixcoords.p1)]
        box_xx, box_yy = np.array(box_xycoords).T
        return box_xx, box_yy
    
    def draw_sublegend_box(ax, legend, idx):
        nitems = len(legend.legendHandles)
        xx, yy = get_legend_box_coord(ax, legend)
        # assuming equal spacing between legend items:
        y_divisors = np.linspace(*yy, num=nitems+1)
        height = y_divisors[idx]-y_divisors[idx+1]
        width = np.diff(xx)
        lower_left_xy = [xx[0], y_divisors[idx+1]]
    
        legend_box = Rectangle(
                xy = lower_left_xy,
                width = width,
                height = height,
                fill = False,
                zorder = 10)
        ax.add_patch(legend_box)
    

    现在,调用draw_sublegend_box(ax, legend, 1)会产生以下情节: sublegendbox

    请注意,只有在绘制完图形后才能以这种方式注释图例。

答案 1 :(得分:0)

为了突出显示特定标签,您可以用粗体表示。 这是指向另一个SO答案的链接,该答案建议如何使用Latex格式化图例的条目:

Styling part of label in legend in matplotlib

enter image description here