seaborn boxplot x轴作为数字,而不是标签
seaborn boxplot x-axis as numbers, not labels
假设我有一个像这样生成的 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]
我想要的是生成一组间隔开的箱线图,就好像 x 轴值被视为数字,而不仅仅是标签。
这可能吗?
如果箱线图无法做到这一点,我是否只是在查看错误类型的图表来传达有关我的数据分散的信息?
正如@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()
请注意,在这种情况下,轴仍然是分类的,这意味着它从 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()
假设我有一个像这样生成的 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]
我想要的是生成一组间隔开的箱线图,就好像 x 轴值被视为数字,而不仅仅是标签。
这可能吗? 如果箱线图无法做到这一点,我是否只是在查看错误类型的图表来传达有关我的数据分散的信息?
正如@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()
请注意,在这种情况下,轴仍然是分类的,这意味着它从 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()