当前位置: 首页 > 知识库问答 >
问题:

创建matplotlib图例后如何修改它?

曾华翰
2023-03-14

我可以访问figure实例fig=pylab。gcf()。我知道在这个图中有一个图例,我可以通过myLegend=fig.gca()访问它。图例。现在我想更改图例的属性。其中一些我可以通过设置器访问,比如myLegend。将帧设置为on(真)

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

类matplotlib。传奇传奇(父项、句柄、标签、loc=None、numpoints=None、markerscale=None、scatterpoints=None、scatteryoffsets=None、prop=None、fontsize=None、borderpad=None、labelspace=None、handlelight=None、handleextpad=None、borderaxespad=None、columnspacing=None、ncol=1、mode=None、fancybox=None、shadow=None、title=None、framealpha=None、bb)ox\u to\u anchor=None、bbox\u transform=None、frameon=None、handler\u 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变量已更改,但大写字母未更新到屏幕。我错过了什么?

共有3个答案

华凯捷
2023-03-14

您在图例中看到的实际上是一个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()。上面的代码片段应该足以让您大致了解情况,但在实际应用程序中,获取句柄的更好方法是遵循图例指南中有关图例处理程序的提示,并使用定制的HandlerLine2D,以某种方式存储该行。

虞博涛
2023-03-14

您可以使用命令pylab。图例再次使用正确的关键字/参数。这将修改现有图例,而不是创建新图例。下面你会发现你的例子,稍微修改了一下。

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

希望能有帮助。

苏君昊
2023-03-14

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

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

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

modify_legend(numpoints = 1)

pylab.show()

以下是修改图例的代码:

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

代码注释:

  • 一些参数可以很容易地从图例对象中读取,其他参数(如标题fancybox)需要一些“艺术性”。您可以检查matplotlib。传奇传说__初始化以查看它是如何完成的以及为什么完成的
  • 当最初使用prop创建图例时,fontsize参数上的附加条件用于覆盖字体大小,因为prop通常覆盖fontsize
  • 我没有测试所有的案例,因为我没有太多的时间(特别是bbox\u-to\u锚定bbox\u转换-参数),所以请尝试并改进代码:)

 类似资料:
  • 问题内容: 我将一些matlpotlib函数集成到了一些django-celery任务中。 每次调用任务时,都会将更多RAM专用于python。不久之后,python占用了所有RAM。 问题: 如何释放此内存? 更新2-第二种解决方案: 我问过类似的问题,特别是有关内存锁定matplotlib错误的时候,但是我有一个很好的回答这个问题,以及如果使用多进程运行在单独的进程中绘图功能,其内存会自动释放

  • 我目前使用matplotlib以以下方式生成图例: 这在某种程度上是可行的,见1。但我在我的传奇中复制了信息。 我宁愿把传说分开。所以我有不同颜色的线对应于时间t,一条法线作为我的解析解,一个点作为我的模拟结果。 诸如此类 --(红线)t=25 --(蓝线)t=50 --(绿线)t=500 模拟 --解析解 现在有人知道我如何用matplotlib实现这一点了吗?

  • 问题内容: 我正在matplotlib中的轴对象上绘制图例,但是声称将其放置在智能位置的默认定位似乎不起作用。理想情况下,我希望图例可由用户拖动。如何才能做到这一点? 问题答案: 注意:现在已内置到matplotlib中 将按预期工作 好吧,我发现解决方案的点点滴滴分散在邮件列表中。我提出了一个很好的模块化代码块,您可以插入并使用…在这里: …以及您的代码中… 我给Matplotlib-users

  • 我有一个有着多个传奇的人物,我希望能够给他们贴上标签。我想在图例上放一个标题/标签,如下所示。这不是这个答案的复制品,这个答案只说明了如何在数字上放置一个图例。 我已经检查了图例指南,但找不到任何关于如何做到这一点的信息。 同样,请不要关闭这个问题(就像这个问题一样),它不是上面链接的答案的副本。该答案没有提供任何有关为图例添加标签/标题的信息。

  • 本文向大家介绍Python的matplotlib绘图如何修改背景颜色的实现,包括了Python的matplotlib绘图如何修改背景颜色的实现的使用技巧和注意事项,需要的朋友参考一下 在主图中背景颜色不知道怎么改,plt.plot()中没有axisbg参数。 但是子图可以对plt.subplot的参数做修改,下面是对子图的背景颜色修改代码 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大

  • 问题内容: 我在META-INF /文件夹中有一个persistence.xml: 在Java代码中,我从该persistence.xml创建实体管理器facotry 但是我只想动态更改jdbc url / user / password以进行测试,我的计划是将这些参数保存在配置文件中,并根据需要读取它们,所以有没有一种方法可以在我从持久性创建了objectmanagerfactory之后更新它们