2010-04-23 3 views
3

Я хочу построить некоторые данные. Первый столбец содержит x-данные. Но matplotlib не делает этого. Где моя ошибка?Python: x-y-plot с 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() 

EDIT: http://paste.pocoo.org/show/205534/ Но это не работает.

ответ

2
x = data[:][0] 
y1 = data[:][2] 
y3 = data[:][3] 

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

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

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

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

т.д.

5

Вы можете сделать это путем преобразования данных в 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 и т.д. принять радиан как их входы и ваши номера выглядят degre эс.

0

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

#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() 
Смежные вопросы