将pandas DataFrame.plot填充到matplotlib子图中

时间:2014-02-23 00:20:10

标签: python matplotlib pandas

我的大脑受伤了

我有一些代码可以在一个长列中生成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放入plot命令中,然后得到'numpy.ndarray' object has no attribute 'get_figure'。此外,当我缩小并用一个一个图中的单个绘图进行此操作时,我的x和y标度都会变为heck。我觉得我接近答案,但我需要一点点推动。感谢。

2 个答案:

答案 0 :(得分:13)

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

  • for(1x1)你得到一个句柄,
  • for(n x 1或1 x n)你得到一个1d手柄数组,
  • for(m x n)你得到一个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/...)

您还可以重新整形返回的数组,使其呈线性(就像我在this answer中使用的那样):

for a in ax.reshape(-1):
    a.plot(...)

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


在仔细阅读docs之后(oops),设置squeeze=False强制subplots以返回2d矩阵,无论ncols / nrows的选择如何。 (squeeze默认为True)。

如果你这样做,你可以迭代两个维度(如果你的数据很自然),或者使用上述任一方法线性迭代你的数据并将2d索引计算到ax

答案 1 :(得分: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)