在 Titanic 数据集上使用 groupby 和 unstack 后,无法绘制一系列计数图
After using groupby and unstack on Titanic dataset, can't graph a series of countplots
所以我的原始数据框 Cabin_hunt
看起来像这样:
Fare Cabin Pclass Ticket
583 40.1250 A10 1 13049
208 27.7208 A11 1 17613
475 52.0000 A14 1 110465
556 39.6000 A16 1 11755
331 29.7000 A18 1 17580
284 26.0000 A19 1 113056
599 56.9292 A20 1 17485
737 512.3292 B101 1 17755
815 0.0000 B102 1 112058
215 42.5000 B11 1 113038
329 57.9792 B18 1 111361
523 57.9792 B18 1 111361
269 135.6333 C99 1 17760
97 63.3583 D10 1 17759
350 63.3583 D10 3 17759
765 77.9583 D11 3 13502
然后我根据 'Cabin' 值的第一个字母开始划分 'Cabin'。我的最终目标是以图形方式显示 Pclass 和每个 Cabin 组之间的关系。我通过以下代码创建了群组:
Cabin_group =Cabin_hunt.groupby([ Cabin_hunt.Pclass,Cabin_hunt.Cabin.str[0]]).size().unstack()
我的输出如下所示:
Cabin A B C D E F G T
Pclass
1 22.0 65.0 94.0 40.0 34.0 NaN NaN 1.0
2 NaN NaN NaN 6.0 4.0 13.0 NaN NaN
3 NaN NaN NaN NaN 3.0 8.0 5.0 NaN
Cabin_group.columns 和 index 输出以下代码:
Cabin_group.columns
Index([u'A', u'B', u'C', u'D', u'E', u'F', u'G', u'T'], dtype='object', name=u'Cabin')
Cabin_group.index
Int64Index([1, 2, 3], dtype='int64', name=u'Pclass')
理想情况下,我要一屏8图;每个字母(A-T)一个。
在每个图表中,我想显示三个条形图,每个条形图代表 x 轴上的 Pclass 和 y 轴上的观察量。
我试过 Countplot
和 PairGrid
但我无法让它工作。
g = sns.PairGrid(Cabin_group)
g.map(sns.countplot)
plt.show()
我也试过这样的:
g = sns.FacetGrid(Cabin_group, col=Cabin_group.columns, size=4, aspect=.5)
g.map(sns.countplot,x=Cabin_group.index)
回想起来,这似乎是完全错误的。
如有任何建议,我们将不胜感激。
据我从你想要得到的图表的描述中了解到,这就是我在 IPython 笔记本中所做的:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# Generate Data
data = np.array(
[[ 22., 65., 94., 40., 34., np.nan, np.nan, 1.],
[ np.nan, np.nan, np.nan, 6., 4., 13., np.nan, np.nan],
[ np.nan, np.nan, np.nan, np.nan, 3., 8., 5., np.nan]]
)
df = pd.DataFrame(data)
df.columns.name = 'Cabin'
df.columns = 'A B C D E F G T'.split()
df.index.name = 'Pclass'
df.index = [1, 2, 3]
# Plot Data
for no, col in enumerate(df):
plt.subplot(2, 4, no+1)
df[col].plot(kind='bar', title=col)
plt.xlabel('Pclass')
plt.ylabel('Amount of observations')
plt.ylim([0, df.max().max()])
plt.tight_layout()
plt.show()
这是结果:
所以我的原始数据框 Cabin_hunt
看起来像这样:
Fare Cabin Pclass Ticket
583 40.1250 A10 1 13049
208 27.7208 A11 1 17613
475 52.0000 A14 1 110465
556 39.6000 A16 1 11755
331 29.7000 A18 1 17580
284 26.0000 A19 1 113056
599 56.9292 A20 1 17485
737 512.3292 B101 1 17755
815 0.0000 B102 1 112058
215 42.5000 B11 1 113038
329 57.9792 B18 1 111361
523 57.9792 B18 1 111361
269 135.6333 C99 1 17760
97 63.3583 D10 1 17759
350 63.3583 D10 3 17759
765 77.9583 D11 3 13502
然后我根据 'Cabin' 值的第一个字母开始划分 'Cabin'。我的最终目标是以图形方式显示 Pclass 和每个 Cabin 组之间的关系。我通过以下代码创建了群组:
Cabin_group =Cabin_hunt.groupby([ Cabin_hunt.Pclass,Cabin_hunt.Cabin.str[0]]).size().unstack()
我的输出如下所示:
Cabin A B C D E F G T
Pclass
1 22.0 65.0 94.0 40.0 34.0 NaN NaN 1.0
2 NaN NaN NaN 6.0 4.0 13.0 NaN NaN
3 NaN NaN NaN NaN 3.0 8.0 5.0 NaN
Cabin_group.columns 和 index 输出以下代码:
Cabin_group.columns
Index([u'A', u'B', u'C', u'D', u'E', u'F', u'G', u'T'], dtype='object', name=u'Cabin')
Cabin_group.index
Int64Index([1, 2, 3], dtype='int64', name=u'Pclass')
理想情况下,我要一屏8图;每个字母(A-T)一个。 在每个图表中,我想显示三个条形图,每个条形图代表 x 轴上的 Pclass 和 y 轴上的观察量。
我试过 Countplot
和 PairGrid
但我无法让它工作。
g = sns.PairGrid(Cabin_group)
g.map(sns.countplot)
plt.show()
我也试过这样的:
g = sns.FacetGrid(Cabin_group, col=Cabin_group.columns, size=4, aspect=.5)
g.map(sns.countplot,x=Cabin_group.index)
回想起来,这似乎是完全错误的。
如有任何建议,我们将不胜感激。
据我从你想要得到的图表的描述中了解到,这就是我在 IPython 笔记本中所做的:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# Generate Data
data = np.array(
[[ 22., 65., 94., 40., 34., np.nan, np.nan, 1.],
[ np.nan, np.nan, np.nan, 6., 4., 13., np.nan, np.nan],
[ np.nan, np.nan, np.nan, np.nan, 3., 8., 5., np.nan]]
)
df = pd.DataFrame(data)
df.columns.name = 'Cabin'
df.columns = 'A B C D E F G T'.split()
df.index.name = 'Pclass'
df.index = [1, 2, 3]
# Plot Data
for no, col in enumerate(df):
plt.subplot(2, 4, no+1)
df[col].plot(kind='bar', title=col)
plt.xlabel('Pclass')
plt.ylabel('Amount of observations')
plt.ylim([0, df.max().max()])
plt.tight_layout()
plt.show()
这是结果: