我如何纠正'这个matplotlib绘图程序?

时间:2012-04-09 08:38:21

标签: python matplotlib

我对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行)。似乎需要很多单独的调用来格式化轴标签等等。

1 个答案:

答案 0 :(得分:3)

你在做什么看起来很好。 (我同意,仅使用pyplot创建图形并将OO API用于其他所有内容会更加清晰。)

如果您希望在一次通话中制作数字和轴,请使用plt.subplots

另外,我发现使用fig.savefig代替plt.savefig会更清晰一些。在这种情况下无关紧要,但这样就可以避免在状态机界面中担心哪个数字处于“活动状态”。

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

“setters”和“getters”很烦人,但是从python没有属性的日期开始,如果我没记错的话。它们一直被认为是主要的方法,部分是为了向后兼容,部分是因为像plt.setp这样的“matlab-isms”更容易编写。事实上,如果你想要你可以做到

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

enter image description here