gpt4 book ai didi

python - 在计数图上绘制折线图,​​右侧有单独的 y 轴

转载 作者:太空宇宙 更新时间:2023-11-04 05:21:02 27 4
gpt4 key购买 nike

我创建了一个类似于我正在使用的虚拟数据框。数据框由票价、客舱类型和生存情况组成(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()

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

最佳答案

数据操作:

计算频率计数:

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

Image

计算整个组的均值并将其拆散以获得 DFNan 保持原样,不会被零替换以显示线图中的中断,否则它们将是连续的,这在这里没有多大意义。

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

关于python - 在计数图上绘制折线图,​​右侧有单独的 y 轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40295432/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com