在计数图上绘制一条线图,并在右侧添加一个单独的y轴。

3
我创建了一个类似于正在使用的虚拟数据框架。该数据框架包含票价、舱室类型和生还情况(1表示生存,0表示死亡)。
第一个图表通过factorplot创建许多图形,每个图形代表一个舱室类型。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()

我想要做的是,在上面的计数图上绘制一条折线图(因此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文档一段时间,但是我无法正确地做到这一点。我的期望输出类似于这个图像。对不起,我的书写看起来很糟糕,我不知道怎么使用画图工具。因此,每张图的刻度和数字都在右侧。线图将通过每个x,y点的点连接。所以对于Cabin A,第一个x,y点是(10,0),其中0对应右侧的y轴。第二个点是(20,1),依此类推。enter image description here

我不确定你想让它看起来像什么。你能在图像上画出你认为应该有线条的地方吗? - piRSquared
嗨,piRSquared。这个网站上有没有通过工具在图表上绘制的方法?还是我需要使用 MS Paint?我将不得不尝试一下 MS Paint,因为我对它不太熟悉。 - Moondra
好的,我玩了一下微软画图,加入了我想要的输出。希望我的修改很清晰明了。 - Moondra
太好了,这样我稍后可以查看它。除非有其他人在我之前完成了。 - piRSquared
1个回答

2

数据操作:

计算频率统计:

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
嗨,我刚开始深入研究这段代码。 我对这个步骤“将x轴标签准备为字符串”感到好奇。 即使在这种情况下我使用数字作为x的值,是否总是建议将标签转换为字符串? - Moondra
2
对于这个特定的情况,在我绘图时,xticks 显示为默认的整数索引轴(0,1,2...),即使索引最初是(10,20,...)也会破坏整个图形。似乎它因某种原因选择了默认的索引值。因此,作为解决方法,将索引轴的 dtype 转换为 str,然后就可以正常工作了。 - Nickil Maveli
2
感谢您的解释。 - Moondra
@NickilMaveli 感谢您对 xticks 的解释,我在绘制类似的图形时遇到了这个问题! - David Kunz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接