填充多边形,超出范围

时间:2019-12-01 21:40:38

标签: python matplotlib

我正在尝试从csv文件填充多边形,我正在使用以下代码,并且在y.append(str(row[1]))行中出现了问题

  

IndexError:列表索引超出范围”

代码:

    import matplotlib.pyplot as plt
    import csv

    x = []
    y = []
    # coord = [[1,1], [2,1], [2,2], [1,2],]
    with open('screen.txt','r') as csvfile:
        coord = csv.reader(csvfile, delimiter=',')
        for row in coord:
            x.append(str(row[0]))
            y.append(str(row[1]))

    coord.append(coord[0]) #repeat the first point to create a 'closed loop'

    xs, ys = zip(*coord) #create lists of x and y values

    plt.figure()
    plt.plot(xs,ys)
    plt.fill(xs, ys, color= "r")
    plt.show()

1 个答案:

答案 0 :(得分:0)

问题中的代码假设文件“ screen.txt”看起来像这样:

1,1
2,1
2,2
1,2

然后,创建一个变量coords,它是一个_csv.reader object,而后续代码的行为就像coords只是一个简单列表。 reader对象是一个特殊的对象,它读取文件,并允许将其构造为for row in coords。但是它仅在需要时读取文件的一部分(以防止发生诸如只读取少数几行的情况)。关闭文件后(即with open(...之后),阅读器对象将无法使用。

作为一种简单的解决方法,如果文件不是非常长,则可以将坐标转换为列表:coords = list(coords)。从那时起,它可以用作普通列表。

顺便说一句,如果文件如上所述,则list index out of range行将引发错误coord.append(coord[0])

另一个可能的原因是输入文件的末尾包含空行。然后,如果最后一行仅包含几个空格,则会在x.append(str(row[0]))y.append(str(row[1]))处遇到第一个错误。但是删除空行后,您仍然会在coord.append(coord[0])

处收到错误消息

修改后的代码(省去了x和y列表,因为它们在此版本中并未真正使用):

import csv
from matplotlib import pyplot as plt

# coord = [[1,1], [2,1], [2,2], [1,2],]
with open('screen.txt', 'r') as csvfile:
    coord = csv.reader(csvfile, delimiter=',')
    coord = list(coord)  # we can step out of the 'with', because the file isn't needed
                         # anymore once we have the real list

coord.append(coord[0])  # repeat the first point to create a 'closed loop'
xs, ys = zip(*coord)    # create lists of x and y values

plt.figure()
plt.plot(xs, ys)
plt.fill(xs, ys, color="r")
plt.gca().set_aspect('equal') # needed so squares look square, x and y axis get the same pixels per unit
plt.show()

哪个显示一个漂亮的正方形: the plotted square PS:以上版本将坐标存储为字符串,而直接使用数字可能会更有效。

更好,更易读的版本(由@ImportanceOfBeingErnest建议):

import csv
from matplotlib import pyplot as plt

x = []
y = []
# coord = [[1,1], [2,1], [2,2], [1,2],]
with open('screen.txt', 'r') as csvfile:
    coord = csv.reader(csvfile, delimiter=',')
    for row in coord:
        x.append(float(row[0]))
        y.append(float(row[1]))
x.append(x[0])
y.append(y[0])

plt.figure()
plt.plot(x, y)
plt.fill(x, y, color="orchid")
plt.show()