Seaborn箱线图x轴显示数字而非标签

6
假设我有一个像这样生成的pandas DataFrame:
df = pd.DataFrame(columns=['x_value', 'y_value'])
for x in [1.0, 3.0, 9.0]:
    for _ in range(1000):
        df = df.append({'x_value':x, 'y_value':np.random.random()}, ignore_index=True)

结果可能如下所示:
In: df.head()
Out: 
    x_value y_value
0   1.0 0.616052
1   3.0 1.406715
2   9.0 8.774720
3   1.0 0.810729
4   3.0 1.309627

使用seaborn生成箱线图的结果如下:
[In] sns.boxplot(x='x_value', y='y_value', data=df)
[Out]

enter image description here

我希望生成一组箱线图,这些图的间距好像 x 轴值被视为数字而不仅是标签一样。这是否可能? 如果箱线图无法传达有关数据分散性的信息,那么我是否只是看错了图表类型?

是的,我在之前看过这个编程问题,它帮助理解了问题,但没有找到解决方案。 - MPa
1个回答

9
正如@mwaskom在我的初始答案下面的评论中指出的那样,使用order参数可以用来在盒子之间创建空盒子位置。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

x = np.random.choice([1,3,9], size=1001)
y = np.random.rand(1001)*(4+np.log(x))
df = pd.DataFrame({"x":x, "y":y})

sns.boxplot(x='x', y='y', data=df, order=range(1,10))

plt.show()

enter image description here

请注意,这种情况下轴仍然是分类的,这意味着它从0开始,每次增加1,只有标签表明不同。对于此问题,这不是问题,但是当在同一图中绘制其他定量图形时,需要意识到这一点。这也仅适用于柱形位置为整数的情况。
另一个更一般的解决方案是使用matplotlib.pyplot.boxplot。解决方案取决于每个“hue”类别是否具有相同数量的值。在它们不同时的一般情况下,您将在循环中绘制每个值的一个箱线图。轴是真正按比例缩放的,非整数没有问题。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np


x = np.random.choice([1,3,9], size=1001)
y = np.random.rand(1001)*(4+np.log(x))
df = pd.DataFrame({"x":x, "y":y})

u = df.x.unique()
color=plt.cm.spectral(np.linspace(.1,.8, len(u)))
for c, (name, group) in zip(color,df.groupby("x")):
    bp = plt.boxplot(group.y.values, positions=[name], widths=0.8, patch_artist=True)
    bp['boxes'][0].set_facecolor(c)


plt.xticks(u,u)
plt.autoscale()
plt.show()

enter image description here


1
如果数字值是整数,您可以使用seaborn中的order将它们放置在特定位置。 - mwaskom
@mwaskom 你能举个例子说明一下你的意思吗?或者如果可以使用sns.boxplot解决,您可以添加自己的答案吗?我认为这对很多人来说都很有趣,所以如果有解决方案,最好不要将其隐藏在评论中。据我所知,“order”只是设置顺序,例如[3,1,9]而不是[1,3,9]之类的东西! - ImportanceOfBeingErnest
1
执行 order=range(1, 10)。之后你可能需要调整刻度。 - mwaskom
很棒,我已经相应地更新了答案。尽管只限于整数,但这非常有用。 - ImportanceOfBeingErnest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接