如何将 seaborn barplots 绘制为子图?
Posted
技术标签:
【中文标题】如何将 seaborn barplots 绘制为子图?【英文标题】:How to plot seaborn barplots as subplot? 【发布时间】:2019-04-07 07:02:33 【问题描述】:我想为数据框中的列列表创建子图。但是,当我运行下面的代码时,我得到了与轴相关的索引错误
TypeError: 'AxesSubplot' 对象不支持索引
%matplotlib inline
import seaborn as sns
import matplotlib.pyplot as plt
nr_rows = 1
nr_cols = 3
cols_review = ['home_ownership', 'verification_status', 'loan_status']
li_col_reviews = list(cols_review)
fig, axs = plt.subplots(nr_rows, nr_cols, figsize=(nr_cols*4,nr_rows*3))
for r in range(0,nr_rows):
for c in range(0, nr_cols):
col = r*nr_cols+c
if col < len(li_col_reviews):
col_count = pdf[li_col_reviews[col]].value_counts()
sns.set(style="darkgrid")
sns.barplot(col_count.index, col_count.values, alpha=0.9,ax = axs[r][c])
plt.ylabel('Number of Occurrences', fontsize=12)
plt.xlabel(col, fontsize=12)
plt.tight_layout()
plt.show()
【问题讨论】:
【参考方案1】:您需要将squeeze=False
添加到plt.subplots
这一行
在这里,我修改了您的代码并使用了一些虚拟数据。此外,您必须将plt.show()
保持在循环之外。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
nr_rows = 1
nr_cols = 3
cols_review = ['home_ownership', 'verification_status', 'loan_status']
fig, axs = plt.subplots(nr_rows, nr_cols, figsize=(nr_cols*4,nr_rows*3), squeeze=False)
for r in range(0,nr_rows):
for c in range(0, nr_cols):
col = r*nr_cols+c
if col < len(cols_review):
x=np.random.rand(5) * 10
y=np.random.rand(5)
sns.set(style="darkgrid")
sns.barplot(x, y, alpha=0.9,ax = axs[r][c])
plt.ylabel('Number of Occurrences', fontsize=12)
plt.xlabel(col, fontsize=12)
plt.tight_layout()
plt.show()
Squeeze 默认设置为 True,这意味着:
extra dimensions are squeezed out from the returned array axs
。因此无法使用[r][c]
进行索引。通过不挤压 (squeeze=False),您可以确保 axs
作为二维数组返回,然后可以使用 [r][c]
对其进行索引
您可能想阅读squeeze
参数here。
【讨论】:
旁注:li_col_reviews = list(cols_review)
没有用,因为cols_review
已经是一个列表以上是关于如何将 seaborn barplots 绘制为子图?的主要内容,如果未能解决你的问题,请参考以下文章
如何在seaborn barplot中使用NaN值作为具有定义颜色的色调
seaborn可视化绘制双变量分组条形图(Annotating Grouped Barplot: Side-by-side)添加数值标签进行标记
如何在 seaborn / matplotlib 中绘制和注释分组条形