创建包含每个类别的起始值和结束值的箱线图

问题描述 投票:0回答:1
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

data = [['Math', 3, 5, 15],
        ['English', 3, 10, 20],
        ['Computers', 5, 12, 30],
        ['Science', 8, 15, 32],
        ['Art', 17, 25, 48],
        ['Sports', 22, 45, 60]]
    
df = pd.DataFrame(data, columns=['Class', 'First Rank','Second Rank', 'Third Rank'])

我正在尝试为每个类别创建一个条形图。数据框具有三列。第一等级应该是盒子开始的地方,第二等级应该是盒子中的一条线,第三等级应该是盒子结束的地方。

df2 = pd.melt(df, ['Class'])
g = sns.catplot(x="value", y='Class', hue='Class', data=df2, errorbar=None, native_scale=True, kind="box", orient="h", height=5, aspect=2)
g.set(xticks=(range(0, 80, 5)))

此代码生成此图:

Wrong output

该图是错误的,因为我不想显示置信区间。我希望盒子在间隔开始和结束的地方开始和结束。盒子里的线是正确的。

我希望图表看起来像这样:

图表上不需要数字。为了清楚起见,我把它们放在那里。 Graph I want to create

python matplotlib seaborn
1个回答
0
投票

Seaborn 的 boxplot 遵循 标准箱线图约定

  • 最低和最高数据点处的晶须,排除异常值
  • 中线的一条线
  • 25% 和 75% 百分位数之间的框

一个技巧是复制数据 3 次:

  • 中位数将保留在数据框的“第二排名”列
  • 由于重复,25%和75%百分位数将成为“第一”和“第三名”
  • 胡须被忽略,因为它们与盒子重合

(请注意,箱线图会忽略您的

errorbar=
参数。此外
native_scale=True
也会被忽略,因为 y 轴不是数字。)

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

data = [['Math', 3, 5, 15],
        ['English', 3, 10, 20],
        ['Computers', 5, 12, 30],
        ['Science', 8, 15, 32],
        ['Art', 17, 25, 48],
        ['Sports', 22, 45, 60]]

df = pd.DataFrame(data, columns=['Class', 'First Rank', 'Second Rank', 'Third Rank'])

df2 = pd.melt(df, ['Class'])
g = sns.catplot(x="value", y='Class', hue='Class', data=pd.concat([df2, df2, df2]), kind="box", orient="h", height=5,
                aspect=2)
g.set(xticks=(range(0, 80, 5)))
plt.show()

boxplot with only 3 lines

© www.soinside.com 2019 - 2024. All rights reserved.