2016-12-16 7 views
1

Я пытаюсь построить некоторые гипотетические оценки тестирования студентов. Я хотел бы иметь студенческое имя на оси y и проверить счет на оси x (горизонтальный штрих-код). Поскольку имена Студентов не уникальны, я бы хотел, чтобы разрешал дубликаты по оси Y. Я видел способы избавиться от дублированных данных в морских и/или пандах, но не о том, как их сохранить. Вот код, у меня есть:Разделите (и сохраните) дублирующиеся категориальные данные с помощью Seaborn barplot?

import seaborn as sns 
import pandas as pd 
import matplotlib as mpl 
import matplotlib.pyplot as plt 

sns.set(style="whitegrid") 

scores = pd.read_csv('input_file.csv', sep=',').sort_values("score", ascending=True) 
sns.set_color_codes("pastel") 
sns.barplot(x="score", y="lastName", data=scores, color="b", ci=None) 
plt.title('Scores') 
sns.despine(left=True, bottom=True) 
plt.savefig('path_to_file.pdf') 

Я подумал, что, может быть, я должен использовать factorplot и настройку ориентации на «ч» и введите в «бар», но это произвело предупреждение «жесткий макет» и, действительно, плотный/плохо обработанный сюжет.

FYI, в настоящее время у меня есть штрих-код, который выглядит достаточно красиво, но он группирует неповторимые просрочки и суммирует их результаты тестов; вот что я хочу исправить.

+0

Вы пытаетесь отобразить два бара дублированных фамилиями? –

+1

Это поможет, если вы разместите образцы данных. Прочтите, как создать [mcve]. Я мог бы попытаться составить образцы данных, соответствующих вашему коду и описанию, но это займет у меня время, которое лучше потратить на решение этой проблемы, и я мог бы неправильно понять вас и написать бесполезный ответ. – Goyo

ответ

3

Вы можете построить панель для каждой уникальной строки (используя индекс в качестве y-координаты), а затем вручную назначить метки ярлыка оси y.

df = pd.DataFrame({ 
    'name': ['A', 'B', 'A', 'B'], 
    'score': [10, 20, 30, 40], 
}) 

ax = sns.barplot(x=df.score, y=df.index, orient='h') 
ax.set_yticklabels(df.name) 

sns.barplot


Обратите внимание, что для решения этой задачи, Seaborn фактически может быть излишним; вы не делаете статистической визуализации. Поскольку вам не нужно группировать не уникальные значения и отображать доверительные интервалы, достаточно matplotlib.pyplot.barh (всего import seaborn для красиво оформленных участков).

plt.barh(df.index, df.score, align='center') 
plt.yticks(df.index, df.name) 
plt.gca().invert_yaxis() 

matplotlib.pyplot.barh

+0

Собирался опубликовать немного худшую версию этого. Отлично сработано. –

+0

Эй, @Igor, это похоже на потенциально приятное решение. Будет ли это создавать проблемы для чтения в большом CSV-файле и сортировки баллов в порядке возрастания? –

+0

@Janine, чтение/сортировка данных и построение его - две ортогональные задачи. Вы можете использовать любой из этих методов для построения данных в любом порядке. –