2016-04-02 26 views
1

Seabornで表示しようとしているマルチレベルのインデックス付きデータフレームがあります。プロットはうまく表示されていますが、x軸の値は実際のx値の代わりにテキストラベルとして扱われています。以下のスニペットを作製し、プロットする方法サンプルデータを示していますSeabornで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は100から10倍にすべきです)。どうすれば修正できますか?

マルチインデックスは問題とは関係ないと思われますが、解釈されるデータ型は多分重要です。同様の問題がここで起きているようです:seaborn boxplots at desired distances along the x axis。私はそれが重複しているとは思わないが、コミュニティが意見が一致しない場合は、私のケースにそれを適用する方法の簡単な説明に感謝します。

答えて

4

factorplotは、カテゴリ(または要因)として[1, 10, 100, 1000]を扱っています。それらはシーボーンの数字ではなく、ただのラベルです。 そのため、これらのラベルは均等に配置されています(内部的には、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軸の「ログ」が表示されます。

+0

ありがとうございました。これはまさに私が探していたものです。この方法で 'ax.set_ * scale'を自由に適用することができます。あなたが疑問に思っていた場合、私は準対数間隔で取得されたいくつかのデータを持っていますが、通常のプロットでは線形関係を示す必要があります。線形の関係を確認したら、線形のものが不十分な場合は、おそらくあなたの助言を取り、semilogxまたはログログプロットを行います。 –

+0

ところで、私は正しくあなたの部分を読み込んでいますか?シーボーンをインポートすると、その後の正規のmatplotlibプロットのデフォルトが変更されますか? –

+1

これは正しいことです。あなたが 'seabornをインポートする 'ときに、そのセッションのmatplotlibのデフォルトを上書きするか、手動でそれらの設定を変更するまでです。 – Primer

関連する問題