在计数图上绘制线图,右侧有一个单独的y轴

时间:2016-10-27 22:51:55

标签: python pandas matplotlib seaborn

我创建了一个虚拟数据帧,类似于我使用的数据帧。 数据框包括票价,机舱类型和生存(1是活着的,0 =死的)。

第一个图通过factorplot创建了许多图表,每个图表代表Cabin类型。 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()

我想要做的是,在上面的计数图上绘制一个线图,(所以x轴是相同的,每个图仍然由一个Cabin类型表示),但我希望y- axis是我们在上面的代码中用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轴应位于右侧,我想要的范围是[0,.20,。40,.60,.80,1.0,1.2]

我查看了seaborn docs一段时间,但我无法弄清楚如何正确地做到这一点。

我想要的输出看起来像这个图像。对不起,我的写作看起来很糟糕,我不知道如何使用油漆。因此,刻度线和数字位于每个图的右侧。线图将在每个x,y点通过点连接。因此对于机舱A,第一个x,y点是(10,0),0对应于右y轴。第二点是(20,1),依此类推。 enter image description here

1 个答案:

答案 0 :(得分: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