将pandas DataFrame.plot嵌入到matplotlib子图中

14

我的大脑感到疼痛

我有一些代码会生成33个图像,这些图像都在一列中。

#fig,axes = plt.subplots(nrows=11,ncols=3,figsize=(18,50))
accountList =  list(set(training.account))
for i in range(1,len(accountList)):
    training[training.account == accountList[i]].plot(kind='scatter',x='date_int',y='rate',title=accountList[i])
#axes[0].set_ylabel('Success Rate')

我想将上面我已经注释掉的图表中的每一个图表添加到一张图中,但是所有尝试都失败了。我尝试在绘图命令中加入 ax=i,但是出现了'numpy.ndarray' object has no attribute 'get_figure'的错误。而且,当我缩小规模,在一个1x1的图中绘制单个图表时,我的x和y坐标轴都变得混乱。我感觉离答案很近了,但我需要一点帮助。谢谢。


1
我认为你需要使用类似于ax=axes[i,j]这样的东西,但我可能错了。这个有帮助吗?http://pandas.pydata.org/pandas-docs/stable/visualization.html#targeting-different-subplots - David Hagan
2个回答

18

subplots返回的轴句柄根据请求的子图数量而变化:

  • 对于(1x1),您将获得单个句柄,
  • 对于(nx1或1xn),您将获得一个1d句柄数组,
  • 对于(mxn),您将获得一个2d句柄数组。

看起来您的问题来自于从第二种情况到第三种情况(即1d到2d轴数组)的接口更改。如果您事先不知道数组形状,以下代码片段可以帮助解决问题。

我发现numpy的unravel_index在迭代轴时非常有用,例如:

ncol = 3 # pick one dimension
nrow = (len(accountList)+ ncol-1) / ncol # make sure enough subplots
fig, ax = plt.subplots(nrows=nrow, ncols=ncol) # create the axes

for i in xrange(len(accountList)):   # go over a linear list of data
  ix = np.unravel_index(i, ax.shape) # compute an appropriate index (1d or 2d)

  accountList[i].plot( ..., ax=ax[ix])   # pandas method plot
  ax[ix].plot(...)   # or direct axis object method plot (/scatter/bar/...)

您还可以对返回的数组进行重塑,使其成为线性的(就像我在这个答案中使用的那样):
for a in ax.reshape(-1):
    a.plot(...)

如链接中的解决方案所述,如果您可能有1x1子图(然后收到单个轴句柄),则需要对axs进行一些调整; axs = np.array(axs)就足够了。


在仔细阅读docs后(糟糕),将squeeze = False设置为强制subplots返回2D矩阵,不管ncols / nrows的选择。 (squeeze默认为True)。
如果这样做,您可以迭代两个维度(如果对于您的数据而言是自然的),或者使用上述任何一种方法线性地迭代数据并计算对ax的2D索引。

0

在Bonlenfum的回答基础上,这里有一种使用groupby子句的方法:

accountList = training.account.unique()
accountList.sort()
for i, group in training.groupby('account'):
    ix = np.where(accountList==i)[0][0]
    ix = np.unravel_index(ix, ax.shape)
    group.plot(ax=ax[ix],title = i)

这样我们就可以在图表中使用标题,并且还可以容纳值缺失的组(即1、3、8)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接