Pandas многоуровневое построение графиков - PullRequest
3 голосов
/ 18 января 2020

Я сейчас экспериментирую с pandas и matplotlib.

Я создал Pandas фрейм данных, в котором хранятся такие данные:

cmc|coloridentity
 1 | G
 1 | R
 2 | G
 3 | G
 3 | B
 4 | B

Что я сейчас хочу сделать состоит в том, чтобы составить столбчатый график, на котором я могу видеть, сколько существует записей на cmc И я хочу сделать это для всех coloridentity и сложить их выше.

Мои мысли пока:

#get all unique values of coloridentity
unique_values = df['coloridentity'].unique()

#Create two dictionaries. One for the number of entries per cost and one 
# to store the different costs for each color
color_dict_values = {}
color_dict_index = {}
for u in unique_values:
    temp_df = df['cmc'].loc[df['coloridentity'] == u].value_counts()
    color_dict_values[u] = np.array(temp_df)
    color_dict_index[u] = temp_df.index.to_numpy()

width = 0.4
p1 = plt.bar(color_dict_index['G'], color_dict_values['G'], width, color='g')
p2 = plt.bar(color_dict_index['R'], color_dict_values['R'], width, 
             bottom=color_dict_values['G'], color='r')
plt.show()

Итак, но это дает мне ошибку, потому что строка, где я говорю, что В нижней части второго графика должны быть значения различного графика, имеющие разные формы numpy.

Кто-нибудь знает решение? Я думал о добавлении 0 значений, чтобы фигуры были одинаковыми, но я не знаю, является ли это лучшим решением, и если да, то каким образом будет наилучшим способом его решения.

1 Ответ

1 голос
/ 20 января 2020

Работа с фиксированным индексом (диапазон значений cmc) упрощает работу. Таким образом, color_dict_values из color_id дает счетчик для каждого из возможных значений cmc (остается равным нулю, когда их нет).

color_dict_index больше не требуется. Чтобы заполнить color_dict_values, мы перебираем временный фрейм данных с value_counts.

. Чтобы построить столбцы, ось x теперь является диапазоном возможных значений cmc. Я добавил [1:] к каждому массиву, чтобы пропустить ноль в начале, который выглядел бы некрасиво на графике.

Дно начинается с нуля и увеличивается на color_dict_values цвета, который имеет только был построен (Благодаря numpy, константа 0, добавленная в массив, будет этим массивом.)

В коде я сгенерировал несколько случайных чисел, похожих на формат в вопросе.

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

N = 50
df = pd.DataFrame({'cmc': np.random.randint(1, 10, N), 'coloridentity': np.random.choice(['R', 'G'], N)})

# get all unique values of coloridentity
unique_values = df['coloridentity'].unique()
# find the range of all cmc indices
max_cmc = df['cmc'].max()
cmc_range = range(max_cmc + 1)

# dictionary for each coloridentity: array of values of each possible cmc
color_dict_values = {}
for u in unique_values:
    value_counts_df = df['cmc'].loc[df['coloridentity'] == u].value_counts()
    color_dict_values[u] = np.zeros(max_cmc + 1, dtype=int)
    for ind, cnt in value_counts_df.iteritems():
        color_dict_values[u][ind] = cnt

width = 0.4
bottom = 0
for col_id, col in zip(['G', 'R'], ['limegreen', 'crimson']):
    plt.bar(cmc_range[1:], color_dict_values[col_id][1:], bottom=bottom, width=width, color=col)
    bottom += color_dict_values[col_id][1:]

plt.xticks(cmc_range[1:]) # make sure every cmc gets a tick label
plt.tick_params(axis='x', length=0) # hide the tick marks
plt.xlabel('cmc')
plt.ylabel('count')
plt.show()

sample plot

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