Dodaj etykiety xiy do wykresu pand


197

Załóżmy, że mam następujący kod, który drukuje coś bardzo prostego przy użyciu pand:

import pandas as pd
values = [[1, 2], [2, 5]]
df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], 
                   index=['Index 1', 'Index 2'])
df2.plot(lw=2, colormap='jet', marker='.', markersize=10, 
         title='Video streaming dropout by category')

Wynik

Jak łatwo ustawić etykiety X i Y, zachowując jednocześnie moją zdolność do używania określonych map kolorów? Zauważyłem, że plot()opakowanie dla pand DataFrames nie przyjmuje żadnych specyficznych parametrów.

Odpowiedzi:


329

df.plot()Funkcja zwraca matplotlib.axes.AxesSubplotobiekt. Możesz ustawić etykiety dla tego obiektu.

ax = df2.plot(lw=2, colormap='jet', marker='.', markersize=10, title='Video streaming dropout by category')
ax.set_xlabel("x label")
ax.set_ylabel("y label")

wprowadź opis zdjęcia tutaj

Albo, bardziej zwięźle: ax.set(xlabel="x label", ylabel="y label").

Alternatywnie etykieta na osi x indeksu jest automatycznie ustawiana na nazwę indeksu, jeśli ma taką nazwę. też df2.index.name = 'x label'by działało.


71
czy istnieje konkretny powód, dla którego etykiety xiy nie mogą być dodawane jako argumenty pd.plot()? Biorąc pod uwagę dodatkowy zwięzłość od pd.plot()ponad plt.plot()wydaje się, że to ma sens, aby jeszcze bardziej zwięzłe zamiast rozmowy ax.set_ylabel().
Chrispy

Kiedy to zrobiłem ax.set_ylabel("y label"), zwraca błąd 'list' object is not callable. Dowolny pomysł?
Ledger Yu,

Ciekawy. Nie wiem, czy to zależy od wersji, ale muszę to zrobić ax.axes.set_ylabel("y label").
Ledger Yu,

2
Myślę, że możesz ax.set(xlabel='...)podać wyższą odpowiedź, ponieważ można ją pominąć poza wykresem. To naprawdę najbardziej zwięzłe podejście do ustawiania obu osi, co jest powszechnym przypadkiem użycia.
poulter7,

Jak ustawić lokalizację?
Odisseo

44

Możesz użyć zrób to w następujący sposób:

import matplotlib.pyplot as plt 
import pandas as pd

plt.figure()
values = [[1, 2], [2, 5]]
df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], 
                   index=['Index 1', 'Index 2'])
df2.plot(lw=2, colormap='jet', marker='.', markersize=10,
         title='Video streaming dropout by category')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
plt.show()

Oczywiście musisz zastąpić ciągi „xlabel” i „ylabel” tym, czym chcesz, aby były.


Pamiętaj też, że musisz zadzwonić plt.xlabel()itp. Później df.plot(), a nie wcześniej, ponieważ w przeciwnym razie otrzymasz dwie fabuły - wywołania zmodyfikują „poprzednią” fabułę. To samo dotyczy plt.title().
Tomasz Gandor

30

Jeśli oznaczysz kolumny i indeks ramki danych, pandy automatycznie dostarczą odpowiednie etykiety:

import pandas as pd
values = [[1, 2], [2, 5]]
df = pd.DataFrame(values, columns=['Type A', 'Type B'], 
                  index=['Index 1', 'Index 2'])
df.columns.name = 'Type'
df.index.name = 'Index'
df.plot(lw=2, colormap='jet', marker='.', markersize=10, 
        title='Video streaming dropout by category')

wprowadź opis zdjęcia tutaj

W takim przypadku nadal musisz ręcznie podać etykiety Y (np. Poprzez, plt.ylabeljak pokazano w innych odpowiedziach).


obecnie ta „automatyczna dostawa z DataFrame” nie działa. Właśnie próbowałem (panda w wersji 0.16.0, matplotlib 1.4.3) i wykres generuje poprawnie, ale bez etykiet na osiach.
szeitlin

1
@szeitlin czy mógłbyś zgłosić raport o błędzie na stronie pithas github? github.com/pydata/pandas/issues
shoyer

wiesz co, dzisiaj przynajmniej xlabel działa. może było coś dziwnego w ramce danych, której używałem wczoraj (?). jeśli mogę to odtworzyć, to go złożę!
szeitlin

20

Możliwe jest ustawienie obu etykiet razem z axis.setfunkcją. Poszukaj przykładu:

import pandas as pd
import matplotlib.pyplot as plt
values = [[1,2], [2,5]]
df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], index=['Index 1','Index 2'])
ax = df2.plot(lw=2,colormap='jet',marker='.',markersize=10,title='Video streaming dropout by category')
# set labels for both axes
ax.set(xlabel='x axis', ylabel='y axis')
plt.show()

wprowadź opis zdjęcia tutaj


3
Podoba mi się to .set(xlabel='x axis', ylabel='y axis')rozwiązanie, ponieważ pozwala mi umieścić wszystko w jednym wierszu, w przeciwieństwie do metod wydruku set_xlabel i set_ylabel. Zastanawiam się, dlaczego wszyscy (nawiasem mówiąc, metoda set) nie zwracają obiektu wykresu lub przynajmniej czegoś z niego odziedziczonego.
odporny na uszkodzenia

14

W przypadkach, w których korzystasz pandas.DataFrame.hist:

plt = df.Column_A.hist(bins=10)

Zauważ, że dostajesz tablicę działek, a nie działkę. Dlatego aby ustawić etykietę x, musisz zrobić coś takiego

plt[0][0].set_xlabel("column A")

10

co powiesz na ...

import pandas as pd
import matplotlib.pyplot as plt

values = [[1,2], [2,5]]

df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], index=['Index 1','Index 2'])

(df2.plot(lw=2,
          colormap='jet',
          marker='.',
          markersize=10,
          title='Video streaming dropout by category')
    .set(xlabel='x axis',
         ylabel='y axis'))

plt.show()

2

pandasużywa matplotlibdo podstawowych wykresów ramki danych. Tak więc, jeśli używasz pandasdo podstawowego wydruku, możesz użyć matplotlib do dostosowania wydruku. Proponuję tu jednak alternatywną metodę, seabornktóra pozwala na większą personalizację fabuły bez wchodzenia w podstawowy poziom matplotlib.

Kod roboczy:

import pandas as pd
import seaborn as sns
values = [[1, 2], [2, 5]]
df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], 
                   index=['Index 1', 'Index 2'])
ax= sns.lineplot(data=df2, markers= True)
ax.set(xlabel='xlabel', ylabel='ylabel', title='Video streaming dropout by category') 

wprowadź opis zdjęcia tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.