在python中,绘制给定其索引的线段列表

时间:2016-01-21 21:10:59

标签: 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]
    plot(x, y, 'k')

This is what I get

@CactusWoman提供了一种有效的方法。这是完整的代码。

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()

3 个答案:

答案 0 :(得分:1)

这可能是更加Pythonic的解决方案:

for v1,v2 in segs:
    x,y = zip(vertices[v1],vertices[v2])
    plot(x,y,'k')

假设我明白你要做什么。由于它们不一定是连续的,我认为您将不得不迭代segs并无论如何都单独绘制它们。

答案 1 :(得分:1)

你可能想要RStudio -> Preferences -> General -> Default text encoding -> Change。给它一个元组列表的列表,其中每个元组是一个顶点,每个列表包含一个段的所有顶点。

lineCollection

然后使用lines = [[tuple(vertices[j]) for j in i]for i in segs] lc = matplotlib.collections.LineCollection(lines) 将其添加到您的轴。

答案 2 :(得分:0)

我不知道这是否更好,但你可以压缩你的顶点和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