首页 文章

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

提问于
浏览
2

我创建了一个虚拟数据帧,类似于我正在使用的数据帧 . 数据框包括票价,机舱类型和生存(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轴是我们用上面代码中的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 回答

  • 1

    Data operations:

    计算频率计数:

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

    Image

    计算意味着整个组并将其重新取出以获得 DF . Nan's 保持不变,并没有被零替换's to show the break in the line plot or else they would be continuous which wouldn'这里有意义 .

    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)
    

    Plotting:

    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

相关问题