在 python matplotlib 中绘制 (x, y) 坐标列表
Posted
技术标签:
【中文标题】在 python matplotlib 中绘制 (x, y) 坐标列表【英文标题】:Plotting a list of (x, y) coordinates in python matplotlib 【发布时间】:2014-02-26 10:59:03 【问题描述】:我有一个对 (a, b)
的列表,我想在 python 中使用 matplotlib
作为实际的 x-y 坐标进行绘制。目前,它正在制作两个图,其中列表的索引给出 x 坐标,第一个图的 y 值是成对中的 a
s,第二个图的 y 值是成对中的 b
s .
澄清一下,我的数据如下所示:li = [(a,b), (c,d), ... , (t, u)]
我想做一个只调用plt.plot()
不正确的单行代码。
如果我不需要单线,我可以轻松做到:
xs = [x[0] for x in li]
ys = [x[1] for x in li]
plt.plot(xs, ys)
如何让 matplotlib 将这些对绘制为 x-y 坐标?
【问题讨论】:
【参考方案1】:根据this example:
import numpy as np
import matplotlib.pyplot as plt
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
plt.scatter(x, y)
plt.show()
将产生:
要将您的数据从对解压到列表中,请使用zip
:
x, y = zip(*li)
所以,单线:
plt.scatter(*zip(*li))
【讨论】:
对于一个 2 列的 numpy 数组,plt.scatter( * xy.T )
有效:对于 x, y = xy.T; plt.scatter( x, y )
来说,简短而晦涩
x, y = zip(*li)
真是优雅的python代码!我一直在做更直接的两行代码,每行都有一个列表压缩(就像原始问题一样)
随机plt.scatter
示例与问题的关系有点令人困惑。【参考方案2】:
如果你有一个 numpy 数组,你可以这样做:
import numpy as np
from matplotlib import pyplot as plt
data = np.array([
[1, 2],
[2, 3],
[3, 6],
])
x, y = data.T
plt.scatter(x,y)
plt.show()
【讨论】:
因此没有办法拥有data=np.array([[x1,y1],[x2,y2],etc.])
的np.array
并使用plt.plot(data)
。我总是要给出两个数组而不是数组数组?
@MaxCoplan,没错,但你可以使用plt.plot(*data.T)
,它的作用与上述相同,但会跳过中间步骤。【参考方案3】:
如果你想绘制一条连接列表中所有点的单线
plt.plot(li[:])
plt.show()
这将绘制一条连接列表中所有对的线,作为笛卡尔平面上从列表开始到结尾的点。 我希望这是你想要的。
【讨论】:
他不想绘制单行,他想用“单行”(单行代码)进行绘制。他正在寻找的答案(并在 3 年前得到)是使用scatter()
。
既然这个答案说明了它的工作条件,即“如果你想绘制一条连接列表中所有点的线”,它真的值得投反对票吗?
@Gathide:是的,它值得一票否决,因为它根本不起作用,也不符合描述。 plt.plot(li)
就像 plt.plot(li[:])
。它只是绘制 2 条线,将它们用作 (y1, y2)
而不是 (x1, y1)
。以上是关于在 python matplotlib 中绘制 (x, y) 坐标列表的主要内容,如果未能解决你的问题,请参考以下文章