Сделайте более одной диаграммы в одной ячейке IPython Notebook

88

Я начал свой ноутбук IPython с

ipython notebook --pylab inline

Это мой код в одной ячейке

df['korisnika'].plot()
df['osiguranika'].plot()

Он работает нормально, он рисует две линии, но на одном графике.

Я хотел бы нарисовать каждую линию на отдельном графике. И было бы здорово, если бы графики располагались рядом друг с другом, а не один за другим.

Я знаю, что могу поместить вторую строку в следующую ячейку, и тогда я получу две диаграммы. Но хотелось бы, чтобы графики были близки друг к другу, потому что они представляют одну и ту же логическую единицу.

WebOrCode
источник

Ответы:

89

Сначала сделайте несколько осей и передайте их функции Pandas plot, например:

fig, axs = plt.subplots(1,2)

df['korisnika'].plot(ax=axs[0])
df['osiguranika'].plot(ax=axs[1])

Он по-прежнему дает вам одну фигуру, но с двумя разными графиками рядом друг с другом.

Рутгер Кэссис
источник
3
Это работает. Теперь я не буду менять размер изображения. Я могу сделать это с помощью fig, axs = plt.subplots (1,2, figsize = (15, 5)). Есть ли способ установить размер изображения в пикселях?
WebOrCode
1
Использование фигового размера действительно является способом, это размер в дюймах. Сколько пикселей это будет, зависит от dpi, которое фиксировано для отображения на экране. Но для сохранения его можно установить, добавив ключевое слово dpi.
Рутгер Кэссис
3
Не совсем точно, что dpi фиксируется для отображения на экране (ну, это так, и это не так). IPython отображает изображения исключительно на основе их размера в пикселях, и этот размер в пикселях определяется в matplotlib путем умножения размера цифры в дюймах на savefig.dpiконфигурацию. Строчные рисунки используют тот же путь savefig, что и записываемые файлы.
minrk 06
Спасибо, что указали на это, я не знал, что это так работает. Разве не было бы удобнее, если бы (в том числе) учитывалось отображение dpi, так как это легко установить при создании рисунка. Для savefig.dpi я не знаю другого способа, кроме mpl.rcParams['savefig.dpi'] = 120. Для отображения dpi есть ключевое слово во многих местах, например plt.figure(dpi=120), но оно сейчас игнорируется, отсюда и мое неправильное предположение о его исправлении.
Рутгер Кэссис
102

Вы также можете вызывать функцию show () после каждого графика. например

   plt.plot(a)
   plt.show()
   plt.plot(b)
   plt.show()
Tooblippe
источник
1
Отлично, но как установить расположение сюжетной картинки, например (2,2) или (1,2)?
Pythoner 08
3
При таком варианте графики обязательно появляются один за другим. Для большего контроля над общей компоновкой pyplot.subplots()это лучший способ.
Эрик О Лебигот 01
1
Я удалил ссылку.
Tooblippe
12

Что-то вроде этого:

import matplotlib.pyplot as plt
... code for plot 1 ...
plt.show()
... code for plot 2...
plt.show()

Обратите внимание, что это также будет работать, если вы используете seabornпакет для построения графиков:

import matplotlib.pyplot as plt
import seaborn as sns
sns.barplot(... code for plot 1 ...) # plot 1
plt.show()
sns.barplot(... code for plot 2 ...) # plot 2
plt.show()
Мольдвассер
источник
11

Другой способ, для разнообразия. Хотя это несколько менее гибко, чем другие. К сожалению, графики отображаются один над другим, а не бок о бок, как вы просили в своем исходном вопросе. Но это очень лаконично.

df.plot(subplots=True)

Если во фрейме данных больше двух серий, и вы хотите построить только эти две серии, вам нужно будет заменить их dfна df[['korisnika','osiguranika']].

Лучано
источник
2

Не знаю, новая ли это функциональность, но она будет представлена ​​на отдельных рисунках:

df.plot(y='korisnika')
df.plot(y='osiguranika')

в то время как это будет строиться на том же рисунке: (точно так же, как код в op)

df.plot(y=['korisnika','osiguranika'])

Я нашел этот вопрос, потому что использовал предыдущий метод и хотел, чтобы они строились на одной и той же фигуре, поэтому ваш вопрос фактически был моим ответом.

Стивен
источник