我不太确定如何描述我的问题,所以我在搜索解决方案时遇到了麻烦。如果答案已在别处描述,请原谅我。
我有一个比较两件事并返回值的元组和值列表的函数,其中第一个值始终是列表的一部分,例如:(a, [m,n,a,o])
。我有一个我要比较的事项列表[thing1, thing2, thing3, thing4]
。我有一个循环这些东西的函数并对它们进行比较,但是我无法弄清楚如何绘制它们:
def compare_thing1(things=[thing2,thing3,thing4]):
for thing in things:
*compare thing1 to thing, add to dataframe*
plot
因此,如果thing1
与thing2
比较返回(10, [8,9,10,11,12])
,thing3
比较将返回(25, [24,25,26,27])
,thing4
比较将返回(30, [28,29,30,31,32,33...])
,我想要一个如下图:
换句话说,X位置由第一个值确定,然后列表中的值绘制在y轴上。
我想我可以通过在每次比较中创建一堆(x,y)坐标来解决这个问题,但我想知道是否有更好的方法可以使用Series
对象或其他东西。问题是所有列表都有不同的长度。
哦,也不确定性能是否是一个问题,每个比较可以长达数千个值。
答案 0 :(得分:2)
itertools重复在这里可能会有所帮助,例如:
repeat(thing1[0], len(thing1[1]))
这将产生第一个值的列表,其中包含其余值的长度。然后你可以简单地绘制一个与另一个。
编辑:为了完整性,请按照以下方式进行绘制。假设things
是包含按照您所描述的结构对象的列表,例如东西= [thing1,thing2,thing3]
for thing in things:
xthing = repeat(thing[0], len(thing[1]))
plt.scatter(xthing, thing[1])
答案 1 :(得分:1)
import matplotlib.pyplot as plt
thing1 = (10, [8,9,10,11,12])
thing2 = (25, [24,25,26,27])
thing3 = (30, [28,29,30,31,32,33])
thing1_y = []
for i in thing1[1]:
thing1_y.append(i)
thing1_x = []
for i in range(len(thing1_y)):
thing1_x.append(thing1[0])
这会给你:
In [2]: thing1_x
Out[2]: [10, 10, 10, 10, 10]
In [3]: thing1_y
Out[3]: [8, 9, 10, 11, 12]
换句话说,X位置由第一个值确定,并且 然后列表中的值绘制在y轴上。
Now you can use
plt.scatter(thing1_x,thing1_y)
答案 2 :(得分:1)
你可以分割x和y,我想,当你说:"我想我可以通过创建一堆(x,y)坐标来解决这个问题。 。比较"
x, y = (10, [8,9,10,11,12])
x = x * len(y)
我不希望数千个点成为计算机上的问题,但如果它是x,则可以使用生成器形成。