Python 使用DataFrame.plot制作带有子图的图表--如何使用ax参数

Python 使用DataFrame.plot制作带有子图的图表--如何使用ax参数,python,pandas,matplotlib,plot,Python,Pandas,Matplotlib,Plot,我不能把我的头绕在Axis参数上,它包含什么以及如何使用它来制作子图 如果有人能解释一下下面的例子,我将不胜感激 fig, axes = plt.subplots(nrows=3, ncols=4, figsize=(15, 10)) for idx, feature in enumerate(df.columns[:-1]): df.plot(feature, "cnt", subplots=True, kind="scatter", ax=axes[idx / 4, idx % 4])

我不能把我的头绕在Axis参数上,它包含什么以及如何使用它来制作子图

如果有人能解释一下下面的例子,我将不胜感激

fig, axes = plt.subplots(nrows=3, ncols=4, figsize=(15, 10))
for idx, feature in enumerate(df.columns[:-1]):
  df.plot(feature, "cnt", subplots=True, kind="scatter", ax=axes[idx / 4, idx % 4])
以下是数据(): 以下是代码片段的输出(功能和最终结果的成对比较):

更具体地说,以下是我确实理解的部分(至少我认为我理解)

  • plt.subplot返回一个元组,其中包含一个地物和轴对象()
  • enumerate()返回一个元组,该元组包含要素的索引及其名称()
  • plot使用列名将数据放在图中的子图上
这是我不明白的

  • Axis对象包含什么?同样,根据文档和答案,我确实意识到轴包含“轴、记号、线条2D、文本、多边形等”,但
    • 我们使用轴[x,y]来解决什么问题
    • 为什么在本例中,作者决定使用[idx/4,idx%4]作为值

代码中的
对象是一个2D Numpy对象数组。由于对
subplots()
的调用要求3行4列,因此数组将是3乘4。像
axes[r,c]
这样索引到数组中,可以为您提供与行
r
和列
c
相对应的
axes
对象,您可以将该对象作为
ax
关键字参数传递给绘图方法,以使绘图显示在该轴上。例如,如果要在第二行和第二列中绘制某些内容,可以调用
plot(…,ax=axes[1,1])


代码使用
[idx/4,idx%4]
将索引(从0到11的数字)转换为3×4网格中的位置。用
idx
依次设置为0到11之间的每个值,尝试自己计算该表达式,您将看到它是如何工作的。

关于数组索引的最后一个问题,如
[idx/4,idx%4]

其思想是同时在所有子地块和所有数据帧列上循环。问题是轴数组是二维的,而列数组是一维的。因此,需要决定循环哪些维度,并将循环索引/索引映射到其他维度

直观的方法是使用两个循环

for i in range(axes.shape[0]):
    for j in range(axes.shape[1]):
        df.plot(df.columns[i*axes.shape[0]+j], "cnt", ... , ax=axes[i,j])
这里,
i*axes.shape[0]+j
将numpy数组的二维映射到列列表的一维

在问题的示例中,循环位于列上方,这意味着我们必须以某种方式将一维索引映射到二维。这就是
[idx/4,idx%4]
所做的。。或者应该这样做它只能在python 2中使用。为了使它更易于理解和保存版本,应该实际使用
[idx//4,idx%4]
/
说明使用整数除法。因此,对于前4个idx值(0,1,2,3),
idx//4
是0,对于下一组4个值,它是1,依此类推<代码>idx%4计算索引模4。所以(0,1,2,3)被映射到(0,1,2,3),然后(4,5,6,7)被再次映射到(0,1,2,3),以此类推

使用单个回路的替代解决方案是展平轴阵列:

for idx, feature in enumerate(df.columns[:-1]):
    df.plot(feature, "cnt", ... , ax=axes.flatten()[idx])
或者可能是最像蟒蛇的

for ax, feature in zip(axes.flatten(), df.columns[:-1]):
    df.plot(feature, "cnt", ... , ax=ax)

唉,这是有道理的。我要求子地块,我得到一个轴数组,对应于这些子地块。我确实尝试过对它进行评估,但很惊讶我得到了像[1.25,1]这样的值,这不是访问数组元素的常用方法。这是访问子地块的典型方式吗?matplotlib文档中是否提到了它?