Seaborn 中的 X 轴间隔不正确

Mad*_*ist 1 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()
Run Code Online (Sandbox Code Playgroud)

情节显示:

样本数据图

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

我怀疑多索引与问题无关,但也许它被解释的数据类型很重要。这里似乎发生了类似的问题:沿 x 轴在所需距离处的 seaborn boxplots。我不认为它是重复的,但如果社区不同意,我希望能简要解释一下如何将其应用到我的案例中。

Pri*_*mer 5

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())
Run Code Online (Sandbox Code Playgroud)

这将产生这样的图表:

在此输入图像描述

我不确定这是否真的是您所需要的,因为在 x 轴上表示线性比例会使左侧不可读。您当前的图表具有“对数”缩放 x 轴的外观,这似乎是更易读的表示形式。