Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在计数图上绘制线图,右侧有单独的y轴_Python_Pandas_Matplotlib_Seaborn - Fatal编程技术网

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

Python 在计数图上绘制线图,右侧有单独的y轴,python,pandas,matplotlib,seaborn,Python,Pandas,Matplotlib,Seaborn,我创建了一个虚拟数据帧,它与我正在使用的数据帧类似。 数据帧包括票价、座舱类型和生存(1为生存,0为死亡) 第一个图通过factorplot创建了许多图形,每个图形表示座舱类型。x轴由票价表示,Y轴只是该票价下发生次数的计数 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns df = pd.DataFrame(dict( Fare=[20,

我创建了一个虚拟数据帧,它与我正在使用的数据帧类似。 数据帧包括票价、座舱类型和生存(1为生存,0为死亡)

第一个图通过factorplot创建了许多图形,每个图形表示座舱类型。x轴由票价表示,Y轴只是该票价下发生次数的计数

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()
然后,我通过[CAB,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轴是相同的,每个图仍然由一个座舱类型表示),但我希望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点的点连接。因此,对于座舱A,第一个x,y点是(10,0),0对应于右y轴。第二点是(20,1),依此类推

数据操作:

计算频率计数:

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

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

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)
绘图:


我不确定您希望这是什么样子。你能在你认为线条应该在的地方画出来吗。有没有办法通过这个网站上的工具来绘制图表?还是我需要使用MS油漆?我将不得不使用MS paint,因为我对它不太熟悉。好的,我使用MS paint并添加了我想要的输出。我希望我的补充是清楚的。那太完美了。我以后再看。除非有人比我强,谢谢。我现在无法深入了解你的答案,但乍一看它看起来不错。嗨,我只是想更深入地了解一下代码。我很好奇这个步骤“将x轴标签准备为字符串”。是否总是建议将标签转换为字符串(即使在本例中,我使用数字作为x的值)?对于这种特殊情况,当我绘图时,
xticks
被证明是默认的整数索引轴(0,1,2…),这破坏了完整的绘图,即使索引最初是(10,20…)。似乎是出于某种原因,它选择了默认的索引值。因此,作为一种解决方法,索引轴的数据类型被转换为
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()