【问题标题】:The preferred way to set matplotlib figure/axes properties设置 matplotlib 图形/轴属性的首选方法
【发布时间】:2012-11-04 03:46:42
【问题描述】:

假设我有一个名为 ax 的 matplotlib 轴,我想设置它的几个属性。目前,我这样做:

ax.set_yscale('log')
ax.set_xlim([0,10])
ax.set_xlabel('some label')

但一段时间后它会变得乏味。然后我遇到了这个方法:

ax.set(yscale='log', xlim=[0,10], xlabel='some label')

更简洁,但似乎有点无证。我的意思是所有文档都说“A tkstyle set command, pass kwargs to set properties”。

首选或惯用的方式是什么? set方法api稳定吗?

【问题讨论】:

    标签: python matplotlib idioms


    【解决方案1】:

    Pyplot tutorial 似乎推荐了ax.set_xxx() 函数,但也提到了.setp(xxx=)

    另一方面,.set(xxx=) 函数未被使用,.setp(xxx=) 虽已记录在案,但在任何示例中均未使用 (Pyplot API)。

    据我了解,matplotlib 支持命令式编程风格和类似 matlab 的风格。原因是目标用户群——那些已经熟悉 Python 和以前使用过 Matlab 的人。

    我的结论是 matplotlib 推荐 api是.set_xxx()

    通过gallery 快速检查确认了这一点。

    编辑:现在画廊中似乎有两者的例子。

    绘图函数的关键字参数也存在类似的对偶性,只是命令式 API 不那么明显。

    【讨论】:

    • 答案涵盖了明显的 matplotlib api。我希望这两个选项都可用并记录在案。
    • 很好的答案,谢谢。不确定setp(xxx=y)set_xxx(y) 是否更“pythonic”,但两者都不完全是面向对象的方法;后者将在 matplotlib 类实例的疯狂层次结构中上下导航,有时会默默地设置类属性或用新的类实例替换简单/数字输入(例如,在set_xticklabels(y) 中将y 传递给ticker.FixedFormatter(y))。两者都只是面向对象的。
    • 谢谢@Alan 你能总结一下现在的推荐吗?
    • IMO,由于文档现在包含两者的示例,您应该使用您喜欢/需要的内容。当我在单个坐标区实例上设置多个属性时,我通常使用set
    【解决方案2】:

    作为对这个问题的超迟跟进:

    ax.set_xlim(4)ax.set(xlim=4) 本质上是一回事,所以随心所欲。 ax.set(kwarg=foo) 通过一些字符串操作调用ax.set_kwarg(foo),你可以看看源代码。各种 setter 函数也大多是单行函数,但存在是为了让内省的 setp 工作。

    【讨论】:

      【解决方案3】:

      我通常使用 matplotlib 的 pyplot(交互式)接口,它暴露了 setp 函数(我经常使用)。

      matplotlib 支持使用 setp()(“设置属性”)和 getp() 来 设置和获取对象属性,以及对对象进行自省 目的。

      这让您可以像上面的 set 函数一样执行操作,只是您将要设置的对象作为参数传递:

      >>> x = arange(0,1.0,0.01)
      >>> y1 = sin(2*pi*x)
      >>> y2 = sin(4*pi*x)
      >>> lines = plot(x, y1, x, y2)
      >>> setp(lines, linewidth=2, color='r')
      

      我猜setp 函数实际上调用了传递对象的set 函数,该函数用于定位和设置kwargs

      所以我的想法是,尽管缺乏文档,但对象的 set 方法是通过 kwargs 而不是逐行设置多个参数的惯用方法。

      我的 2 美分。

      【讨论】:

        【解决方案4】:

        我在 matplotlib 后端有类似的问题,所以我刚刚看到这篇文章。我希望 matplotlib 允许对绘图中的属性使用字典控件。使用@Chris Zeh 的建议,您可以:

        f = {'xlabel': 'x1', 'ylabel': 'x2'}
        [setp(ax, formati, formatj) for formati, formatj in f.items()]
        

        这解决了我的问题。希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 2023-03-26
          • 2017-10-19
          • 1970-01-01
          • 1970-01-01
          • 2017-08-23
          • 1970-01-01
          • 1970-01-01
          • 2018-01-13
          • 2021-10-20
          相关资源
          最近更新 更多