我想绘制一个5 x 4的图。相同的代码在
之下fig, axis = plt.subplots(5, 4,figsize=[25,10])
i = 0
for channel in np.unique(data_recent['channel_id']):
for year in np.unique(data_recent['year']):
filter_data = data_recent.loc[(data_recent['channel_id']==str(channel)) & (data_recent['year']==year)]
topics_count = []
for topic in list(sumbags.keys()):
topics_count.append([topic, filter_data[str(topic)].sum()])
topics_group = pd.DataFrame(topics_count, columns = ['topics','count'])
topics_group = topics_group.sort_values(by='count', ascending=False)[:5]
print (channel, year)
print (topics_group)
sns.barplot(x = 'count', y = 'topics', data = topics_group, ax = axis[i])
axis[i].set_title("Top 5 topics for " + str(channel) + " " + str(year))
axis[i].set_ylabel("Topics")
axis[i].set_xlabel("Count")
fig.subplots_adjust(hspace=0.4)
fig.subplots_adjust(wspace=0.4)
i += 1
print (i)
错误表示'numpy.ndarray' object has no attribute 'barh'
。请帮忙。
完整错误发布在下方。
AttributeError Traceback (most recent call last)
<ipython-input-511-edab5430d06a> in <module>()
12 print (topics_group)
13
---> 14 sns.barplot(x = 'count', y = 'topics', data = topics_group, ax = axis[i])
15 axis[i].set_title("Top 5 topics for " + str(channel) + " " + str(year))
16 axis[i].set_ylabel("Topics")
C:\Users\Sujoy\Anaconda3\lib\site-packages\seaborn\categorical.py in barplot(x, y, hue, data, order, hue_order, estimator, ci, n_boot, units, orient, color, palette, saturation, errcolor, errwidth, capsize, ax, **kwargs)
2902 ax = plt.gca()
2903
-> 2904 plotter.plot(ax, kwargs)
2905 return ax
2906
C:\Users\Sujoy\Anaconda3\lib\site-packages\seaborn\categorical.py in plot(self, ax, bar_kws)
1593 def plot(self, ax, bar_kws):
1594 """Make the plot."""
-> 1595 self.draw_bars(ax, bar_kws)
1596 self.annotate_axes(ax)
1597 if self.orient == "h":
C:\Users\Sujoy\Anaconda3\lib\site-packages\seaborn\categorical.py in draw_bars(self, ax, kws)
1552 """Draw the bars onto `ax`."""
1553 # Get the right matplotlib function depending on the orientation
-> 1554 barfunc = ax.bar if self.orient == "v" else ax.barh
1555 barpos = np.arange(len(self.statistic))
1556
AttributeError: 'numpy.ndarray' object has no attribute 'barh'
答案 0 :(得分:5)
阅读以下两个问题及其答案将有助于:
在代码fig, axis = plt.subplots(5, 4,figsize=[25,10])
中,axis
是一个2D numpy数组。如果使用单个索引对其进行索引,则从中取出一行,而不是单个轴。
在不改变太多代码的情况下,最简单的解决方案是使用展平数组进行索引,
sns.barplot(..., ax = axis.flatten()[i])
axis.flatten()[i].set_title(...)
#etc.
或者只是在转轴之前展平轴阵列,
fig, axis = plt.subplots(5, 4,figsize=[25,10])
axis = axis.flatten()
# keep rest of code the same
答案 1 :(得分:0)
您还可以使用此方法避免flatten()调用:
sns.barplot(x = 'count', y = 'topics', data = topics_group, ax = axis[i,j])
其中轴[i,j] 子图矩阵的索引。