熊猫堆积不同形状的条形图

阿奎恩

我目前正在尝试使用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值以使形状相同,但是我不知道这是否是最佳解决方案,如果可以,最好的解决方法是如何。

约翰·C

使用固定索引(cmc的范围)可以使事情变得容易。这样color_dict_values,acolor_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()

样地

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章