我有以下问题。我有一对N对的2D数组。例如:x = [[5,2],[10,5],[3,2],......] (所以一组数组a = [5,10,3,...]和b = [2,5,2,...] 第一列(a)对应于项目数。 第二栏(b)是获得(a)栏中项目所需的时间。
我想绘制获得物品所用总时间的累积直方图。 x轴将在阵列(a)的区间中,并且y轴应该是(a)的每个区间的阵列(b)的时间的总和。即我想绘制“Nr of items”-vs-“获取(累计)的总时间”,而不是默认的“Nr of items”-vs-“数组中的实例数nr”
我希望这是有道理的。
答案 0 :(得分:2)
这是你说的那个机会吗?
>>> pairs = [[5,2],[10,5],[3,2]]
>>> a, b = zip(*pairs)
>>> x = list(a)
>>> y = [reduce(lambda c, d: c+d, b[:i], 0) for i in range(1, len(b)+1)]
>>> x
[5, 10, 3]
>>> y
[2, 7, 9]
这里得到的y值是从b到该索引的所有值的总和。
答案 1 :(得分:1)
这些天我倾向于成为matplotlib(http://matplotlib.sourceforge.net/)的忠实粉丝。它有很多内置功能,适用于您想要做的几乎所有类型的绘图。
以下是一大堆关于如何创建直方图的示例(包含图像和源代码):
http://matplotlib.sourceforge.net/examples/pylab_examples/histogram_demo_extended.html
以下是hist()
函数本身的文档:
http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.hist
如果这不是您想要的,您可以浏览图库并寻找更合适的情节类型。它们都有源代码:
http://matplotlib.sourceforge.net/gallery.html
希望这就是你要找的东西。
添加示例。那么这更符合您的需求吗? (不再是直方图):
如果是这样,这里是生成它的代码(x
是示例输入):
from pylab import *
x = [[5,2],[10,5],[3,2],[5,99],[10,22],[3,15],[4,30]]
a,b = zip(*x) #Unzip x into a & b as per your example
#Make a dictionary where the key is the item from a and the value
#is the sum of all the corresponding entries in b
sums = {}
for i in range(0,len(a)):
sums[a[i]] = b[i] if not a[i] in sums else sums[a[i]] + b[i]
#Plot it
ylabel('Bins')
xlabel('Total Times')
barh(sums.keys(),sums.values(),align='center')
show()
如果没有,我会放弃并承认我仍然不太了解你想要什么。祝你好运!
答案 2 :(得分:1)
我不确定那是你想要的......
x = [[5,2],[10,5],[3,2]]
a,b=zip(*x) #(5, 10, 3),(2, 5, 2)
tmp = []
for i in range(len(a)):
tmp.extend(b[i:i+1]*a[i]) #[2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2]
def cum(l):
c=0
for i in range(len(l)):
c+=l[i]
yield c
y=list(cum(tmp)) #[2, 4, 6, 8, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 62, 64, 66]
list(zip(range(1,1+len(y)),y)) #[(1, 2), (2, 4), (3, 6), (4, 8), (5, 10), (6, 15), (7, 20), (8, 25), (9, 30), (10, 35), (11, 40), (12, 45), (13, 50), (14, 55), (15, 60), (16, 62), (17, 64), (18, 66)]