gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:37:35 26 4
gpt4 key购买 nike

我正在尝试在 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 中的第三个图- 将"is"、“否”替换为“1”、“2”。

最佳答案

从这个开始:

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)

enter image description here

如果你想要 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)

enter image description here

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)

enter image description here

如果你很好奇,结果数据框看起来像这样:
    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

关于python-2.7 - 同一图上的 Python 并排箱线图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37191983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com