请保持温和,因为这是我的第一篇文章,我对python / pandas等很陌生。我想做的是利用python和seaborn / matplotlib来协助通过可视化进行数据分析。我正在使用的数据是一个包含多个问题的调查,4个类别的回答(a-d),受访者姓名和分数(4-10)。
目标是将每个问题分解为单独的图形行,每个图形都是响应图(A-D),x表示答案者,y表示评分。
我可以让基本因子图工作,但是我很难确定格式是否正确(如果可能的话)。我想做的是:
1)对于行的每个x轴,仅显示该特定响应的响应者姓名。我尝试设置sharex = False,但这似乎没有用。例如,第一个图表Q1,响应A应该只显示3个名称,而不是全部。
奖金)如果有人在每个酒吧内获得得分#,那也很棒!
已修复 2)在每个图表中附加问题和响应的平均值。目前我能够将其硬编码到最后一个图表,但希望在每个图表中
提前致谢。我目前使用的代码如下所示
#import modules
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
%matplotlib inline
#data
question = ['Q1', 'Q2', 'Q3', 'Q1', 'Q2', 'Q3',
'Q1', 'Q2', 'Q3', 'Q1', 'Q2', 'Q3',
'Q1', 'Q2', 'Q3', 'Q1', 'Q2', 'Q3',
'Q1', 'Q2', 'Q3', 'Q1', 'Q2', 'Q3',
'Q1', 'Q2', 'Q3', 'Q1', 'Q2', 'Q3']
response = ['A', 'C', 'D', 'D', 'D', 'C', 'B',
'A', 'C', 'C', 'C', 'C', 'C', 'C',
'C', 'C', 'A', 'D', 'A', 'A', 'C',
'D', 'C', 'A', 'B', 'B', 'B', 'A',
'A', 'A']
name = ['name1', 'name1', 'name1', 'name2', 'name2', 'name2', 'name3',
'name3', 'name3', 'name4', 'name4', 'name4', 'name5', 'name5',
'name5', 'name6', 'name6', 'name6', 'name7', 'name7', 'name7',
'name8', 'name8', 'name8', 'name9', 'name9', 'name9', 'name10',
'name10', 'name10']
score = [6, 6, 5, 10, 9, 10, 4, 5, 8, 9, 6, 7, 9, 10,
5, 4, 6, 10, 10, 6, 6, 5, 8, 9, 9, 6, 4, 10, 7, 4]
data = pd.DataFrame()
data['question'] = question
data['response'] = response
data['name'] = name
data['score'] = score
#set up questions to loop through
question = ['Q1','Q2','Q3']
#calculate mean of combination of question/response and export to dictionary
grouped = data.groupby(['question','response']).mean()
d = grouped.to_dict()
#iterate through each question and create factorplots
for i in question:
p = data[data['question']==i]
g = sns.factorplot(x='name',y='score', data=p, kind='bar',
col='response', col_order = ['A','B','C','D'],
col_wrap=4, sharey=False)
for j,ax in enumerate(g.axes.flat):
if j == 0:
ax.axhline(y=d['score'][i,'A'], c='r', ls='dashed')
elif j == 1:
ax.axhline(y=d['score'][i,'B'], c='r', ls='dashed')
elif j == 2:
ax.axhline(y=d['score'][i,'C'], c='r', ls='dashed')
else:
ax.axhline(y=d['score'][i,'D'], c='r', ls='dashed')
示例输出 - http://i.imgur.com/HNJUsF9.jpg
样本数据/格式如下 - http://i.imgur.com/AhthMzk.jpg?1