Seaborn中X轴的间距不正确

时间:2016-04-02 04:44:53

标签: pandas seaborn

我有一个多级索引数据框,我试图在Seaborn中显示。该图显示正常,但x轴的值被视为文本标签而不是实际的x值。下面的代码段显示了如何制作和绘制样本数据:

>>> import numpy, pandas, seaborn
>>> from matplotlib import pyplot
>>> index = pandas.MultiIndex.from_product((list('abc'), [10**x for x in range(4)]), names=['letters', 'powers'])
>>> index
MultiIndex(levels=[['a', 'b', 'c'], [1, 10, 100, 1000]],
           labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]],
           names=['letters', 'powers'])

>>> df = pandas.DataFrame(numpy.random.randn(12, 2), index=index, columns=['x', 't'])
>>> df
                       x         t
letters powers                    
a       1       1.764052  0.400157
        10      0.978738  2.240893
        100     1.867558 -0.977278
        1000    0.950088 -0.151357
b       1      -0.103219  0.410599
        10      0.144044  1.454274
        100     0.761038  0.121675
        1000    0.443863  0.333674
c       1       1.494079 -0.205158
        10      0.313068 -0.854096
        100    -2.552990  0.653619
        1000    0.864436 -0.742165

>>> seaborn.factorplot(x='powers', y='t', hue='letters', data=df.reset_index())
>>> pyplot.show()

情节显示:

plot of sample data

但是,x轴使用数值作为文本标签。我希望x轴显示出从预期值开始的指数级数(即,1000应该是距离100的10倍,而不是100的10倍)。我该如何解决这个问题?

我怀疑多索引与问题无关,但是它被解释为的数据类型可能很重要。类似的问题似乎在这里发生:seaborn boxplots at desired distances along the x axis。我不认为这是重复的,但如果社区不同意,我将非常感谢如何将其应用于我的案例。

1 个答案:

答案 0 :(得分:4)

factorplot将您的[1, 10, 100, 1000]视为类别(或因素)。这些不是seaborn的数字 - 只是标签。 这就是为什么它们是均匀间隔的(并且在内部它将这些标签放置在从0到3的线性间隔标度上)。这样做的副作用是它模仿了您可能希望保留的对数缩放表示。

如果我理解正在尝试做什么,这可以在没有seaborn的情况下实现,但如果它是造型,你仍然可以导入它并在之后执行类似的操作:

fig, ax = plt.subplots(figsize=(5,3))

for l in df.index.get_level_values(0).unique():
    ax.plot(df.loc[l, 'x'], 'o-', label=l)
ax.legend(loc=0)
ax.set_xlim([-10, 1001])
ax.set_xticks(df.index.get_level_values(1).unique())

这将产生这样的图表:

enter image description here

我不确定这是否真的是你需要的,因为在x轴上表示线性刻度会使左侧不可读。 您当前的图表具有“日志”缩放x轴的外观,这似乎是一种更易读的表示。