2016-10-27 133 views
2

我創建了一個類似於我正在使用的虛擬數據框。 數據幀包括票價,客艙類型和生存(1是活着的,0 =死亡)。在計數圖上繪製折線圖,​​右邊有單獨的y軸

第一個繪圖通過factorplot創建許多圖形,每個圖形表示Cabin類型。 X軸由票價表示,Y軸僅表示該票價出現次數的計數。

我之後做的是通過[Cabin,Fare]組創建另一個系列,然後以每個客艙和票價的生存率來計算生存的平均值。

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軸是相同的,並且每個圖形仍然由a表示小屋型),但我希望Y軸是我們在上面的代碼中用系列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軸爲線圖應是在右側的,我想範圍爲[0,0.20,0.40,0.60,0.80,1.0,1.2]

我通過seaborn文檔看了一會兒,但我無法弄清楚如何正確地做到這一點。

我想要的輸出看起來像這個圖像。我很抱歉,我的寫作看起來很可怕,我不知道如何使用油漆。所以蜱和數字在每張圖的右側。線圖將在每個x,y點通過點連接。因此,對於A艙,第一個x,y點是(10,0),0對應於右側的y軸。第二點是(20,1)等等。 enter image description here

+0

我不確定你想要這個樣子。你可以借鑑你認爲線條應該是的形象嗎? – piRSquared

+0

你好。有沒有通過本網站上的工具繪製圖表的方法?或者我需要使用MS油漆?因爲我不太熟悉它,所以我將不得不使用MS油漆。 – Moondra

+0

好吧,我玩MS油漆,並添加了我所需的輸出。我希望我的補充很清楚。 – Moondra

回答

1

數據操作:

計算頻率計數:

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

Image

計算整個組裝置和拆散回獲得DFNan's保持原樣,不會被零代替以顯示線圖中的中斷,否則它們將是連續的,這在這裏沒有多大意義。

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'原來是默認的整數索引軸(0,1,2 ...),它破壞了完整的圖,儘管索引本來是(10,20, ...)。似乎無論出於何種原因,它都在收集默認索引值。所以,作爲一種解決方法,索引軸的dtype被轉換爲'str',然後它就起作用了。 –