2010-04-23 7 views
3

Je veux tracer quelques données. La première colonne contient les données x. Mais matplotlib ne trace pas cela. Où est mon erreur?Python: x-y-plot avec 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/ Mais cela ne fonctionne pas.

Répondre

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

Ces lignes ne font pas ce que vous pensez. Tout d'abord, ils prennent une tranche du tableau qui est l'ensemble du tableau (c'est-à-dire juste une copie), puis ils tirent le 0e, 2e ou 3e rang de ce tableau, pas de colonne.

Vous pouvez essayer

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

etc.

5

Vous pouvez le faire en convertissant les données à un tableau 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) 

Quelques points supplémentaires:

Vous pouvez faire le calcul d'une manière plus claire et vectorisé à l'aide numpy, comme celui-ci

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 

comme vous l'avez écrit, votre calcul ne peut pas donner ce que vous voulez depuis cos etc prendre radians que leurs entrées et vos numéros ressembler à Degre es.

0

Essayez ceci:

#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() 
Questions connexes