2017-01-05 9 views
3

У меня есть кадр данных Pandas с именем clean, который содержит столбец v, для которого я хотел бы нарисовать гистограмму и наложить график плотности. Я знаю, что могу построить один под другим таким образом:Наложение гистограммы и плотности в Pandas/Matplotlib в Python

import pandas as pd 
import matplotlib.pyplot as plt 

Maxv=200 

plt.subplot(211) 
plt.hist(clean['v'],bins=40, range=(0, Maxv), color='g') 
plt.ylabel("Number") 

plt.subplot(212) 
ax=clean['v'].plot(kind='density') 
ax.set_xlim(0, Maxv) 
plt.xlabel("Orbital velocity (km/s)") 
ax.get_yaxis().set_visible(False) 

enter image description here

Но когда я пытаюсь накладываться, у весов не соответствует (и я освобождаю Y тиков оси и метки):

yhist, xhist, _hist = plt.hist(clean['v'],bins=40, range=(0, Maxv), color='g') 
plt.ylabel("Number") 

ax=clean['v'].plot(kind='density') #I would like to insert here a normalization to max(yhist)/max(ax) 
ax.set_xlim(0, Maxv) 
plt.xlabel("Orbital velocity (km/s)") 
ax.get_yaxis().set_visible(False) 

enter image description here

Некоторые намек? (Дополнительный вопрос: как я могу изменить ширину плотности сглаживания?)

+1

[этот ответ должен помочь] (http://stackoverflow.com/a/39987117/2336654) – piRSquared

+0

Да, да, спасибо. Мне просто нужно найти настройки размера х диапазона и скрыть вторую ось y ... Спасибо! – Matt

+0

Почему вы не используете ['seaborn'] (http://seaborn.pydata.org/tutorial/distributions.html#plotting-univariate-distributions)? – IanS

ответ

1

Нет Я стараюсь это:

ax = clean.v.plot(kind='hist', bins=40, range=(0, Maxv)) 
clean.v.plot(kind='kde', ax=ax, secondary_y=True) 

Но диапазон часть не работает, и Ther все еще проблема левой оси у

enter image description here

+1

Попробуйте установить диапазон после построения графика: 'ax.set (xlim = [0, Maxv])' – IanS

+0

Для левой оси y см. [Этот ответ] (http://stackoverflow.com/a/17877159/5276797). – IanS

+0

@IanS: Большое вам спасибо, он работает для диапазона. :) Я не преуспел с осью y, хотя, но я думаю, что это менее важно. – Matt

4

на основе кода, это должно работать:

ax = clean.v.plot(kind='hist', bins=40, normed=True) 
clean.v.plot(kind='kde', ax=ax, secondary_y=True) 
ax.set(xlim=[0, Maxv]) 

Возможно, вам больше не понадобится secondary_y.

+0

Очень чистый. Я действительно избавился от «secondary_y». Единственное, что я потерял реальный счет (из истории) в y, который теперь нормализуется, но я думаю, это тоже хорошо. – Matt

 Смежные вопросы

  • Нет связанных вопросов^_^