gpt4 book ai didi

python - 创建后如何修改matplotlib图例?

转载 作者:太空狗 更新时间:2023-10-29 18:08:13 58 4
gpt4 key购买 nike

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

创建图例时,它接受一些关键字参数:

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()

这显示了我希望它看起来像什么

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

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

最佳答案

我编写了一个函数 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 的代码:

def modify_legend(**kwargs):
import matplotlib as mpl

l = mpl.pyplot.gca().legend_

defaults = dict(
loc = l._loc,
numpoints = l.numpoints,
markerscale = l.markerscale,
scatterpoints = l.scatterpoints,
scatteryoffsets = l._scatteryoffsets,
prop = l.prop,
# fontsize = None,
borderpad = l.borderpad,
labelspacing = l.labelspacing,
handlelength = l.handlelength,
handleheight = l.handleheight,
handletextpad = l.handletextpad,
borderaxespad = l.borderaxespad,
columnspacing = l.columnspacing,
ncol = l._ncol,
mode = l._mode,
fancybox = type(l.legendPatch.get_boxstyle())==mpl.patches.BoxStyle.Round,
shadow = l.shadow,
title = l.get_title().get_text() if l._legend_title_box.get_visible() else None,
framealpha = l.get_frame().get_alpha(),
bbox_to_anchor = l.get_bbox_to_anchor()._bbox,
bbox_transform = l.get_bbox_to_anchor()._transform,
frameon = l._drawFrame,
handler_map = l._custom_handler_map,
)

if "fontsize" in kwargs and "prop" not in kwargs:
defaults["prop"].set_size(kwargs["fontsize"])

mpl.pyplot.legend(**dict(defaults.items() + kwargs.items()))

代码注释:

  • 一些参数可以很容易地从 Legend 对象中读取,其他参数(如 titlefancybox)需要一些“艺术”。你可以查看 matplotlib.legend.Legend.__init__看看它是如何以及为什么完成的。
  • fontsize 参数的额外条件用于在最初使用 prop 创建图例时覆盖字体大小,如 prop通常会覆盖 fontsize
  • 我没有测试所有情况,因为我没有太多时间(尤其是 bbox_to_anchorbbox_transform 参数),所以请随意尝试和改进代码:)

关于python - 创建后如何修改matplotlib图例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23689728/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com