从颜色链接到索引值的数据框创建一系列饼图

Creating a series of pie charts from a dataframe with color linked to indexes's values

这是一个示例数据框:

import pandas as pd
import numpy as np

values = np.array([
        [0, 1, 2, 0, 0, 4],
        [1, 0, 0, 1, 1, 0 ],
        [0, 4, 0, 0, 2, 1],
        [2, 0, 2, 0, 4, 0],        
        ])

indexes= 'a','b','c','d'

columns='ab','bc','cd','de','ef','fg'

df = pd.DataFrame(index=indexes,columns=columns, data=values)

print(df)

根据这个数据框,我需要创建一系列饼图,每列一个,显示在同一张图上,其中切片尺寸是固定的(等于 100/len(indexes))和颜色切片取决于索引的值,特别是:如果为 0,则为白色,如果为 1,则为绿色,如果为 2,则为黄色,如果为 4,则为红色。

你能给我什么建议?

我发现:

df.plot(kind='pie', subplots=True, figsize=(len(columns)*2, 2))   

它创建了一个系列,但我无法控制输入值...

我已经为一个列创建了一个饼图,但是我无法 link 颜色到索引值:

labels = indexes
sizes = np.linspace(100/len(labels),100/len(labels), num=len(labels))


fig1, ax1 = plt.subplots()
ax1.pie(sizes, labels=labels)
ax1.axis('equal')  

plt.show()

ImportanceOfBeingErnest 的回答帮助我为饼图赋予了想要的外观:

fig1, ax1 = plt.subplots()

labels = indexes
sizes = np.linspace(100/len(labels),100/len(labels), num=len(labels))
coldic = {0 : "w", 1 : "g", 2 : "y", 4 : "r" } 
colors = [coldic[v] for v in values[:,0]]

ax1.pie(sizes, labels=labels, colors=colors,counterclock=False, startangle=90)
ax1.axis('equal') 

plt.show()

现在颜色已 link 调整为值,并且切片的尺寸是固定的。我只需要在同一图像中为所有列设置相同的饼图。

这些图表的重要性是由颜色决定的,而不是切片的尺寸,我希望它们始终相等。

感谢您的宝贵时间!

不依赖 pandas 内部绘图函数(当然是有限的)可以使用 matplotlib 的 pie 函数来绘制图表。

颜色可以设置为一个列表,它是根据一些映射字典从值中生成的。

import numpy as np
import matplotlib.pyplot as plt
coldic = {0 : "w", 1 : "g", 2 : "y", 4 : "r" } 
values = np.array([
        [0, 1, 2, 0, 0, 4],
        [1, 0, 0, 1, 1, 0 ],
        [0, 4, 0, 0, 2, 1],
        [2, 0, 2, 0, 4, 0],        
        ])

labels= ['a','b','c','d']

fig1, axes = plt.subplots(ncols=values.shape[1], )

for i in range(values.shape[1]):
    colors = [coldic[v] for v in values[:,i]]
    labs = [l if values[j,i] > 0 else "" for j, l in enumerate(labels)]
    axes[i].pie(values[:,i], labels=labs, colors=colors) 
    axes[i].set_aspect("equal")

plt.show()

对于固定的楔形尺寸,您只需使用固定数组来提供给 pie

import numpy as np
import matplotlib.pyplot as plt
coldic = {0 : "w", 1 : "g", 2 : "y", 4 : "r" } 
values = np.array([
        [0, 1, 2, 0, 0, 4],
        [1, 0, 0, 1, 1, 0 ],
        [0, 4, 0, 0, 2, 1],
        [2, 0, 2, 0, 4, 0],        
        ])

labels= ['a','b','c','d']

fig1, axes = plt.subplots(ncols=values.shape[1], )

for i in range(values.shape[1]):
    colors = [coldic[v] for v in values[:,i]]
    axes[i].pie(np.ones(values.shape[0]), labels=labels, colors=colors, 
            wedgeprops=dict(linewidth=1, edgecolor="k")) 
    axes[i].set_aspect("equal")
    axes[i].set_title("".join(list(map(str,values[:,i]))))

plt.show()