Цвет гистограмм и их метки противоречивы - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь проанализировать набор данных wine-quality. Существует два набора данных: набор данных red wine и white wine. Я объединяю их вместе, чтобы сформировать wine_df. Я хочу построить это. И я хочу дать красную гистограмму красного цвета, белую гистограмму белого цвета. Но для некоторой гистограммы ее метка и цвет несовместимы. Например, четвертая метка (4, белая), а ее цвет - красный. Что я должен делать? Спасибо за ваш ответ!

enter image description here

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

red_wine = pd.read_csv('https://raw.githubusercontent.com/nishanthgandhidoss/Wine-Quality/master/data/winequality-red.csv',
                      sep = ';')
white_wine = pd.read_csv('https://raw.githubusercontent.com/nishanthgandhidoss/Wine-Quality/master/data/winequality-white.csv', 
                        sep = ';')

## Add a column to each data to identify the wine color 
red_wine['color'] = 'red'
white_wine['color'] = 'white'

## Combine the two dataframes    
wine_df = pd.concat([red_wine, white_wine])

colors = ['red','white']
plt.style.use('ggplot')
counts = wine_df.groupby(['quality', 'color']).count()['pH']
counts.plot(kind='bar', title='Counts by Wine Color and quality', color=colors, alpha=.7)
plt.xlabel('Quality and Color', fontsize=18)
plt.ylabel('Count', fontsize=18)
plt.show()


1 Ответ

0 голосов
/ 18 января 2019

Цвета - это уровень вашего индекса, поэтому используйте его, чтобы указать цвета. Измените строку кода на:

counts.plot(kind='bar', title='Counts by Wine Color and quality', 
            color=counts.index.get_level_values(1), alpha=.7)

enter image description here


В этом случае просто получается, что matplotlib может интерпретировать значения в вашем индексе как цвета. В общем, вы могли бы сопоставить уникальные значения с узнаваемыми цветами, например:

color = counts.index.get_level_values(1).map({'red': 'green', 'white': 'black'})

enter image description here


pandas что-то делает с порядком построения, но вы всегда можете вернуться к matplotlib для более надежной циклической обработки цветов. Хитрость здесь в том, чтобы преобразовать color в категориальную переменную, чтобы она всегда отображалась после groupby, позволяя указывать только список ['red', 'white']

import matplotlib.pyplot as plt

wine_df['color'] = wine_df.color.astype('category')
counts = wine_df.groupby(['quality', 'color']).count()['pH'].fillna(0)

ind = np.arange(len(counts))
plt.bar(ind, height=counts.values, color=['red', 'white'])
_ = plt.xticks(ind, counts.index.values, rotation=90)
plt.ylim(0,150)  # So we an see (9, white)
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...