我试图在Python 2.7中为下面的Pandas数据框中的E列中的每个分类值生成一个箱形图

          A         B         C         D  E
0  0.647366  0.317832  0.875353  0.993592  1
1  0.504790  0.041806  0.113889  0.445370  2
2  0.769335  0.120647  0.749565  0.935732  3
3  0.215003  0.497402  0.795033  0.246890  1
4  0.841577  0.211128  0.248779  0.250432  1
5  0.045797  0.710889  0.257784  0.207661  4
6  0.229536  0.094308  0.464018  0.402725  3
7  0.067887  0.591637  0.949509  0.858394  2
8  0.827660  0.348025  0.507488  0.343006  3
9  0.559795  0.820231  0.461300  0.921024  1

我愿意用Matplotlib或任何其他绘图库来做到这一点。到目前为止,以上代码可以将所有类别组合成一个图。这是生成上述数据并生成图的代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig, ax = plt.subplots()

# Data
df = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
df['E'] = [1,2,3,1,1,4,3,2,3,1]

# Boxplot
bp = ax.boxplot(df.iloc[:,:-1].values, widths=0.2)
plt.show()

在此示例中,类别为1,2,3,4。我想在同一图上并排绘制单独的箱线图,仅针对类别1和2,并在图例中显示类别名称。

有没有办法做到这一点?

附加信息:

输出应类似于here的第三个数字-用“1”,“2”替换"is",“否”。

最佳答案

从此开始:

import numpy
import pandas
from matplotlib import pyplot
import seaborn
seaborn.set(style="ticks")

# Data
df = pandas.DataFrame(numpy.random.rand(10,4), columns=list('ABCD'))
df['E'] = [1, 2, 3, 1, 1, 4, 3, 2, 3, 1]

您有两种选择。如果单独的轴都可以,
fig, axes = pyplot.subplots(ncols=4, figsize=(12, 5), sharey=True)
df.query("E in [1, 2]").boxplot(by='E', return_type='axes', ax=axes)

python-2.7 - 在同一图上的Python并排箱图-LMLPHP

如果您需要1根轴,我认为seaborn会更容易。您只需要清理数据。
ax = (
    df.set_index('E', append=True)  # set E as part of the index
      .stack()                      # pull A - D into rows
      .to_frame()                   # convert to a dataframe
      .reset_index()                # make the index into reg. columns
      .rename(columns={'level_2': 'quantity', 0: 'value'})  # rename columns
      .drop('level_0', axis='columns')   # drop junk columns
      .pipe((seaborn.boxplot, 'data'), x='E', y='value', hue='quantity', order=[1, 2])
)
seaborn.despine(trim=True)

python-2.7 - 在同一图上的Python并排箱图-LMLPHP

关于seaborn的一个很酷的事情是,稍微调整参数可以在情节的布局方面取得很大的成就。如果我们切换huex变量,则会得到:
ax = (
    df.set_index('E', append=True)  # set E as part of the index
      .stack()                      # pull A - D into rows
      .to_frame()                   # convert to a dataframe
      .reset_index()                # make the index into reg. columns
      .rename(columns={'level_2': 'quantity', 0: 'value'})  # rename columns
      .drop('level_0', axis='columns')   # drop junk columns
      .pipe((seaborn.boxplot, 'data'), x='quantity', y='value', hue='E', hue_order=[1, 2])
)
seaborn.despine(trim=True)

python-2.7 - 在同一图上的Python并排箱图-LMLPHP

如果您感到好奇,则生成的数据框看起来像这样:
    E quantity     value
0   1        A  0.935433
1   1        B  0.862290
2   1        C  0.197243
3   1        D  0.977969
4   2        A  0.675037
5   2        B  0.494440
6   2        C  0.492762
7   2        D  0.531296
8   3        A  0.119273
9   3        B  0.303639
10  3        C  0.911700
11  3        D  0.807861

10-06 06:48