我对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行)。似乎需要很多单独的调用来格式化轴标签等等。
答案 0 :(得分:3)
你在做什么看起来很好。 (我同意,仅使用pyplot
创建图形并将OO API用于其他所有内容会更加清晰。)
如果您希望在一次通话中制作数字和轴,请使用plt.subplots
。
另外,我发现使用fig.savefig
代替plt.savefig
会更清晰一些。在这种情况下无关紧要,但这样就可以避免在状态机界面中担心哪个数字处于“活动状态”。
最后,您可以通过一次调用axes1.axis(...)
来设置x和y限制。这纯粹是一个偏好问题。 set_xlim
和set_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()