如何使用 plt.subplots 可视化多个条形图,轴必须根据其索引遍历所有视觉效果?

Posted

技术标签:

【中文标题】如何使用 plt.subplots 可视化多个条形图,轴必须根据其索引遍历所有视觉效果?【英文标题】:How to visualize multiple bar plots using plt.subplots ,axis must iterate over all visuals, according to its index? 【发布时间】:2021-03-05 05:19:11 【问题描述】:

我正在尝试逐年绘制每个国家/地区的预期寿命,我编写了一个运行良好的代码,

#Lets Create a Function that will create a relation between Year,life Expectancy with respect to different country



def EDA_features(country,life_expectancy,data):
    for i in set(data[country]):
        plt.bar(range(len(set(data[country]))),data[data[country]==i][life_expectancy])
        plt.xticks(range(len(set(data.Year))),labels=list(set(data.Year)))
        plt.xlabel('Year')
        plt.ylabel(f'life_expectancy')
        plt.title(f"Year vs life_expectancy for  i")
        plt.show()

我想使用 plt.subplots 在 3 或 2 行中可视化这个可视化

我试过这个代码

fig, ((ax1, ax2, ax3), (ax4, ax5, ax6)) = plt.subplots(nrows=2, ncols=3, sharex=True, sharey=True, figsize=(10,5))
for ax,country in zip(list(set(df.Country)),[ax1,ax2,ax3,ax4,ax5,ax6]):
    sns.barplot(range(len(set(df.Year))),df[df.Country==country]['Life expectancy at birth (years)'],ax=ax)
    ax.set_xticks(range(len(set(data.Year))))
    ax.set_xticklabels(list(set(data.Year)))
    plt.xlabel('Year')
    plt.ylabel('Life expectancy at birth (years)')
    plt.title(f"Year vs Life expectancy at birth (years) for  country")
    plt.show()

它抛出这个错误 AttributeError: 'bool' object has no attribute 'all'

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

您的 zip 顺序错误:

数字排在第二位,而国家则排在第一位。请注意,当您在 for 语句的开头创建 ax,country 元组时,ax 将包含国家/地区,而国家/地区将包含子图。

for ax,country in zip(list(set(df.Country)),[ax1,ax2,ax3,ax4,ax5,ax6]):

像这样交换这个:

for country, ax in zip(list(set(df.Country)),[ax1,ax2,ax3,ax4,ax5,ax6]):

【讨论】:

【参考方案2】:

假设您的数据框如下所示:

df =  pd.DataFrame('Country':np.repeat(["A","B","C","D","E","F"],5),
                   'Life expectancy at birth (years)':np.random.uniform(50,80,30),
                   'Year':np.tile([2000,2001,2002,2003,2004],6))

您可以简单地使用catplot,使用col_wrap指定列数:

sns.catplot(x="Year",y="Life expectancy at birth (years)",
        col="Country",col_wrap=3,data=df,kind="bar",height=3)

或者简化上面的子图代码应该会得到类似的结果:

fig,axs = plt.subplots(2,3, sharex=True, sharey=True, figsize=(10,5))
axs = axs.flatten()
Years = df.Year.unique()
Countries = df.Country.unique()

for i,cty in enumerate(Countries):
    sns.barplot(x = "Year", y = "Life expectancy at birth (years)",
                data = df[df.Country==cty],ax=axs[i])
    axs[i].set_xticks(range(len(Years)))
    axs[i].set_xticklabels(Years)
    plt.xlabel('Year')
    plt.ylabel('Life expectancy at birth (years)')

【讨论】:

以上是关于如何使用 plt.subplots 可视化多个条形图,轴必须根据其索引遍历所有视觉效果?的主要内容,如果未能解决你的问题,请参考以下文章

如何从两个或多个数据框中绘制分组条形图

在同一轴上绘制多个条形图

fig, ax = plt.subplots() 中的解包如何为多个子图工作?

无输出:使用 Matplotlib 的条形图

如何在多个子图中绘图

如何在多个子图中绘图