Построение нескольких перекрывающихся гистограмм с пандами - PullRequest
3 голосов
/ 28 марта 2019

У меня есть два разных кадра данных с 19 переменными в каждом, и я строю несколько графиков с гистограммами каждой переменной следующим образом:

fig, ax = plt.subplots(figsize=(19,10), dpi=50)
dataframe1.hist(ax=ax, layout=(3,7), alpha=0.5)

fig, ax = plt.subplots(figsize=(19,10), dpi=50)
dataframe2.hist(ax=ax, layout=(3,7), alpha=0.5)

Это дает два изображения с 19 гистограммами внутри. То, что я хочу попробовать, это построить только одно изображение с общими гистограммами в одном и том же субплоте.

Я пробовал это:

fig, ax = plt.subplots(figsize=(19,10), dpi=50)
dataframe1.hist(ax=ax, layout=(3,7), alpha=0.5, label='x')
dataframe2.hist(ax=ax, layout=(3,7), alpha=0.5, label='y', color='red')

Но это только последняя картина. Это аналогичный пример: Составьте две гистограммы одновременно с помощью matplotlib , но как я могу применить его на двух моих 19 субплотах?

Любые идеи будут приветствоваться, заранее спасибо!

enter image description here

P.S .: В настоящее время я использую ноутбуки Jupyter с опцией % matplotlib notebook

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

Ваша проблема в том, что вы создаете только один Axes объект в вашем plt.subplots вызове, когда вам действительно нужно 21 (3x7). Поскольку количество предоставленных вспомогательных участков не соответствует количеству запрошенных вспомогательных участков, pandas создает новые вспомогательные участки. Поскольку это происходит дважды, вы видите только второй набор гистограмм.

Вы можете вообще пропустить вызов subplots и позволить пандам делать всю работу. Вызов hist возвращает все необходимые подзаговоры, и его можно использовать во втором вызове hist.

EDIT :

Я понял, что, если количество желаемых графиков на самом деле не равно количеству ячеек сетки (в данном случае 3x9 = 21), вы должны передать именно столько субплотов, на которых вы действительно хотите построить (в этом дело 19). Однако вызов df.hist возвращает подзаговор для каждой ячейки сетки (т.е. 21) и, по-видимому, скрывает неиспользуемые ячейки. Следовательно, вам нужно передать только подмножество всех возвращенных подзаговоров во второй вызов hist. Это проще всего сделать, преобразовав 2-мерный массив вспомогательных участков в 1-мерный, а затем разделив этот массив, например, с помощью `axes.ravel () [: 19]. Я соответственно отредактировал код:

import numpy as np
from matplotlib import pyplot as plt
import pandas as pd

length=19

loc = np.random.randint(0,50,size=length)
scale = np.random.rand(length)*10
dist = np.random.normal(loc=loc, scale=scale, size=(100,length))
df1 = pd.DataFrame(data=list(dist))


axes = df1.hist(layout=(3,7), alpha=0.5, label='x')

loc = np.random.randint(0,50,size=length)
scale = np.random.rand(length)*10
dist = np.random.normal(loc=loc, scale=scale, size=(100,length))
df2 = pd.DataFrame(data=list(dist))

df2.hist(ax=axes.ravel()[:length], layout=(3,7), alpha=0.5, label='x',color='r')

plt.show()

Это производит вывод как это:

result of the above code

1 голос
/ 28 марта 2019

Когда вы звоните subplots, вы можете указать желаемое количество строк и столбцов.В вашем случае вы хотите 3 строки и 7 столбцов.Тем не менее, .plot будет раздражен тем, что имеется 21 ось, а только 19 для построения графика из вашего информационного кадра.Поэтому вместо этого мы сведем оси в список и преобразуем в список, что позволит нам одновременно удалить последние две фигуры и набора осей через .pop()

fig, axes = plt.subplots(figsize=(19,10), dpi=50, nrows=3, ncols=7)
flat_axes = list(axes.reshape(-1))
fig.delaxes(flat_axes.pop(-1))
fig.delaxes(flat_axes.pop(-1))

dataframe1.hist(ax=flat_axes, alpha=0.5, label='x')
dataframe2.hist(ax=flat_axes, alpha=0.5, label='x',color='r')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...