在python中,根据线段的索引绘制线段列表
给定一个顶点列表和一个线段列表(指线段顶点的索引),绘制可能不形成连续直线的所有线段的最佳方法是什么 我可以这样做,但它显然很笨重;有更好的办法吗在python中,根据线段的索引绘制线段列表,python,matplotlib,Python,Matplotlib,给定一个顶点列表和一个线段列表(指线段顶点的索引),绘制可能不形成连续直线的所有线段的最佳方法是什么 我可以这样做,但它显然很笨重;有更好的办法吗 vertices=[[0,0],[1,1],[1,2],[4,1]] segs=[[0,1],[0,2],[2,3]] for seg in segs: x = vertices[seg[0]][0], vertices[seg[1]][0] y = vertices[seg[0]][1], vertices[seg[1]][1]
vertices=[[0,0],[1,1],[1,2],[4,1]]
segs=[[0,1],[0,2],[2,3]]
for seg in segs:
x = vertices[seg[0]][0], vertices[seg[1]][0]
y = vertices[seg[0]][1], vertices[seg[1]][1]
plot(x, y, 'k')
@仙人掌女人给出了一种有效的方法。这是完整的代码
import matplotlib
import matplotlib.collections
import matplotlib.pyplot
vertices=[[0,0],[1,1],[1,2],[4,1]]
segs=[[0,1],[0,2],[2,3]]
lines = [[tuple(vertices[j]) for j in i]for i in segs]
lc = matplotlib.collections.LineCollection(lines)
fig, ax = matplotlib.pyplot.subplots()
ax.add_collection(lc)
matplotlib.pyplot.xlim([0,4])
matplotlib.pyplot.ylim([0,2])
matplotlib.pyplot.show()
我不知道这是否更好,但你可以压缩你的顶点和分段,然后像这样循环
vertices=[[0,0],[0,1],[3,2]]
segs=[[0,1],[0,2],[2,3]]
for v,s in zip(vertices, segs):
x = v[0], s[0]
y = v[1], s[1]
plot(x,y,'k')
我不确定我是否完全理解你的代码,但你会得到一个错误,因为你试图访问一个不存在的索引。这只是一种1:1的关系。索引
x
顶点到索引x
segs我不知道这是否更好,但您可以像这样压缩顶点和segs并在其上循环
vertices=[[0,0],[0,1],[3,2]]
segs=[[0,1],[0,2],[2,3]]
for v,s in zip(vertices, segs):
x = v[0], s[0]
y = v[1], s[1]
plot(x,y,'k')
我不确定我是否完全理解你的代码,但你会得到一个错误,因为你试图访问一个不存在的索引。这只是一种1:1的关系。索引
x
顶点到索引x
segs这可能是一个更具python风格的解决方案:
for v1,v2 in segs:
x,y = zip(vertices[v1],vertices[v2])
plot(x,y,'k')
假设我明白你想做什么。因为它们不一定是连续的,所以我认为您必须迭代
分段
,并单独绘制它们,不管发生什么。这可能是一个更具python风格的解决方案:
for v1,v2 in segs:
x,y = zip(vertices[v1],vertices[v2])
plot(x,y,'k')
假设我明白你想做什么。因为它们不一定是连续的,所以我认为您必须迭代
分段
,并单独绘制它们。为此,您可能需要lineCollection
。给它一个元组列表,其中每个元组是一个顶点,每个列表包含一段的所有顶点
lines = [[tuple(vertices[j]) for j in i]for i in segs]
lc = matplotlib.collections.LineCollection(lines)
然后使用
add_collection
将其添加到轴中。您可能需要lineCollection
。给它一个元组列表,其中每个元组是一个顶点,每个列表包含一段的所有顶点
lines = [[tuple(vertices[j]) for j in i]for i in segs]
lc = matplotlib.collections.LineCollection(lines)
然后使用
add\u collection
将其添加到轴。您的代码不起作用,因为只有三个顶点,但最后一个线段引用了第四个顶点。segs
中的值是否假设引用顶点?对不起,这是一个输入错误。我的实际数据是一个有许多数字的浮动列表。固定的。我给了一个错误的印象,认为有和顶点相同数量的线段。你的代码不起作用,因为只有三个顶点,但最后一个线段引用了第四个顶点。segs
中的值是否假设引用顶点?对不起,这是一个输入错误。我的实际数据是一个有许多数字的浮动列表。固定的。我给人一个错误的印象,那就是有和顶点一样多的线段,这样可以节省一条线。这可能是最好的解决方案,但是仙人掌女人的解决方案看起来很有趣,如果可行的话。这样做可以节省一行代码。这可能是最好的解决方案,但CactusWoman的解决方案看起来很有趣,如果它能奏效的话。@pheon抱歉,我修复了代码(我在错误的地方调用了元组)。现在应该可以了。如果有很多行,使用行集合要比绘制单个行快得多,但如果行数很少,则无所谓。是否需要调用tuple
?这只是将一个2元素列表转换成一个2元素元组,似乎没有严格的必要(但我不能在这个comp上测试)。@o_o是的,似乎LineCollection
需要一个元组列表。我更新了代码,但仍然缺少最后一行。@pheon对我来说很好,它可以绘制所有三行。你确定你的轴在正确的范围内吗?@pheon抱歉,我修复了代码(我在错误的地方调用了元组)。现在应该可以了。如果有很多行,使用行集合要比绘制单个行快得多,但如果行数很少,则无所谓。是否需要调用tuple
?这只是将一个2元素列表转换成一个2元素元组,似乎没有严格的必要(但我不能在这个comp上测试)。@o_o是的,似乎LineCollection
需要一个元组列表。我更新了代码,但仍然缺少最后一行。@pheon对我来说很好,它可以绘制所有三行。你确定你的轴在正确的范围内吗?