我创建了一个虚拟数据帧,类似于我使用的数据帧。 数据框包括票价,机舱类型和生存(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()
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),依此类推。
答案 0 :(得分:1)
数据操作:
计算频率计数:
df_counts = pd.crosstab(df['Fare'], df['Cabin'])
计算意味着整个群组并将其取消堆叠以获得DF
。 Nan's
保持原样,不会被零替换以显示折线图中的断点,否则它们将是连续的,这在这里没有多大意义。
df_means = df.groupby(['Cabin','Fare']).Survived.mean().unstack().T
将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()