创建matplotlib图例后如何修改?

2024-05-01 21:45:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以访问图实例fig = pylab.gcf()。我知道在这个图中有一个图例,我可以通过myLegend = fig.gca().legend_访问它。现在我要更改图例的属性。其中一些我可以通过setter访问,比如myLegend.set_frame_on(True)。在

创建图例时,它接受多个关键字参数:

class matplotlib.legend.Legend(parent, handles, labels, loc=None, numpoints=None, markerscale=None, scatterpoints=None, scatteryoffsets=None, prop=None, fontsize=None, borderpad=None, labelspacing=None, handlelength=None, handleheight=None, handletextpad=None, borderaxespad=None, columnspacing=None, ncol=1, mode=None, fancybox=None, shadow=None, title=None, framealpha=None, bbox_to_anchor=None, bbox_transform=None, frameon=None, handler_map=None)

在创建图例后,如何修改图例中的所有关键字参数?在

其中一个问题是numpoints(图例中的标记数,默认值为2)。下面是我想如何更改它的示例:

这显示了我想如何对其进行编程

import pylab
pylab.plot(0,0,'ro', label = 'one point')
pylab.legend(loc = "lower left")
# no modifications above this line
setattr(pylab.gcf().gca().legend_, 'numpoints',1)
pylab.show()

这显示了我想要它的样子

^{pr2}$

我已经检查了源代码,有一个numpoint变量被改变了,但是上面的大小写没有更新到屏幕上。我错过了什么?在


Tags: 实例none参数属性fig关键字gcfloc
3条回答

我写了一个函数modify_legend,它在创建一个图例之后修改它。它基本上从已经创建的图例中读取所有参数,用您提供的键值参数更新它,并用所有可能的参数再次调用legend(...)。在

您的问题将通过以下方式解决:

import pylab
pylab.plot(0,0,'ro', label = 'one point')
pylab.legend(loc = "lower left")

modify_legend(numpoints = 1)

pylab.show()

以下是modify_legend的代码:

^{pr2}$

规范说明:

  • 一些参数可以很容易地从Legend对象中读取,其他参数(如titlefancybox)需要一些“艺术性”。您可以检查^{}以了解它是如何完成的以及为什么这样做的。在
  • 当最初用prop创建图例时,fontsize参数的额外条件用于覆盖字体大小,因为prop通常会覆盖{}。在
  • 我没有测试所有的案例,因为我没有太多的时间(尤其是bbox_to_anchor和{}-参数),所以请随时尝试并改进代码:)

你在图例中看到的实际上是一个Line2D。在创建该行之后更改numpoints不会更新该行,因此您必须获取Line2D对象的句柄并手动删除其中一个点:

import pylab
pylab.plot(0,0,'ro', label = 'one point')
legend = pylab.legend(loc = "lower left")
markers = legend.get_children()[0].get_children()[1].get_children()[0].get_children()[0].get_children()[0].get_children()[1]
markers.set_data(map(pylab.mean, markers.get_data()))
pylab.show()

必须使用get_children()链,因为matplotlib将行包装在多个水平和垂直包装层中。上面的代码片段应该足以让您大致了解情况,但是在实际应用程序中,获得句柄的更好方法是跟随the legend guide's hint on legend handlers并使用以某种方式存储行的自定义HandlerLine2D。在

可以使用正确的关键字/参数再次使用命令pylab.legend。这将修改现有的图例,而不是创建新的图例。下面是你的例子,稍作修改。在

import pylab
pylab.plot(0,0,'ro', label = 'one point')
pylab.legend(loc = "lower left")
# Change the number of markers shown in the legend
pylab.legend(numpoints = 1, loc = "lower left")

pylab.show()

希望有帮助。在

相关问题 更多 >