我的大脑受伤了
我有一些代码可以在一个长列中生成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。我觉得我接近答案,但我需要一点点推动。感谢。
答案 0 :(得分:13)
subplots
返回的轴处理根据请求的子图数量而变化:
您的问题似乎是由于从第二种情况到第三种情况(即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)