Seaborn Factor Plot - 数据格式问题

时间:2016-10-31 23:15:01

标签: python matplotlib seaborn

请保持温和,因为这是我的第一篇文章,我对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

0 个答案:

没有答案