【问题标题】:Chart with lots of (but varied number of) Y values for each X value每个 X 值都有很多(但数量不同)Y 值的图表
【发布时间】:2015-07-28 14:42:50
【问题描述】:

我不太确定如何描述我的问题,所以我无法在谷歌上搜索解决方案。如果答案已在其他地方描述,请见谅。

我有一个函数,它比较两件事并返回一个值的元组和一个值列表,其中第一个值始终是列表的一部分,例如:(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

所以如果thing1thing2 比较返回(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 对象或其他东西来做到这一点。问题是所有列表的长度都不同。

哦,也不确定性能是否是一个问题,每次比较都可能有数千个值。

【问题讨论】:

  • 这里的“比较”是什么意思?
  • @Jblasco 不确定是否值得研究——但简而言之,我正在比较不同物种的基因组并查看基因距离。我返回的数字是基因距离,x 值是 16S 核糖体亚基基因的距离(这是进化距离的标准标记)
  • 抱歉,kevbonham,我认为这是您要查找的代码的一部分。我的错!
  • @Jblasco 啊...不,该代码工作正常,这是我遇到问题的绘图部分:-)
  • @Jblasco 我现在明白为什么我一开始的措辞令人困惑......将进行编辑。

标签: python pandas matplotlib


【解决方案1】:

itertools repeat 在这里可能会有所帮助,例如:

repeat(thing1[0], len(thing1[1]))

这将产生第一个值的列表以及其余值的长度。然后你可以简单地绘制一个与另一个的图。

编辑:为了完整起见,这里是你如何使用它来绘制的。假设 things 是一个列表,其中包含您所描述的结构化对象,例如事物 = [事物 1,事物 2,事物 3]

for thing in things:

    xthing = repeat(thing[0], len(thing[1]))
    plt.scatter(xthing, thing[1])

【讨论】:

  • 比我的好,有一个迭代器,而不是构建列表
  • 出于性能原因,迭代器更好?你说得对,几千分似乎不会造成问题。
  • 例如,如果您将问题放大并说数百万而不是数千,那将是。那将意味着很大的不同。因此,SE Clark 的答案在更多情况下会比我的更好,尽管它本质上是一样的。
  • 同意 - 在放大版本中,迭代器速度更快,内存效率更高。但是任何一种构造都比在 for 循环中追加更快,因为您避免了每次迭代时的 .append() 查找:请参阅this answer
【解决方案2】:
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)

【讨论】:

  • 好的,所以没有魔法?...我可以通过 plot([thing1[0] for y in thing1[1]], thing1[1]) 完成同样的事情...但这就是我想要的。
  • @kevbonham:是的!但在你的情况下,你必须写 n 次数,但在这里你将值附加到一个列表中,然后通过调用你的 x listy list 轻松绘制它们
【解决方案3】:

您可以拆分 x 和 y,我认为,这就是您在说:“我想我可以通过从每次比较中创建一堆 (x,y) 坐标来将其混杂在一起。”

x, y = (10, [8,9,10,11,12])
x = x * len(y)

我预计数千个点在计算上会成为一个问题,但如果它是 x 可以使用生成器形成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2018-03-08
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多