如何绘制一个颜色列表的饼图

Posted

技术标签:

【中文标题】如何绘制一个颜色列表的饼图【英文标题】:how to plot a pie of color list 【发布时间】:2011-02-27 14:55:35 【问题描述】:

嗨,我有一个 dict,其中 3-int-tuple 表示颜色(作为键),一个 int 表示该颜色在图像中出现的次数(作为值)

例如,这是一个具有 3 种颜色的 4x4 像素图像: (87, 82, 44): 1, (255, 245, 241): 11, (24, 13, 9): 4

我想绘制列表 [1,11,4] 的饼图,其中饼图的每个切片都用正确的颜色着色.. 我该怎么办?

【问题讨论】:

【参考方案1】:

更新:other answer from Paul 好多了,但我只是编辑我的原始答案,直到它基本上相同:) (我不能删除这个答案,因为它被接受了。) em>

这是你想要的吗?我刚刚接受了an example from the matplotlib documentation 并将您的数据转换为pie() 期望的参数:

# This is a trivial modification of the example here:
# http://matplotlib.sourceforge.net/examples/pylab_examples/pie_demo.html

from pylab import *

data = (87, 82, 44): 1, (255, 245, 241): 11, (24, 13, 9): 4

colors = []
counts = []

for color, count in data.items():
    colors.append([float(x)/255 for x in color])
    counts.append(count)

figure(1, figsize=(6,6))

pie(counts, colors=colors, autopct='%1.1f%%', shadow=True)
title('Example Pie Chart', bbox='facecolor':'0.8', 'pad':5)

show()

结果如下:

【讨论】:

【参考方案2】:

马克领先我 5 分钟,所以分数应该归他所有,但无论如何,这是我(几乎相同,但更简洁)的答案:

from matplotlib import pyplot

data = (87, 82, 44): 1, (255, 245, 241): 11, (24, 13, 9): 4
colors, values = data.keys(), data.values()
# matplotlib wants colors as 0.0-1.0 floats, not 0-255 ints
colors = [tuple(i/255. for i in c) for c in colors]
pyplot.pie(values, colors=colors)
pyplot.show()

【讨论】:

+1: 不导入 * 显然更明智:) 我拒绝使用 zip(*...) 来拆分项目,因为如果列表很大,那就不好了,但它是在这个例子中几乎不相关...... :) 啊,我以前从未在文档中注意到这个有用的部分:“If items(), keys(), values(), iteritems(), iterkeys(), and itervalues( ) 被调用而没有对字典进行干预修改,列表将直接对应。”您是否介意我将该更改合并到我的答案中,并参考您的答案? (显然我现在不能删除我的答案,因为它已被接受,这将是我的偏好......) @Mark:是的,我也必须查找字典命令。您的解决方案满足了所有 OP 的要求,对于所述用例,性能问题绝对可以忽略不计。最重要的是,它更加清晰易懂,即不需要任何列表推导或字典排序规则的知识。在这一点上,“更好”只是一个见仁见智的问题。

以上是关于如何绘制一个颜色列表的饼图的主要内容,如果未能解决你的问题,请参考以下文章

如何摆脱 Perl GD::Graph 中的饼图轮廓?

在 Yahoo 的 Flash 库 ASTRA 中的饼图上绘制自定义标签

100天精通Python(可视化篇)——第81天:matplotlib绘制不同种类炫酷饼图参数说明+代码实战(自定义百分比多个子图圆环嵌套饼图)

为啥我在 Tkinter 中的饼图不显示?

无法在 R 中使用 GGPlot 显示多个完整的饼图

在Android中绘制饼图?