我有一个多级索引数据框,我试图在 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。我不认为它是重复的,但如果社区不同意,我希望能简要解释一下如何将其应用到我的案例中。
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 轴的外观,这似乎是更易读的表示形式。
归档时间: |
|
查看次数: |
2957 次 |
最近记录: |