如何使用 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 可视化多个条形图,轴必须根据其索引遍历所有视觉效果?的主要内容,如果未能解决你的问题,请参考以下文章