Неверен цветовой ключ столбчатой диаграммы

#python #pandas #matplotlib #bar-chart #data-visualization

#python #pandas #matplotlib #столбчатая диаграмма #визуализация данных

Вопрос:

Используя pandas в jupyter notebook, я генерирую столбчатый график оценки взаимодействия для выборочных движений, окрашенных в соответствии с классификацией этого движения. Классификации — VS, SUB, OBV, VO и CTRL. Таким образом, я использую этот код для построения:

 colors = {'VS':'blue', 
          'SUB':'green',
          'OBV': 'orange',
          'VO': 'red',
          'CTRL': 'black'}


cat_data.sort_values('Interaction_rounded').plot.bar(x='Motion',
                                               y='Interaction_rounded',
                                               rot=90,
                                               title='All Motions Interaction Score Colored by Classification',
                                               color = [colors[i] for i in cat_data['Classification']],
                                               fontsize = 8,
                                               legend = False)
  

Но я получаю эту диаграмму:

введите описание изображения здесь

Ребята, вы видите, как CTRL, который должен быть черным, не является? То же самое с ударом кулаком, который не должен быть черным. Кто-нибудь знает, что я могу сделать, чтобы исправить это?

Комментарии:

1. Ну, вы сортируете данные для вызова plot, но не цвета, поэтому я предполагаю, что вам нужно что-то вроде [colors[i] for i in cat_data.sort_values('Interaction_rounded')['Classification']] или лучше отсортировать один раз перед построением графика…

2. Вау, это было именно так! Я не знал, что мне также приходилось сортировать данные по цветам. Большое спасибо.

Ответ №1:

Вот что я делаю:

  1. предварительно вычислите ваши цвета в виде столбца во фрейме данных,
  2. отсортируйте весь фрейм данных и
  3. передайте эту копию фрейма данных в функцию построения графика, которая может получить доступ к недавно отсортированным данным:
 colors = {'VS':'blue', 
          'SUB':'green',
          'OBV': 'orange',
          'VO': 'red',
          'CTRL': 'black'}


_ = (
    cat_data
        .sort_values('Interaction_rounded')
        .assign(colors=lambda df: df['Classification'].map(colors)
        .pipe(lambda df: 
            df.plot.bar(
                x='Motion',
                y='Interaction_rounded',
                rot=90,
                title='All Motions Interaction Score Colored by Classification',
                color=df['colors'], # now you can access the latest version of the dataframe
                fontsize=8,
                legend=False
            )
        )
)
  

Комментарии:

1. Вау, это определенно то, что я сделаю в следующий раз, чтобы упростить и упорядочить процесс. Большое спасибо, Пол.