2

我对 matplotlib 提供的编码范式感到非常困惑。我正在使用下面这样的代码来绘制一些数据:

fig=plt.figure(figsize=fig_size)  # plt=pyplot defined above
axes1 = fig.add_subplot(111)
axes1.plot(temp, depth, 'k-')
axes1.set_ylim(-600,0)
axes1.set_ylabel(r'Depth $(m)$')
axes1.set_xlim(0,80)
axes1.set_xlabel(r'Temperature (\textcelsius)')
axes1.set_xticks(np.arange(0,100,20))
axes1.grid(True)
plt.savefig(savedir + 'plot.svg', transparent=True)

我宁愿使用 mpl 的面向对象风格而不是 pylab 便利功能。所以问题是,如果我只想以非交互方式绘制一条曲线,我是否使用了正确的图形创作风格?(第 1 行和第 2 行)。似乎需要很多单独的调用来格式化轴标签等等。

4

1 回答 1

3

你在做什么看起来不错。(我同意,仅pyplot用于图形创建并将 OO API 用于其他所有内容要干净得多。)

如果您希望在一次调用中制作图形和轴,请使用plt.subplots.

另外,我发现使用它fig.savefig而不是plt.savefig. 在这种情况下,这无关紧要,但这样您就不必担心状态机界面中哪个图形是“活动的”。

最后一件事,您可以通过一次调用来设置 x 和 y 限制axes1.axis(...)。这纯粹是一个偏好问题。 set_xlim并且set_ylim可以说是一种更易读的方式。

“setter”和“getter”很烦人,但如果我没记错的话,可以追溯到python没有属性的时候。它们被保留为主要方法,部分原因是为了向后兼容,部分原因是“matlab-isms”之类plt.setp的更容易编写。事实上,如果你愿意,你可以做到

plt.setp(ax, xlabel='Xlabel', ylabel='Ylabel', xticks=range(0, 100, 20))

这避免了必须执行三个单独的调用来设置 xlabel、ylabel 和 xticks。但是,我个人倾向于避免它。我发现在大多数情况下,稍微冗长一些会更好。但是,如果您发现它更干净或更方便,那么使用setp.

作为我如何编写它的示例:

import matplotlib.pyplot as plt
import numpy as np

depth = np.linspace(-600, 0, 30)
temp = (4 * np.random.random(depth.size)).cumsum()

fig, ax = plt.subplots() 
ax.plot(temp, depth, 'k-')
ax.axis([0, 80, -600, 0])
ax.set_ylabel(r'Depth $(m)$')
ax.set_xlabel(r'Temperature $(^{\circ}C)$')
ax.set_xticks(np.arange(0, 100, 20))
ax.grid(True)

fig.savefig('plot.svg', transparent=True)
plt.show()

在此处输入图像描述

于 2012-04-09T15:30:51.917 回答