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.

Everaldo Aguiar
źródło

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.

TomAugspurger
źródł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.

jesukumar
źródło
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).

shoyer
źródło
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

Spokój
źródło
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")
Selah
źródło
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()
Dror Hilman
źródło
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

Dr Arslan
źródło