在计数图上绘制折线图,右侧有单独的 y 轴
plotting a line graph on a count plot with a separate y-axis on the right side
我创建了一个类似于我正在使用的虚拟数据框。
数据框由票价、客舱类型和生存情况组成(1 还活着,0 = 死了)。
第一个图通过 factorplot 创建了许多图,每个图代表 Cabin 类型。 x 轴由票价表示,Y 轴只是该票价出现次数的计数。
然后我通过 [Cabin, Fare] 的 groupby 创建了另一个系列,然后继续采用生存的平均值来获得每个 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()
x =df.groupby(['Cabin','Fare']).Survived.mean()
我想做的是,在上面的计数图上绘制一个线图,(所以 x 轴是相同的,并且每个图仍然由 Cabin-type 表示),但我想要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) 等等。
数据操作:
计算频率计数:
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()
我创建了一个类似于我正在使用的虚拟数据框。 数据框由票价、客舱类型和生存情况组成(1 还活着,0 = 死了)。
第一个图通过 factorplot 创建了许多图,每个图代表 Cabin 类型。 x 轴由票价表示,Y 轴只是该票价出现次数的计数。
然后我通过 [Cabin, Fare] 的 groupby 创建了另一个系列,然后继续采用生存的平均值来获得每个 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()
x =df.groupby(['Cabin','Fare']).Survived.mean()
我想做的是,在上面的计数图上绘制一个线图,(所以 x 轴是相同的,并且每个图仍然由 Cabin-type 表示),但我想要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) 等等。
数据操作:
计算频率计数:
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()