2013-08-07 12 views
6

Planuję wykres słupkowy, odczytując dane z pliku CSV, używając pand w Pythonie. Czytałem CSV do DataFrame i wykreślam je za pomocą matplotlib.Zmiana orientacji etykiety i legendy wykresu

Oto jak wygląda mój CSV:

SegmentName Sample1 Sample2 Sample3 

Loop1   100  100  100 

Loop2   100  100  100 

res = DataFrame(pd.read_csv("results.csv", index_col="SegmentName")) 

ja fabuła i ustaw legendę na zewnątrz.

plt.figure() 
ax = res.plot(kind='bar') 
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5)) 

plt.savefig("results.jpg") 

Jednak ticklabele osi X są zorientowane pionowo i dlatego nie mogę odczytać tekstu. Również moja legenda na zewnątrz jest odcięta.

Czy mogę zmienić orientację ticklabeli na poziomą, a następnie dopasować całą figurę, aby legenda była widoczna?

enter image description here

+0

Oczywiście musimy, import numpy jako NP pandy na przywóz pd od pand import * import matplotlib.pyplot jak PLT – user2450971

+0

Dodaj link do swojego obrazu, abyśmy mogli zaktualizować Twoje pytanie, aby dodać obraz. – hooy

+0

Oto zrzut ekranu. http://imageshack.us/photo/my-images/14/srzn.jpg/ – user2450971

Odpowiedz

6

Spróbuj użyć słowa kluczowego „rotacji” po ustawieniu etykietę. Np:

plt.xlabel('hi',rotation=90) 

Albo jeśli trzeba obracać etykiet podziałki, spróbuj:

plt.xticks(rotation=90) 

chodzi o pozycjonowanie legendy itd., To chyba warto spojrzeć na tight layout guide

+0

Spowoduje to obrócenie znaczników na osi X, a nie na osi, więc uważam, że nie osiąga tego, co chce OP. – hooy

+0

Ahh Rozumiem. Tak czy inaczej, kluczowe jest słowo kluczowe "rotacja" - można je przekazać do funkcji etykiety. Aktualizuję odpowiedź. – Dman2

+0

Oto zrzut ekranu mojej fabuły. http://imageshack.us/photo/my-images/14/srzn.jpg/ – user2450971

4

należy użyć matplotlib API i nazywają ax.set_xticklabels(res.index, rotation=0) tak:

index = Index(['loop1', 'loop2'], name='segment_name') 
data = [[100] * 3, [100] * 3] 
columns = ['sample1', 'sample2', 'sample3'] 
df = DataFrame(data, index=index, columns=columns) 

fig, ax = subplots() 
df.plot(ax=ax, kind='bar', legend=False) 
ax.set_xticklabels(df.index, rotation=0) 
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5)) 
fig.savefig('results.png', bbox_inches='tight') 

uzyskać wynikowy działki:

enter image description here

Alternatywnie można nazwać fig.autofmt_xdate() za miły efekt przechylonej, które można oczywiście majstrować z powyższych (i bardziej ogólnie) ax.set_xticklabels():

fig, ax = subplots() 
df.plot(ax=ax, kind='bar', legend=False) 
fig.autofmt_xdate() 
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5)) 
fig.savefig('results-tilted.png', bbox_inches='tight') 

enter image description here

+0

przy próbie użycia ax = dataframe.plot() ORAZ "ax.set_xticklabels (df.month_date, rotation = 90)" Otrzymuję komunikat o błędzie "numpy.ndarray" obiekt nie ma atrybutu "set_xticklabels". Chcę tylko obrócić moją etykietę osi X, aby tekst odczytał datę, pionowo od góry do dołu! – yoshiserry

4

Aby obrócić etykiety, możesz po prostu powiedzieć pandom, aby je obrócić, podając liczbę stopni doArgument. Legendy odcięcia odpowiedzi gdzie indziej, a także, jak here:

df = pd.DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])], 
           orient='index', columns=['one', 'two', 'three']) 
ax = df.plot(kind='bar', rot=90) 
lgd = ax.legend(loc='center left', bbox_to_anchor=(1, 0.5)) 
fig.savefig("results.jpg", bbox_extra_artists=(lgd,), bbox_inches='tight') 
+1

To zdecydowanie najlepszy. 'rot' było tym, czego szukałem –

Powiązane problemy