Ваша проблема в том, что вы создаете только один 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()
Это производит вывод как это:
