seaborn boxplot x轴作为数字,而不是标签

时间:2017-06-28 21:09:32

标签: python seaborn

假设我有一个像这样生成的panda 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轴值被视为数字而不仅仅是标签。

这可能吗? 我是否只是查看错误的图形类型来传达有关数据分散的信息,如果箱形图不能这样做?

1 个答案:

答案 0 :(得分:2)

正如@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"是否具有相同数量的值。类别与否。在它们不同的一般情况下,您将在循环中为每个值绘制一个boxplot。那么轴是真正的比例,非整数是没有问题的。

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