Python: x-y-plot с matplotlib - PullRequest
       33

Python: x-y-plot с matplotlib

3 голосов
/ 23 апреля 2010

Я хочу построить некоторые данные.Первый столбец содержит данные x.Но Matplotlib не готовит это.Где моя ошибка?

import numpy as np
from numpy import cos
from scipy import *
from pylab import plot, show, ylim, yticks
from matplotlib import *
from pprint import pprint

n1 = 1.0
n2 = 1.5

#alpha, beta, intensity
data = [
    [10,    22,     4.3],
    [20,    42,     4.2],
    [30,    62,     3.6],
    [40,    83,     1.3],
    [45,    102,    2.8],
    [50,    123,    3.0],
    [60,    143,    3.2],
    [70,    163,    3.8],
    ]

for i in range(len(data)):
    rhotang1 = (n1 * cos(data[i][0]) - n2 * cos(data[i][1]))
    rhotang2 = (n1 * cos(data[i][0]) + n2 * cos(data[i][1]))
    rhotang = rhotang1 / rhotang2
    data[i].append(rhotang) #append 4th value

pprint(data)
x = data[:][0]
y1 = data[:][2]
y3 = data[:][3]
plot(x, y1, x, y3)
show()

РЕДАКТИРОВАТЬ: http://paste.pocoo.org/show/205534/ Но это не работает.

Ответы [ 3 ]

5 голосов
/ 23 апреля 2010

Вы можете сделать это путем преобразования данных в массив Numpy:

data = np.array(data) # insert this new line after your appends

pprint(data)
x = data[:,0]    # use the multidimensional slicing notation
y1 = data[:,2]
y3 = data[:,3]
plot(x, y1, x, y3)

Несколько дополнительных очков:

Вы можете сделать расчет более понятным и векторизованным способом, используя numpy, например:

data = np.array(data)
rhotang1 = n1*cos(data[:,0]) - n2*cos(data[:,1])
rhotang2 = n1*cos(data[:,0]) + n2*cos(data[:,1])
y3 = rhotang1 / rhotang2

Как вы уже написали, ваши вычисления могут не дать того, что вы хотите, поскольку cos и т. Д. Принимают радианы в качестве входных данных, а ваши числа выглядят как градусы.

2 голосов
/ 23 апреля 2010
x = data[:][0]
y1 = data[:][2]
y3 = data[:][3]

Эти строки не делают то, что вы думаете.

Сначала они берут фрагмент массива, который является целым массивом (то есть просто копией), затем они вытягивают 0-й, 2-й или 3-й ряд из этого массива, а не столбца.

Вы можете попробовать

x = [row[0] for row in x]

и т.д.

0 голосов
/ 25 апреля 2010

Попробуйте это:

#fresnel formula

import numpy as np
from numpy import cos
from scipy import *
from pylab import plot, show, ylim, yticks
from matplotlib import *
from pprint import pprint

n1 = 1.0
n2 = 1.5

#alpha, beta, intensity
data = np.array([
    [10,    22,     4.3],
    [20,    42,     4.2],
    [30,    62,     3.6],
    [40,    83,     1.3],
    [45,    102,    2.8],
    [50,    123,    3.0],
    [60,    143,    3.2],
    [70,    163,    3.8],
    ])

# Populate arrays
x = np.array([row[0] for row in data])
y1 = np.array([row[1] for row in data])
rhotang1 = n1*cos(data[:,0]) - n2*cos(data[:,1])
rhotang2 = n1*cos(data[:,0]) + n2*cos(data[:,1])
y3 = rhotang1 / rhotang2

plot(x, y1, 'r--', x, y3, 'g--')
show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...