Ошибка в легенде при построении горизонтального барчарта (plt.barh)

Исходные данные

Датафрейм размером: 350677 rows × 20 columns. Колонки: курсы, модули в составе курсов, уроки в составе модулей, id студентов, их личные данные и прочее. В работе используется Jupyter Notebook, библиотеки Pandas, Numpy, Matplotlib.

Задача

Постройте горизонтальный bar-chart, отражающий количество студентов на каждом курсе. График должен иметь заголовок. Значения должны быть отсортированы. Цвет столбцов должен содержать информацию о сфере, к которой относится курс (то есть нужна легенда). Прозрачность должна стоять на отметке 0.1. На график должна быть нанесена линия медианы. У медианы должен быть свой цвет. Рамки у графика быть не должно

Проблема

Привожу код, который я использую

students_on_course = main.groupby('title').student_id.nunique()

my_color = matplotlib.colors.get_named_colors_mapping()

plt.figure(figsize=(15, 10))
plt.barh(students_on_course.index, students_on_course.sort_values(ascending=True),
         color=list(my_color)[:14], alpha=0.1, label=students_on_course.index)

median_soc = int(students_on_course.median())
plt.axvline(x=median_soc, ls='--', color='blue', label='Медианная численность студентов')

plt.title('Количество студентов на курсах')
plt.yticks([])
plt.box(on=None)
plt.legend(loc='lower right')

plt.show()

Image

Подскажите, пожалуйста, где ошибка? Почему в легенду не переносятся значения в соответствии с цветом?


Ответы (1 шт):

Автор решения: CrazyElf

Попробуйте сделать так. Проще использовать Seaborn, он многое умеет "из коробки", в отличие от Matplotlib.

ax = plt.barh(students_on_course.index, students_on_course.sort_values(ascending=True),
         color=list(my_color)[:14], alpha=0.1)

...

plt.legend(ax.patches,students_on_course.index, loc='lower right')
→ Ссылка