Matplotlib直方图,其中每个区域按附加参数的频率着色

时间:2014-12-01 15:32:26

标签: python matplotlib

如果我有

data = [(1, 'a'), (1, 'b'), (1, 'a'), (2, 'a'), (2, 'b'), (3, 'c'), (3, 'c'), (3, 'c'), (3, 'c')] 

这样每个数据点有两个属性:

x, y = zip(*data)

我可以在直方图中显示x,ala:

x = [1, 1, 1, 2, 2, 3, 3, 3, 3]
bins = [1, 2, 3]; f = [3, 2, 4]`. 

然后,使用第二个属性

y = ['a', 'b', 'a', 'a', 'b', 'c', 'c', 'c', 'c']

原始直方图中的每个bin都具有次要参数的频率信息:

bins[0] = {'a': 2, 'b': 1}
bins[1] = {'a': 1, 'b': 1}
bins[2] = {'b': 1, 'c': 3}

使用matplotlib,我可以创建x的基本直方图:

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
n, bins, patches = ax.hist(x, 3)

是否有一种巧妙的方法可以迭代补丁,或者将它们分解成适当大小的矩形,以反映其他信息,y

在示例中,如果我希望'a' 红色,则'b'绿色'c'为< strong> blue ,然后第一个bin(x = 1)将三分之二红色三分之一绿色,第二个bin(x = 2)将半红半绿色,最后一个bin(x = 3)将四分之一绿色 四分之三蓝色

Example illustration

1 个答案:

答案 0 :(得分:0)

我意识到这不是一个完整的答案,但如果您要重新格式化数据,那么您可以使用hist的一些内置功能来避免必须手动编写所有内容。

例如,您可以制作一个列表,其中包含x值等于y的所有'a'值,另一个值y = 'b',最后一个y = 'c' {1}}。然后,您可以将这些列表堆叠到另一个列表中,并使用hist在该数据上调用stacked = True

请参阅http://matplotlib.org/1.3.1/examples/pylab_examples/histogram_demo_extended.html(第5面板下方)以获取说明。