python - 当 N 未知时,用 1 个地块绘制 N

python - plotting N by 1 number of plots when N is unknown

我目前正在使用 seaborn 在 4 轴上绘制多个图。为了做到这一点,我一次手动 select nrows=4 然后 运行 4 个箱线图。

import pandas as pd
import numpy as np
import seaborn as sns
%matplotlib inline

data=np.random.randn(1000)
label = ['A','B','C','D'] * 250

df = pd.DataFrame(
{'label': prod1,
 'data': data
})

fig, (ax1, ax2, ax3, ax4) = plt.subplots(nrows=4, sharey=True)
fig.set_size_inches(12, 16)

sns.boxplot(data=df[df['label']=='A'], y='data', ax=ax1)
sns.boxplot(data=df[df['label']=='B'], y='data', ax=ax2)
sns.boxplot(data=df[df['label']=='C'], y='data', ax=ax3)
sns.boxplot(data=df[df['label']=='D'], y='data', ax=ax4)

我想重写这个函数,让它自动识别标签的唯一数量,自动创建轴数,然后绘图。

有谁知道我怎样才能做到这一点?谢谢。

作业

fig, ax = plt.subplots(nrows=4, sharey=True)

makes ax a NumPy array of axes。该数组可以是一维或二维的(取决于 nrowsncols 参数的值), 所以调用 ax.ravel() 用于确保它是一维的。 现在您可以循环 zip(label, ax.ravel()) 为每个标签和轴调用一次 sns.boxplot

fig, ax = plt.subplots(nrows=4, sharey=True)
fig.set_size_inches(12, 16)
for labeli, axi in zip(label, ax.ravel()):
    sns.boxplot(data=df[df['label']==labeli], y='data', ax=axi)

注意 zip 在最短的迭代器结束时结束。所以尽管 label 的长度为 1000,循环中只使用了前 4 项,因为那里 只有4个轴。

或者,只需分配 label = ['A','B','C','D'],因为该变量未在其他任何地方使用(至少,未在发布的代码中使用)。