2016-10-27 6 views
2

저는 사용하고있는 것과 비슷한 더미 데이터 프레임을 만들었습니다. 데이터 프레임은 운임, 캐빈 유형 및 생존 (1은 살아 있고 0은 사망)으로 구성됩니다.오른쪽에 별도의 y 축이있는 카운트 플롯에 선 그래프를 그립니다.

첫 번째 플롯은 factorplot을 통해 많은 그래프를 만들고 각 그래프는 캐빈 유형을 나타냅니다. X 축은 요금 요금으로 표시되며 Y 축은 해당 요금 가격으로 발생 횟수를 나타냅니다.

내가 한 것은 [Cabin, Fare]의 groupby를 통해 또 다른 시리즈를 만든 다음 각 객실 및 요금 가격에서 생존율을 얻기 위해 생존의 평균을 취하는 것으로 진행되었습니다. I가 수행하고자하는 무엇

enter image description here

x =df.groupby(['Cabin','Fare']).Survived.mean() 

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 


df = pd.DataFrame(dict(
     Fare=[20, 10, 30, 40, 40, 10, 20, 30, 40 ,30, 20, 30, 30], 
     Cabin=list('AAABCDBDCDDDC'), 
     Survived=[1, 0, 0, 0 ,0 ,1 ,1 ,0 ,1 ,1 , 0, 1, 1] 
    )) 

g =sns.factorplot(x='Fare', col='Cabin', kind='count', data=df, 
        col_wrap=3, size=3, aspect=1.3, palette='muted') 

plt.show() 
플롯 상기 카운트 그래프에 lineplot (그래서 X 축이 동일하고, 각각의 그래프는 여전히로 표시되는 캐빈 타입), y 축은 위의 코드에서 groupby 시리즈 x로 계산 한 생존 평균입니다. 출력 된 값은 아래의 세 번째 열입니다.

Cabin Fare 
A  10  0.000000 
     20  1.000000 
     30  0.000000 
B  20  1.000000 
     40  0.000000 
C  30  1.000000 
     40  0.500000 
D  10  1.000000 
     20  0.000000 
     30  0.666667 

우측되어야 선 그래프의 y 축, 및 I이 원하는 범위 [0, 0.20, 0.40, 0.60, 0.80, 1.0, 1.2]이다

잠시 동안 해저드 문서를 살펴 봤지만 올바르게 수행하는 방법을 알 수 없었습니다.

원하는 출력이이 이미지와 유사합니다. 글쓰기가 끔찍해서 죄송합니다. 페인트를 잘 사용하는 법을 모르겠습니다. 따라서 진드기와 숫자는 각 그래프의 오른쪽에 있습니다. 선 그림은 각 x, y 점에서 점을 통해 연결됩니다. 따라서 오두막 A의 경우 첫 번째 x, y 점은 (10,0)이고 0은 오른쪽 y 축에 해당합니다. 두 번째 요점은 (20,1)입니다. enter image description here

+0

나는 당신이 어떻게 보이길 원하지 모르겠다. 선이 있어야한다고 생각하는 이미지를 그릴 수 있습니까? – piRSquared

+0

안녕 piRSquared. 이 사이트의 도구를 통해 그래프를 그릴 수 있습니까? 아니면 MS 페인트를 사용해야합니까? 나는 MS 페인트에 익숙하지 않기 때문에 놀아야 만 할 것입니다. – Moondra

+0

좋아, 나는 MS 페인트로 놀고 내 원하는 출력을 추가했습니다. 나는 나의 추가가 명확하길 바란다. – Moondra

답변

1

데이터 작업 :

계산 빈도 카운트는 :

df_counts = pd.crosstab(df['Fare'], df['Cabin']) 

Image

컴퓨팅 그룹간에 수단 및 DF을 얻었다 다시 언 스택. Nan's은 그대로두고 0으로 대체하지 않고 라인 플롯에서 중단을 표시합니다. 그렇지 않으면 연속적으로 표시되므로 여기서는별로 의미가 없습니다.

df_means = df.groupby(['Cabin','Fare']).Survived.mean().unstack().T 

Image

문자열로 X 축 레이블 준비 :

df_counts.index = df_counts.index.astype(str) 
df_means.index = df_means.index.astype(str) 

플로팅 :

fig, ax = plt.subplots(1, 4, figsize=(10,4)) 
df_counts.plot.bar(ax=ax, ylim=(0,5), cmap=plt.cm.Spectral, subplots=True,    
        legend=None, rot=0) 
# Use secondary y-axis(right side) 
df_means.plot(ax=ax, secondary_y=True, marker='o', color='r', subplots=True, 
       legend=None, xlim=(0,4)) 
# Adjust spacing between subplots 
plt.subplots_adjust(wspace=0.5, hspace=0.5) 
plt.show() 

Image

+1

감사합니다. 나는 그 순간에 당신의 대답을 깊이 들여다 볼 수는 없지만 언뜻보기에는 좋게 보인다. – Moondra

+0

안녕하세요. 코드를 자세히 살펴 보겠습니다. 이 단계에 대해 궁금합니다. "x 축 레이블을 문자열로 준비하십시오." 레이블을 문자열로 변환하는 것이 항상 권장됩니다 (이 경우에도 숫자를 x 값으로 사용하고 있습니다). – Moondra

+1

필자가 플로팅 할 때이 특별한 경우에, xticks는 인덱스가 원래 (10,20, ...) 인 경우에도 전체 플롯을 망가 뜨린 기본 정수 인덱스 축 (0,1,2 ...) ...). 어떤 이유로 든 기본 인덱스 값을 선택하는 것 같습니다. 그래서 임시 해결책으로 인덱스 축의 dtype이'str'으로 변환되어 그때 작동했습니다. –

관련 문제