我有一个多级索引数据框,我试图在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()
情节显示:
但是,x轴使用数值作为文本标签。我希望x轴显示出从预期值开始的指数级数(即,1000应该是距离100的10倍,而不是100的10倍)。我该如何解决这个问题?
我怀疑多索引与问题无关,但是它被解释为的数据类型可能很重要。类似的问题似乎在这里发生:seaborn boxplots at desired distances along the x axis。我不认为这是重复的,但如果社区不同意,我将非常感谢如何将其应用于我的案例。
答案 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())
这将产生这样的图表:
我不确定这是否真的是你需要的,因为在x轴上表示线性刻度会使左侧不可读。 您当前的图表具有“日志”缩放x轴的外观,这似乎是一种更易读的表示。