2012-06-04 12 views
10

Estoy buscando consejos para trazar vectores en el plano cartesiano. La tarea es trazar puntos (coordenadas) y luego vincularlos con una flecha a algún punto de origen (digamos 0,0). La imagen de abajo debería dar una idea. No me importan los colores y el nombre de vectores/puntos, solo se trata de trazar flechas en el plano de coordenadas. Estoy seguro de que existe una biblioteca en R (o python) para trazar vectores de álgebra lineal y operaciones.Trazado de vectores en un sistema de coordenadas con R o python

¡Cualquier puntero sería apreciado!

vectors in a plane http://mathinsight.org/media/image/image/vector_2d_add.png

+9

"cualquier punteros sería apreciada" * * gemido – Spacedman

Respuesta

13

O puede utilizar la función arrows en R.

plot(c(0,1),c(0,1)) 
arrows(0,0,1,1) 
+0

interesante. ¿Sería posible agregar algunos ojos dulces a la flecha? (grosor, color, estilo de punta de flecha, guión ...) – heltonbiker

+1

@heltonbiker Ver '? flechas'. Dice que se aceptan 'col',' lty' y 'lwd'. – Gregor

+0

Además, si quieres ser elegante en tus etiquetas, echa un vistazo al paquete tikzDevice. – Gregor

0

El curso más obvio de acción sería la de utilizar el paquete de pitón matplotlib, que tiene un montón de características de trazado.

Específicamente, le gustaría realizar la ingeniería inversa this example.

Otra forma de obtener buenos resultados, de una manera más artística y menos cartesiana, sería crear y renderizar SVG usando rsvg. Nunca lo he intentado, pero SVG debería tener soporte nativo para arrow-heads. Además, los archivos SVG se pueden editar en programas de dibujo como Inkscape si es necesario.

10
plot(NA, xlim=c(0,5), ylim=c(0,5), xlab="X", ylab="Y") 
vecs <- data.frame(vname=c("a","b","a+b", "transb"), 
        x0=c(0,0,0,2),y0=c(0,0,0,1), x1=c(2,1,3,3) ,y1=c(1,2,3,3), 
        col=1:4) 
with(vecs, mapply("arrows", x0, y0, x1,y1,col=col)) 

Se verá un poco mejor si se agrega lwd = 3 a la llamada arrows. La función text permitiría el etiquetado y se puede rotar con el parámetro 'srt'.

plot(NA, xlim=c(0,5), ylim=c(0,5), xlab="X", ylab="Y", lwd=3) 
with(vecs, mapply("arrows", x0, y0, x1,y1,col=col,lwd=3)) 
with(vecs, mapply('text', x=x1[1:3]-.1, y=y1[1:3]+.1, 
    labels=expression(list(a[1],a[2]), list(b[1],b[2]), list(a[1]+b[1],a[2]+b[2])))) 

enter image description here

Tenga en cuenta que la función list dentro de la llamada expression es un -call plotmath list, diferente a la habitual R list tan plotmath- paste es diferente a la normal paste. No hace ningún intento de evaluar su argumento en el marco principal. Para eso necesitaría bquote o substitute y probablemente necesitaría usar sapply para procesar las expresiones "interiores".

+0

¡Gracias, eso es lo que estaba buscando! – sim

+0

Pensé que sería útil agregar el método de etiquetado del vector de expresión. Echa un vistazo a? Plotmath donde deberías aprender que la función plotmath 'list' no es lo mismo que la función' R' list'. Eso también es cierto para la función plotmath 'paste' frente a la función principal' paste'. El plotmath 'list' cambia las comas dentro de las expresiones a comas literales en oposición a las operaciones sintácticas. –

1

Una forma fácil (TM) de dibujar algunos vectores de magnitud aleatoria 2. Primero calculo la norma euclidiana, de lo contrario la función de flecha trazará flechas de punto a punto creando un triángulo, agradable como explicación, pero no es lo que queremos. El resto es sencillo:

#first some vectors 
v1<-c(-3,5) 
v2<-c(2,-10) 
v3 <-c(0,-3) 
v4 <- c(2,5) 
# This one for the coordinates of the plot 
ax<-c(-10,10) 
# I will need the euclidean norm (two-norm) of the vectors: 
mag <- function(x) sqrt(sum(x^2)) 
# I call plot to set up the "canvas" 
plot(ax,ax,main="Test") 
# I do the stuffz, the FIRST pair of params is the ORIGIN 
arrows(0,0, mag(v1),mag(v2),lwd=4,col="red") 
arrows(-2,1, mag(v3),mag(v4),lwd=4,col="blue") 
Cuestiones relacionadas