2016-03-26 2 views
4

Я работаю с набором данными, который выглядит следующим образом:Plotting многослойной гистограммы с пандами с Группировать

Gender, Height, Width Male, 23.4, 4.4 Female, 45.4, 4.5

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

Это сложная гистограмма из документации. Если бы было три пола, это может быть хорошим графиком для ширины.

enter image description here

Я надеюсь, вы понимаете, что я имею в виду, я хлопнув голову в это в течение нескольких часов.

ответ

0

Следующий код

from StringIO import StringIO 

s = StringIO("""Gender, Height, Width 
Male, 23.4, 4.4 
Female, 45.4, 4.5""") 

import pandas as pd 

df = pd.read_csv(s, header=0).set_index('Gender') 
df.T.plot.bar(stacked=True); 

производит этот

enter image description here

Чтобы играть с выглядеть и чувствовать себя вы могли бы сделать много вещей, например, (См here)

import matplotlib 
matplotlib.style.use('ggplot') 

или попробовать seaborn.


Для отдельных участков для колонн, вы могли бы сделать что-то вроде этого:

from StringIO import StringIO 

s = StringIO("""Gender, Height, Width 
Male, 23.4, 4.4 
Female, 45.4, 4.5""") 

import pandas as pd 

df = pd.read_csv(s, header=0).set_index('Gender').T 

subplot(2, 1, 1) 
hist(df.Male.values); 
subplot(2, 1, 2) 
hist(df.Female.values); 

(К сожалению, я сих пор не на компьютере, где я могу запустить такие вещи, так что последний фрагмент кода может содержат небольшую опечатку.)

+0

Я бы на самом деле люблю, чтобы получить независимые гистограммы для каждого столбца, так что я могу исследовать мультимодальность каждого из столбцов –

+0

@unkown См. обновление –

+0

Спасибо, но я получаю это: 'UserWarning: ввод в формате 2D должен быть nsamples x nvariables;' –

5

Ваш пример из документации pandas содержит три отдельных столбца в кадре данных, а df.hist() генерирует три разные гистограммы для этих трех столбцов. Ваша структура данных немного отличается. Если вы хотите использовать Matplotlib напрямую, вы можете попробовать это:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
np.random.seed(10) 
df = pd.DataFrame({"Gender":np.random.choice(["Female", "Male"], 1000), 
       "Height": 30+np.random.randn(1000)*5, 
       "Width": 5+np.random.randn(1000)}) 
df.loc[df["Gender"]=="Male", "Height"] = df.loc[df["Gender"]=="Male", "Height"] + 8 

plt.hist(df[df["Gender"]=="Male"]["Height"].reset_index(drop=True), alpha=0.6, label="Male") 
plt.hist(df[df["Gender"]=="Female"]["Height"].reset_index(drop=True), alpha=0.6, label="Female") 
plt.legend() 
plt.show() 

Это создаст гистограмму наподобие этой:

enter image description here

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