Додайте мітки x і y до ділянки панди


197

Припустимо, у мене є наступний код, який побудує щось дуже просте за допомогою панд:

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

Вихідні дані

Як легко встановлювати x і y-мітки, зберігаючи свою здатність використовувати певні кольорові карти? Я помітив, що plot()обгортка для панд DataFrames не приймає конкретних параметрів для цього.

Відповіді:


329

df.plot()Функція повертає matplotlib.axes.AxesSubplotоб'єкт. Ви можете встановити мітки на цьому об'єкті.

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

введіть тут опис зображення

Або, більш коротко: ax.set(xlabel="x label", ylabel="y label").

Крім того, мітка осі індексу x автоматично встановлюється на ім'я індексу, якщо воно має. так df2.index.name = 'x label'би теж працювало.


71
Чи є конкретна причина, чому мітки x і y не можна додавати як аргументи pd.plot()? З огляду на додаткова стислість в pd.plot()протягом plt.plot(), здається , було б доцільно , щоб зробити його ще більш ємним , замість того , щоб дзвонити ax.set_ylabel().
Кріппі

Коли я це зробив ax.set_ylabel("y label"), він повертає помилку 'list' object is not callable. Будь-яка ідея?
Леджер Ю.

Цікаво. Я не знаю, чи це залежить від версії, але мені доведеться це зробити ax.axes.set_ylabel("y label").
Леджер Ю.

2
Я думаю, ви могли б поставити ax.set(xlabel='...)вище в цій відповіді, оскільки це може бути пропущено повз графік. Дійсно встановити обидві осі, це справді найкоротший підхід, що є загальною справою.
poulter7

Як встановити місце розташування?
Одіссей

44

Ви можете використовувати так:

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

Очевидно, що ви повинні замінити рядки 'xlabel' та 'ylabel' такими, якими ви їх хочете.


Також зауважте, що вам потрібно дзвонити plt.xlabel()тощо після df.plot(), а не раніше, оскільки в іншому випадку ви отримаєте два сюжети - виклики змінять "попередній" сюжет. Те ж саме стосується plt.title().
Томаш Гандор

30

Якщо ви позначите стовпці та індекс вашої DataFrame, панди автоматично подають відповідні мітки:

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

введіть тут опис зображення

У цьому випадку вам все одно потрібно буде вводити y-мітки вручну (наприклад, через, plt.ylabelяк показано в інших відповідях).


на даний момент, що "автоматичне постачання з DataFrame" не працює. Я щойно спробував це (версія панди 0.16.0, matplotlib 1.4.3), і сюжет генерується правильно, але без міток на осях.
szeitlin

1
@szeitlin Ви можете, будь ласка, подати звіт про помилку на сторінці pandas github? github.com/pydata/pandas/isissue
shoyer

Ви знаєте що, сьогодні принаймні працює xlabel. можливо, було щось дивне у фреймі даних, яким я користувався вчора (?). якщо я зможу його відтворити, я подам його!
szeitlin

20

Можна встановити обидві мітки разом із axis.setфункцією. Шукайте приклад:

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

введіть тут опис зображення


3
Мені подобається .set(xlabel='x axis', ylabel='y axis')рішення, оскільки воно дозволяє мені розмістити все це в один рядок, на відміну від методів сюжету set_xlabel та set_ylabel. Цікаво, чому вони всі (включаючи встановлений метод, до речі) не повертають сюжетний об’єкт або хоча б щось успадковують від нього.
відмовостійкість

14

Для випадків, коли ви використовуєте pandas.DataFrame.hist:

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

Зауважте, що ви отримуєте масив сюжетів, а не сюжет. Таким чином, щоб встановити мітку x, вам потрібно буде зробити щось подібне

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

10

а як на рахунок ...

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

pandasвикористовує matplotlibдля основних графіків кадрів даних. Отже, якщо ви використовуєте pandasбазовий сюжет, ви можете використовувати matplotlib для налаштування сюжету. Однак я пропоную тут альтернативний метод, seabornякий дозволяє більше налаштувати сюжет, не переходячи до базового рівня matplotlib.

Код роботи:

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

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.