截至目前,我正在使用Matplotlib生成图表。
可以使用一些参数(as mentioned in this guide)调整图上的图例。但是我希望在图例中有一些特定内容,如下图所示。
我想突出显示图例中的一个标签,如图所示(截至目前使用MS绘图完成)。
如果还有其他突出显示特定标签的方法,那也就足够了。
答案 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
实例中的元素以找出它们的坐标。这有两个困难:
get_window_extent
方法获得的坐标以像素为单位,而不是“数据”坐标,因此我们需要使用变换函数。对变换进行了很好的概述here。legend
实例有两个有用的属性,legend.legendHandles
和legend.texts
- 两个列表分别包含一行艺术家和文本标签。人们需要获得两个元素的边界框,同时记住实现可能不完美并且是特定于后端的(c.f。this SO问题)。这是一种正确的方法,但这不是这个答案中的那个,因为...... ..因为幸运的是,在你的情况下,图例项似乎是均匀分开的,所以我们可以只获取图例框,将其拆分为多个等于图例中行数的矩形,然后绘制其中一个屏幕上的矩形。下面我们将定义两个函数,一个用于获取图例框的数据坐标,另一个用于将它们分割成块并根据索引绘制矩形:
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)
会产生以下情节:
请注意,只有在绘制完图形后才能以这种方式注释图例。
答案 1 :(得分:0)
为了突出显示特定标签,您可以用粗体表示。 这是指向另一个SO答案的链接,该答案建议如何使用Latex格式化图例的条目: