设置matplotlib图形/轴属性的首选方法

30

假设我有一个名为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')

更加简洁,但似乎缺乏文档。我是说所有文档都只说“tkstyle set命令,将kwargs传递以设置属性”。

优选或成语化的方式是什么? set方法的API稳定吗?

4个回答

18

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

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

我理解matplotlib支持命令式编程风格和类似Matlab的风格。原因是目标用户群体--那些已经熟悉Python和那些之前使用过Matlab的人。

我得出的结论是,matplotlib 推荐的API是.set_xxx()

通过图库进行快速检查可以确认这一点。

编辑:现在图库中有两种示例。

类似的二元性也存在于绘图函数的关键字参数中,只不过命令式API并不那么明显。


1
回答涉及到matplotlib api。我希望提供两种选项并进行文档化。 - Dima Tisnek
非常好的答案,谢谢。不确定 setp(xxx=y)set_xxx(y) 哪个更符合“Pythonic”风格,但两者都不是完全面向对象的方法;后者将在 matplotlib 类实例的复杂层次结构中上下导航,并有时会静默地设置类属性或用新的类实例替换简单/数值输入(例如,在 set_xticklabels(y) 中将 y 传递给 ticker.FixedFormatter(y))。两者都只是近似面向对象的方法。 - Luke Davis
时代在变。 - Alan
谢谢@Alan,你能否简要概括一下现在的建议是什么? - Dima Tisnek
1
在我看来,由于文档现在包含了两者的示例,你应该使用你喜欢或需要的方式。当我需要在一个单一的轴实例上设置多个属性时,我通常会使用“set”。 - Alan

9
作为对这个问题的超级晚回答: ax.set_xlim(4)ax.set(xlim=4) 本质上是一样的,所以你可以自行选择。 ax.set(kwarg=foo) 通过一些字符串操作调用了 ax.set_kwarg(foo),如果你查看源代码,会看到这一点。各种设置函数大多都是单行函数,但存在的目的是让内省的 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。所以我的想法是,尽管缺乏文档,通过kwargs设置多个参数的惯用方法是使用对象的set方法,而不是逐行设置。以上仅供参考。

0

我在使用matplotlib后端时遇到了类似的问题,所以我刚刚看到了这篇文章。我希望matplotlib能够允许使用字典控制绘图中的属性。根据@Chris Zeh的建议,您可以:

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

这解决了我的问题。希望能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接