2012-06-04 11 views
10

Sto cercando consigli sui vettori di tracciamento nel piano cartesiano. L'attività consiste nel tracciare punti (coordinate) e quindi collegarli con una freccia a un punto sorgente (ad esempio 0,0). L'immagine qui sotto dovrebbe dare un'idea. Non mi preoccupo dei colori e dei nomi dei vettori/punti, si tratta solo di tracciare le frecce sul piano delle coordinate. Sono sicuro che esiste una libreria in R (o python) per tracciare i vettori e le operazioni di algebra lineare.Tracciare i vettori in un sistema di coordinate con R o pitone

Qualsiasi suggerimento sarebbe apprezzato!

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

+9

"tutti i puntatori sarebbe apprezzato" * gemito * – Spacedman

risposta

13

Oppure si può utilizzare la funzione arrows in R.

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

Interessante. Sarebbe possibile aggiungere un po 'di eye-candy alla freccia? (spessore, colore, punta di freccia, trattino ...) – heltonbiker

+1

@heltonbiker Vedi '? arrows'. Si dice che 'col',' lty' e 'lwd' sono accettati. – Gregor

+0

Inoltre, se vuoi essere elegante nelle tue etichette, controlla il pacchetto tikzDevice. – Gregor

0

Il corso più evidente di azione sarebbe quella di utilizzare il pacchetto di pitone matplotlib, che ha un sacco di funzioni stampa.

In particolare, si desidera eseguire la retroingegnerizzazione dello this example.

Un altro modo per ottenere buoni risultati, in un modo più artistico e meno cartesiano, è quello di creare e rendere SVG utilizzando rsvg. Non l'ho mai provato, ma SVG dovrebbe avere il supporto nativo per le frecce. Inoltre, i file SVG possono essere modificati in programmi di disegno come Inkscape se necessario.

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)) 

Sembrerà un po 'meglio se si aggiunge LWD = 3 alla chiamata arrows. La funzione text consentirebbe l'etichettatura e può essere ruotata con il parametro '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

prega di notare che la funzione list all'interno della chiamata expression è un -call plotmath list, diverso dal normale R list altrettanto plotmath- paste è diverso rispetto alla normale paste. Non fa alcun tentativo di valutare il suo argomento nel frame principale. Per quello uno avrebbe bisogno di bquote o substitute e probabilmente sarebbe necessario utilizzare sapply essere utilizzato per elaborare le espressioni "interni".

+0

Grazie, questo è quello che stavo cercando! – sim

+0

Ho pensato di aggiungere il metodo di espressione vettore dell'etichettatura sarebbe utile. Guarda? Plotmath dove dovresti sapere che la funzione plotmath 'list' non è la stessa della funzione R' list'. Questo vale anche per la funzione 'paste' del plotmath rispetto alla funzione principale' paste'. La 'lista' plotmath cambia le virgole all'interno delle espressioni in virgolette, al contrario delle operazioni sintattiche. –

1

Un modo facile (TM) per disegnare alcuni vettori di magnitudo 2 a caso. Per prima cosa calcolo la norma euclidea, altrimenti la funzione freccia traccerà le frecce da un punto all'altro creando un triangolo, bello come spiegazione, ma non quello che vogliamo. Il resto è semplice:

#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")