Как построить несколько точек из списка, используя matplotlib? - PullRequest
0 голосов
/ 18 сентября 2018

Я прочитал список 3D-точек из текстового файла.Список выглядит следующим образом:

content = ['2.449,14.651,-0.992,', '6.833,13.875,-1.021,', '8.133,17.431,-1.150,', '3.039,13.724,-0.999,', '16.835,9.456,-1.031,', '16.835,9.457,-1.031,', '15.388,5.893,-0.868,', '13.743,25.743,-1.394,', '14.691,24.988,-1.387,', '15.801,25.161,-1.463,', '14.668,23.056,-1.382,', '22.378,20.268,-1.457,', '21.121,17.041,-1.353,', '19.472,13.555,-1.192,', '22.498,20.115,-1.436,', '13.344,-33.672,-0.282,', '13.329,-33.835,-0.279,', '13.147,-30.690,-0.305,', '13.097,-28.407,-0.339,', '13.251,-28.643,-0.366,', '13.527,-25.067,-0.481,', '19.433,-33.137,-0.408,', '19.445,-29.501,-0.345,', '20.592,-28.004,-0.312,', '19.109,-26.512,-0.380,', '18.521,-24.155,-0.519,', '22.837,48.245,-2.201,', '23.269,50.129,-2.282,', '23.499,46.652,-2.297,', '23.814,48.646,-2.271,', '30.377,46.501,-2.214,', '29.869,44.479,-2.143,', '29.597,41.257,-2.018,', '28.134,40.291,-2.159,', '-40.932,-0.320,-1.390,', '-36.808,0.442,-1.382,', '-30.831,0.548,-1.288,', '-29.404,1.235,-1.300,', '-26.453,1.424,-1.261,', '-30.559,2.775,-1.249,', '-27.714,3.439,-1.201,']

Я хочу построить все точки на трехмерном графике.У меня есть это до сих пор:

#!/usr/bin/env python

import numpy as np
import matplotlib.pyplot as plt

with open("measurements.txt") as f:
    content = f.read().splitlines()
#print content

for value in content:
    x, y, z = value.split(',')

#print x, y, z 
fig = plt.figure()
ax = plt.axes(projection='3d')

ax.scatter(x, y, z)

fig.savefig('scatterplot.png')

Выдает ошибку:

Traceback (последний вызов последнего): файл "plotting.py", строка 11, в х,y, z = value.split (',') ValueError: слишком много значений для распаковки

Как мне построить эти точки?Спасибо за вашу помощь.

Ответы [ 5 ]

0 голосов
/ 18 сентября 2018

Я вижу здесь хотя бы одну ошибку.

Самый очевидный (потому что вы получили ошибку) - это расщепление. Третья запятая в конце приводит к разбиению строки на четыре элемента

>>> l = 'a,b,c,'
>>> l.split(',')
['a', 'b', 'c', '']

вы можете обойти это, используя:

x,y,z,_ = value.split(',')

следующая проблема, с которой вы столкнетесь - это ваш цикл

for value in content:
    x, y, z = value.split(',')

вы сохраняете только последнее из ваших значений, поскольку вы перезаписываете их несколько раз. Самый простой способ обойти это - создать три списка и добавить в них:

x = []
y = []
z = []
for measurement in content:
    a,b,c,_ = measurement.split(',')
    x.append(a)
    y.append(b)
    z.append(c)

Это не самый эффективный способ, но я думаю, что это должно быть легче для понимания.

Я рекомендую использовать его так:

x = []
y = []
z = []
with open('measurements.txt') as file:
    for line in file:
        a,b,c,_ = line.split(',')
        x.append(a)
        y.append(b)
        z.append(c)
0 голосов
/ 18 сентября 2018

Элемент в content:

'2.449,14.651,-0.992,'

Немного другой способ извлечения данных для построения из этой строки - это рассмотреть их как кортеж и использовать eval().

data = [eval("("+x[:len(x)-1]+")") for x in content]

Что возвращает:

[(2.449, 14.651, -0.992),
 (6.833, 13.875, -1.021),
 (8.133, 17.431, -1.15),
 ...
 (-30.559, 2.775, -1.249),
 (-27.714, 3.439, -1.201)]

РЕДАКТИРОВАТЬ: ошибка, которую вы получили означает:

Вы хотите 3 значения, X, Y и Z;но когда я делю на ",", их становится больше (слишком много значений для распаковки).

content[0].split(",")
Out[4]: ['2.449', '14.651', '-0.992', '']
0 голосов
/ 18 сентября 2018

Чтобы решить основную проблему, вы должны отредактировать список и сделать его массивом 3d, скопировав все значения, пройдя по списку с помощью re.

Вместо того, чтобы считать список несколькими точками, попробуйте взять первые 2 точки или 3 точки в качестве графика изображения / 3D и используйте imshow или Axes3D для его построения.

0 голосов
/ 18 сентября 2018

Прежде всего вам нужно взять значения в соответствующие массивы, разбивая строки в файле, а затем передать их функции.

content = ['2.449,14.651,-0.992,', '6.833,13.875,-1.021,', '8.133,17.431,-1.150,', '3.039,13.724,-0.999,', '16.835,9.456,-1.031,', '16.835,9.457,-1.031,', '15.388,5.893,-0.868,', '13.743,25.743,-1.394,', '14.691,24.988,-1.387,', '15.801,25.161,-1.463,', '14.668,23.056,-1.382,', '22.378,20.268,-1.457,', '21.121,17.041,-1.353,', '19.472,13.555,-1.192,', '22.498,20.115,-1.436,', '13.344,-33.672,-0.282,', '13.329,-33.835,-0.279,', '13.147,-30.690,-0.305,', '13.097,-28.407,-0.339,', '13.251,-28.643,-0.366,', '13.527,-25.067,-0.481,', '19.433,-33.137,-0.408,', '19.445,-29.501,-0.345,', '20.592,-28.004,-0.312,', '19.109,-26.512,-0.380,', '18.521,-24.155,-0.519,', '22.837,48.245,-2.201,', '23.269,50.129,-2.282,', '23.499,46.652,-2.297,', '23.814,48.646,-2.271,', '30.377,46.501,-2.214,', '29.869,44.479,-2.143,', '29.597,41.257,-2.018,', '28.134,40.291,-2.159,', '-40.932,-0.320,-1.390,', '-36.808,0.442,-1.382,', '-30.831,0.548,-1.288,', '-29.404,1.235,-1.300,', '-26.453,1.424,-1.261,', '-30.559,2.775,-1.249,', '-27.714,3.439,-1.201,']

import numpy as np
import matplotlib.pyplot as plt

#with open("measurements.txt") as f:
    #content = f.read().splitlines()
#print content

#for value in content:
#    x, y, z = value.split(',')

x = [float(i.split(',')[0]) for i in content]
y = [float(i.split(',')[1]) for i in content]
z = [float(i.split(',')[2]) for i in content]
#print(x, y, z)
fig = plt.figure()
ax = plt.axes(projection='3d')

ax.scatter(x, y, z)

fig.savefig('scatterplot.png')

output

Output

0 голосов
/ 18 сентября 2018

Понятно! когда вы делаете ваш сплит, есть 4 значения

content = ['2.449,14.651,-0.992,', '6.833,13.875,-1.021,', '8.133,17.431,-1.150,', '3.039,13.724,-0.999,', '16.835,9.456,-1.031,', '16.835,9.457,-1.031,', '15.388,5.893,-0.868,', '13.743,25.743,-1.394,', '14.691,24.988,-1.387,', '15.801,25.161,-1.463,', '14.668,23.056,-1.382,', '22.378,20.268,-1.457,', '21.121,17.041,-1.353,', '19.472,13.555,-1.192,', '22.498,20.115,-1.436,', '13.344,-33.672,-0.282,', '13.329,-33.835,-0.279,', '13.147,-30.690,-0.305,', '13.097,-28.407,-0.339,', '13.251,-28.643,-0.366,', '13.527,-25.067,-0.481,', '19.433,-33.137,-0.408,', '19.445,-29.501,-0.345,', '20.592,-28.004,-0.312,', '19.109,-26.512,-0.380,', '18.521,-24.155,-0.519,', '22.837,48.245,-2.201,', '23.269,50.129,-2.282,', '23.499,46.652,-2.297,', '23.814,48.646,-2.271,', '30.377,46.501,-2.214,', '29.869,44.479,-2.143,', '29.597,41.257,-2.018,', '28.134,40.291,-2.159,', '-40.932,-0.320,-1.390,', '-36.808,0.442,-1.382,', '-30.831,0.548,-1.288,', '-29.404,1.235,-1.300,', '-26.453,1.424,-1.261,', '-30.559,2.775,-1.249,', '-27.714,3.439,-1.201,']

Решение:

for value in content:
    x, y, z,parasitic_value = value.split(',')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...