Skip to main content
 首页 » 编程设计

python之'numpy.ndarray' object has no attribute 'barh' 是什么意思,如何纠正

2025年05月04日12kevingrace

我想绘制一个 5 x 4 的地 block 。相同的代码如下

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' 对象没有属性 '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' 

请您参考如下方法:

阅读以下两个问题及其答案会有所帮助:

在您的代码 fig, axis = plt.subplots(5, 4,figsize=[25,10]) 中,axis 是一个二维 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