【发布时间】:2021-10-28 17:31:04
【问题描述】:
我有一份问卷,用户回答的分数从 1 到 7(李克特量表)。问卷分为两部分。用户属于两个组(X 和 Y),每个用户可能具有两个角色(A 和 B)之一。我在 FacetGrid 上使用 seaborn heatmap 来显示问卷结果。
这是我的代码:
import pandas as pd
import seaborn as sns
df = pd.DataFrame(
data={
'Group': ['X', 'Y', 'Y', 'X', 'Y', 'X', 'Y', 'Y', 'X', 'X'],
'Role': ['A', 'B', 'A', 'A', 'B', 'B', 'A', 'A', 'A', 'B'],
'Question 1': [3,6,5,5,6,6,4,5,7,5],
'Question 2': [7,7,5,6,4,4,4,4,7,5],
'Question 3': [6,5,3,5,7,7,6,5,4,4],
'Question 4': [6,3,4,5,5,7,6,5,4,4]
}
)
def f(group):
gg = group[group.columns[-4:]].T.apply(lambda row : row.value_counts(), axis=1)
for score in range(1, 8):
if score not in gg:
gg[score] = 0.0
return gg
df1 = df.groupby(['Group', 'Role']) \
.apply(f) \
.fillna(0) \
.reset_index() \
.rename(columns={'level_2':'Question'})
fg = sns.FacetGrid(
data=df1,
row='Group',
col='Role'
)
def draw_heatmap(*args, **kwargs):
data = kwargs.pop('data')
d = data[['Question', 1, 2, 3, 4, 5, 6, 7]] \
.melt(id_vars='Question', var_name="Likert Score", value_name="Count") \
.pivot(index="Question", columns="Likert Score", values="Count")
d = d.div(d.sum(axis=1), axis=0).round(2)
sns.heatmap(d, **kwargs)
fg.map_dataframe(
draw_heatmap,
cbar_ax=fg.fig.add_axes([1, 0.3, .02, .4]),
cbar_kws={'label': 'Percentage of responses'},
vmin=0,
vmax=1,
cmap="Blues",
linewidths=.1
)
这是输出:
我想显示问题属于调查问卷的哪个部分,理想情况下如下所示:
我看到了这个question,但我无法将建议的解决方案应用于我的案例。
非常感谢任何帮助。谢谢!
【问题讨论】:
标签: python matplotlib seaborn