2016-10-27 9 views
2

私は使用しているのと似たダミーデータフレームを作成しました。 データフレームは、運賃、キャビンタイプ、生存(1は生存、0は死んでいる)で構成されています。右側に別のy軸を持つカウントプロットに線グラフをプロットする

最初のプロットは、factorplotを使用して多数のグラフを作成し、各グラフはキャビンタイプを表します。 x軸は運賃で表され、y軸はその運賃での出現数の単なるカウントです。

私がしたことは、[Cabin、Fare]のgroupbyで別のシリーズを作成し、各キャビンと運賃で生存率を得るために生き残りの平均を取ることに進みました。私がやりたい何

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() 

enter image description here

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

は、上記カウントのグラフ上のプロットlineplotあり、(そのx軸は同じであり、各グラフはまだで表され、キャビンタイプ)、私は上記のコードでgroupby系列xで計算した生き残り平均をy軸にしたいと考えています。出力すると、下の3列目になります。

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軸に対応します。第2の点は(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

私がプロットしていたこの特定のケースでは、インデックスが元々(10,20、...)でも完全なプロットを台無しにしたデフォルトの整数インデックス軸(0,1,2 ...) ...)。何らかの理由でデフォルトのインデックス値を取得していたようだ。回避策として、インデックス軸のdtypeが 'str'に変換され、それがうまくいきました。 –

関連する問題