2014-11-13 4 views
3

Я бы хотел, чтобы на одном и том же участке отображались две гистограммы (с разными цветами и, возможно, с разными альфа). Я попробовалPandas: построение двух гистограмм на одном и том же участке

import random 
x = pd.DataFrame([random.gauss(3,1) for _ in range(400)]) 
y = pd.DataFrame([random.gauss(4,2) for _ in range(400)]) 


x.hist(alpha=0.5, label='x') 
y.hist(alpha=0.5, label='y') 
x.plot(kind='kde', style='k--') 
y.plot(kind='kde', style='k--') 

plt.legend(loc='upper right') 
plt.show() 

Это дает результат в 4 разных графиках. Как я могу использовать их на одном и том же?

ответ

5

Если я правильно понял, оба hists должны войти в один и тот же подзаговор. Так оно и должно быть

fig = plt.figure() 
ax = fig.add_subplot(111) 
_ = ax.hist(x.values) 
_ = ax.hist(y.values, color='red', alpha=.3) 

Вы можете также передать метод панды сюжет объекта оси, так что если вы хотите, чтобы оба из KDE в другом участке делать:

fig = plt.figure() 
ax = fig.add_subplot(111) 
x.plot(kind='kde', ax=ax) 
y.plot(kind='kde', ax=ax, color='red') 

Чтобы получить все в одном сюжете вам нужно два разных y-шкалы, так как kde - плотность, а гистограмма - частота. Для этого вы используете команду axes.twinx().

fig = plt.figure() 
ax = fig.add_subplot(111) 
_ = ax.hist(x.values) 
_ = ax.hist(y.values, color='red', alpha=.3) 

ax1 = ax.twinx() 
x.plot(kind='kde', ax=ax1) 
y.plot(kind='kde', ax=ax1, color='red') 
+0

Спасибо, это почти работает! Теперь у меня есть две гистограммы в одном сюжете, и оба kde's в другом. Как я могу объединить их все на одном рисунке? Запуск всего вашего кода, без второго 'fig = ...' все равно дает мне 2 разных графика. – meto

+0

Ну, дело в том, что kde (плотность) имеет другую шкалу как гистограмму (частоту), поэтому вам нужно ввести второй y-масштаб, используя 'ax.twinx()' как здесь: [link] (http: // matplotlib. орг/примеры/API/two_scales.html). Будет обновлен мой ответ за секунду. – rustil

+0

Проблема с первым решением в том, что подсчеты определяются шириной ячейки. Если они разные, вертикальные оси несравнимы. – user48956

1

Вы можете использовать plt.figure() и функцию add_subplot(): первые 2 аргумента - это количество строк и столбцов, которые вы хотите в своем графике, а последнее - положение подзаголовка на графике.

fig = plt.figure() 
subplot = fig.add_subplot(1, 2, 1) 
subplot.hist(x.ix[:,0], alpha=0.5) 
subplot = fig.add_subplot(1, 2, 2) 
subplot.hist(y.ix[:,0], alpha=0.5) 
Смежные вопросы