python - seaborn:分享X标签无法按预期工作

时间:2017-09-09 18:25:59

标签: python seaborn boxplot

我正在处理一个显示两点之间关系的数据集,例如公交车站。例如,我们有公交车站A,B,C和D.

我想制作直方图,显示每个公交车站到达其他3个公交车站需要多长时间。

显然,从A到A没有时间,因此应该是空白的。

当我绘制它时,我看到第一行显示BCD,第二行显示A,C,D等。列未对齐且颜色不代表每行中的相同列。 / p>

如果我添加sharex = True,它只是删除每个轴上的x标签。这显然不是我想在这里看到的。

我希望按照A,B,C,D的顺序看到4列。当它是A到A时,它应该是空白的,并且颜色应该是一致的。

有谁知道如何做到这一点?

import pandas as pd
import numpy as np
import seaborn as sns
%matplotlib inline

time=np.random.randn(1000)
point1 = ['A','B','C','D'] * 250
point2 = ['A'] * 250 + ['B'] * 250 + ['C'] * 250 + ['D'] * 250 

df_time = pd.DataFrame(
    {'point1': point1,
     'point2': point2,
     'time': time
    })
df_time=df_time[df_time['point1']!=df_time['point2']] ##cannot sell to another

fig, ax = plt.subplots(nrows=4, sharey=True)
fig.set_size_inches(12, 16)
for point1i, axi in zip(point1, ax.ravel()):
    sns.boxplot(data=df_time[df_time['point1']==point1i], x='point2', y='time', ax=axi)

enter image description here

1 个答案:

答案 0 :(得分:1)

the documentation看,sns.boxplot有一个论证order

  

orderhue_order:字符串列表,可选
  命令绘制分类级别,否则从数据对象推断出级别。

使用此类似

sns.boxplot(..., order=['A','B','C','D'])

会给你想要的情节。

完整代码:

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

time=np.random.randn(1000)
point1 = ['A','B','C','D'] * 250
point2 = ['A'] * 250 + ['B'] * 250 + ['C'] * 250 + ['D'] * 250 

df_time = pd.DataFrame(
    {'point1': point1,
     'point2': point2,
     'time': time
    })
df_time=df_time[df_time['point1']!=df_time['point2']] ##cannot sell to another

fig, ax = plt.subplots(nrows=4, sharey=True)

for point1i, axi in zip(point1, ax.ravel()):
    sns.boxplot(data=df_time[df_time['point1']==point1i], x='point2', y='time', 
                ax=axi, order=['A','B','C','D'])

plt.tight_layout()    
plt.show()

enter image description here