我对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功能。我认为上面的一些“捷径”与后一种情况有关。
答案 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图是由用于实际绘制数据的函数决定的。例如,如果你有两个数组a
和b
,我想对彼此记录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