在简单的matplotlib图中设置属性的习惯用法是什么?

时间:2013-12-20 16:29:58

标签: python-2.7 matplotlib figure axes

我对matplotlib数字,轴和子图之间的关系感到困惑。

通常,我通过查看和试验代码来弄清楚这些事情,代码通常体现了对象模型中实体之间的结构关系,可以从有效的例子中推断出来。但在matplotlib中,我经常发现一系列令人眼花缭乱的方法来完成相同的事情,这会掩盖下层结构。

例如,如果我想制作一个简单的(没有子图)对数日志图,则以下任何一个似乎都具有完全相同的效果。

import matplotlib.pyplot as plt

# All of the following seem to have the same effect:
plt.axes().loglog()
plt.gca().loglog()
plt.loglog()
plt.gcf().gca().loglog()

# These don't work though: 
# plt.gcf().axes().loglog()
# plt.gcf().loglog()

我已经尝试了文档和教程,但是我没有明白这样做过。

上述每个工作示例的作用是什么?他们有什么不同?为什么非工作示例会失败?如果我正在编写我希望其他人(或我)能够阅读的代码,那么这些习语是否比其他成语更受欢迎?


请注意,我的兴趣在于以编程方式创建用于发布或导出的图像,而不是用于交互式创建图形或模仿MATLABs功能。我认为上面的一些“捷径”与后一种情况有关。

2 个答案:

答案 0 :(得分:3)

我的标准是从plt.subplots获取fig, ax,如下所示:

fig, ax = plt.subplots(1)
ax.loglog(a, b)

我是这样做的,因为那时你也可以将多个ax个对象作为列表,例如:

# Make a column of three figures
fig, axes = plt.subplots(3)
for ax, a, b in zip(axes, as, bs):
    ax.loglog(a, b)

或者,如果您执行2 x 5网格,则会获得ax个对象列表的列表,因此我通常会使用axes.flat取消列表:

# Make a 2x5 grid of figures
nrows = 2
ncols = 5
height = nrows * 4
width = ncols * 4

# Don't ask me why figsize is (width, height) instead of (height, width)....
fig, axes = plt.subplots(nrows=2, ncols=5, figsize=(width, height))

for ax, a, b in zip(axes.flat, as, bs):
    ax.loglog(a, b)

我是这样做的,因为之后我有ax个对象来调整外观。除了内部绘图功能之外,我通常不使用plt.gca()

plt.gcf()获取当前数字,当您向其添加gca()axes()loglog()时,我相信它们会创建基础轴。我不确定为什么gcf() - 第一个内容无法与axes()loglog()一起使用。所以我的建议是坚持ax个对象。

编辑:删除itertools.chain内容,换成axes.flat

答案 1 :(得分:1)

figure 基本上是一个窗口或文件。如果你制作几个单独的数字,通常会想要弹出几个寡妇或保存几个文件。

子图在某种意义上是相同的。例如,figure方法subplot返回一个轴对象。每个轴对象代表一组特定的轴,您希望在其上绘制某些图形。每个轴上可以绘制几个单独的数据集,但它们都将使用相同的x和y轴。

绘制loglog图是由用于实际绘制数据的函数决定的。例如,如果你有两个数组ab,我想对彼此记录loglog,我会使用:

fig=plt.figure() #Make a figure
loglog_ax=fig.subplot(111) # Make a single axis, which is the *only* subplot
loglog_ax.loglog(a,b) # Plot the data on a log-log plot