我的字典看起来像这样:
1: ['4026', '4024', '1940', '2912', '2916], 2: ['3139', '2464'], 3:['212']...
对于几百个键,我想用键作为y的x值集来绘制它们,我尝试了这段代码,它给出了下面的错误:
for rank, structs in b.iteritems():
y = b.keys()
x = b.values()
ax.plot(x, y, 'ro')
plt.show()
ValueError: setting an array element with a sequence
我对如何继续有点失落所以任何帮助都将不胜感激!
答案 0 :(得分:4)
您需要手动构建X和Y列表:
In [258]: b={1: ['4026', '4024', '1940', '2912', '2916'], 2: ['3139', '2464'], 3:['212']}
In [259]: xs, ys=zip(*((int(x), k) for k in b for x in b[k]))
In [260]: xs, ys
Out[260]: ((4026, 4024, 1940, 2912, 2916, 3139, 2464, 212), (1, 1, 1, 1, 1, 2, 2, 3))
In [261]: plt.plot(xs, ys, 'ro')
...: plt.show()
由此而来:
答案 1 :(得分:3)
plot
需要一个x值列表和一个y值列表,这些值必须具有相同的长度。这就是为什么你必须多次重复rank
值。 itertools.repeat()
可以为您做到这一点。
iteritems()
已经返回了元组(key,value)
。您不必使用keys()
和items()
。
以下是代码:
import itertools
for rank, structs in b.iteritems():
x = list(itertools.repeat(rank, len(structs)))
plt.plot(x,structs,'ro')
使用您的代码,您将在字典中为每个项目生成一个图表。我想你宁愿在一张图中绘制它们。如果是这样,请按以下方式更改代码:
import itertools
x = []
y = []
for rank, structs in b.iteritems():
x.extend(list(itertools.repeat(rank, len(structs))))
y.extend(structs)
plt.plot(x,y,'ro')
以下是使用您的数据的示例:
import itertools
import matplotlib.pyplot as plt
d = {1: ['4026', '4024', '1940', '2912', '2916'], 2: ['3139', '2464'], 3:['212']}
x= []
y= []
for k, v in d.iteritems():
x.extend(list(itertools.repeat(k, len(v))))
y.extend(v)
plt.xlim(0,5)
plt.plot(x,y,'ro')
答案 2 :(得分:2)
这是因为您的数据条目不匹配。
目前你有
1: ['4026', '4024', '1940', '2912', '2916']
2: ['3139', '2464'],
...
因此
x = [1,2,...]
y = [['4026', '4024', '1940', '2912', '2916'],['3139', '2464'],...
当你真的需要时
x = [1, 1, 1, 1, 1, 2, 2, ...]
y = ['4026', '4024', '1940', '2912', '2916', '3139', '2464',...]
尝试
for rank, structs in b.iteritems():
# This matches each value for a given key with the appropriate # of copies of the
# value and flattens the list
# Produces x = [1, 1, 1, 1, 1, 2, 2, ...]
x = [key for (key,values) in b.items() for _ in xrange(len(values))]
# Flatten keys list
# Produces y = ['4026', '4024', '1940', '2912', '2916, '3139', '2464',...]
y = [val for subl in b.values() for val in subl]
ax.plot(x, y, 'ro')
plt.show()