2016-04-02 11 views
1

Ich habe einen mehrstufigen indizierten Datenrahmen, den ich versuche, in Seaborn anzuzeigen. Das Diagramm wird angezeigt, aber die Werte der X-Achse werden als Textbeschriftungen anstelle von tatsächlichen X-Werten behandelt. Die Schnipsel unten zeigt, wie Abtastdaten hergestellt und aufgetragen:X-Achse ist nicht korrekt in Seaborn

>>> 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() 

Der Plot zeigt sich:

plot of sample data

jedoch die x-Achse ist die numerische Werte als Textetiketten verwenden. Ich möchte, dass die x-Achse eine exponentielle Progression zeigt, wie es von den Werten erwartet wird (d. H. 1000 sollte 10 mal weiter von 100 als 100 von 10 sein). Wie kann ich das beheben?

Ich vermute, dass der Multi-Index für das Problem nicht relevant ist, aber vielleicht wird der Datentyp, der interpretiert wird, signifikant. Ein ähnliches Problem scheint hier zu passieren: seaborn boxplots at desired distances along the x axis. Ich glaube nicht, dass es sich um ein Duplikat handelt, aber wenn die Gemeinschaft nicht einverstanden ist, würde ich mich über eine kurze Erläuterung freuen, wie ich sie in meinem Fall anwenden kann.

Antwort

4

factorplot behandelt Ihre [1, 10, 100, 1000] als Kategorien (oder Faktoren). Das sind keine Zahlen für Seaborn - nur Etiketten. Deshalb sind sie gleichmäßig verteilt (und intern platziert sie diese Etiketten auf einer linearen Abstandskala von 0 bis 3). Der Nebeneffekt davon ist, dass es die logarithmisch skalierte Darstellung nachahmt, die Sie behalten möchten.

Wenn ich richtig verstehe, was zu tun versuchen, kann dies ohne Seaborn erreicht werden, aber wenn es Styling Sie sind, nachdem Sie es immer noch und danach etwas tun importieren:

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()) 

die Diagramm wie folgt produzieren:

enter image description here

Und ich bin nicht sicher, ob das wirklich ist, was Sie brauchen, da lineare Skala auf der x-Achse darstellt, wird linken Seite unlesbar zu machen. Ihr aktuelles Diagramm hat das Aussehen einer logarithmisch skalierten X-Achse, die eine besser lesbare Darstellung zu sein scheint.

+0

Danke. Genau das habe ich gesucht. Auf diese Weise kann 'ax.set_ * scale' beliebig angewendet werden. Falls Sie sich wundern, ich habe einige Daten, die in quasi-logarithmischen Intervallen aufgenommen wurden, aber eine lineare Beziehung auf einer regulären Grafik zeigen sollten. Sobald ich die lineare Beziehung verifiziert habe, werde ich wahrscheinlich Ihren Rat befolgen und ein Semilogx- oder Log-Log-Diagramm erstellen, wenn das lineare nicht ausreicht. –

+0

Übrigens, lese ich Ihren Teil über den Import korrekt? Ändert das Importieren von Seabord die Standardwerte der nachfolgenden regulären Matplotlib-Plots? –

+1

Das ist richtig - wenn Sie 'seaborn importieren', werden die matplotlib-Standardeinstellungen für diese Sitzung überschrieben oder bis Sie diese Einstellungen manuell ändern. – Primer

Verwandte Themen