Добавьте метки 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().
— Chrispy

Когда я это сделал ax.set_ylabel("y label"), он возвращает ошибку 'list' object is not callable. Любая идея?
— Леджер Ю

Интересный. Я не знаю, зависит ли это от версии, но мне придется это сделать ax.axes.set_ylabel("y label").
— Ledger Yu

2
Я думаю, что вы могли бы поставить ax.set(xlabel='...)выше в этом ответе, так как это может быть пропущено за графиком. Это действительно самый краткий подход для установки обеих осей, который является обычным вариантом использования.
— poulter7

Как вы устанавливаете местоположение?
— Odisseo

45

Вы можете использовать сделать это так:

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, pandas автоматически предоставит соответствующие метки:

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 Не могли бы вы подать отчет об ошибке на странице Gandub Pandas? github.com/pydata/pandas/issues
— 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. Интересно, почему они все (включая метод set, между прочим) не возвращают объект plot или, по крайней мере, что-то унаследованное от него.
— отказоустойчивый

14

Для случаев, когда вы используете pandas.DataFrame.hist:

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

Обратите внимание, что вы получаете массив графиков, а не график. Таким образом, чтобы установить метку х, вам нужно сделать что-то вроде этого

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.