заполнить многоугольник, список вне диапазона - PullRequest
0 голосов
/ 02 декабря 2019

Я пытаюсь заполнить многоугольник из 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 голосов
/ 02 декабря 2019

Код в вопросе предполагает, что файл 'screen.txt' выглядит следующим образом:

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

Затем вы создаете переменную coords, которая представляет собой _csv.reader object, а последующий код ведет себя какесли бы coords был простым списком. Объект чтения - это специальный объект, который читает файл и разрешает конструкции как for row in coords. Но он читает только части файла, когда это необходимо (для предотвращения таких случаев, как чтение миллионов строк, когда вам нужно только несколько). После закрытия файла (т. Е. После with open(...) объект чтения становится непригодным для использования.

В качестве простого обходного пути, и в случае, если файл не очень длинный, вы можете преобразовать координаты в список: coords = list(coords). И с тех пор его можно использовать как обычный список.

Кстати, если файл подобен описанному выше, для строки coord.append(coord[0]).

будет выдана ошибка list index out of range.

Другой возможной причиной может быть то, что ваш входной файл содержит пустые строки в конце. Тогда вы получите первую ошибку в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...