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