2012-06-04 4 views
10

Ich bin auf der Suche nach Tipps zum Zeichnen von Vektoren in der kartesischen Ebene. Die Aufgabe besteht darin, Punkte (Koordinaten) zu zeichnen und sie dann mit einem Pfeil mit einem Quellpunkt (etwa 0,0) zu verknüpfen. Das Bild unten sollte eine Idee geben. Ich interessiere mich nicht für Farben und Benennungsvektoren/Punkte, es geht nur darum Pfeile in der Koordinatenebene zu zeichnen. Ich bin mir sicher, dass eine Bibliothek in R (oder Python) existiert, um lineare Algebra-Vektoren und Operationen zu plotten.Zeichnen von Vektoren in einem Koordinatensystem mit R oder Python

Alle Zeiger würden geschätzt werden!

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

+9

"alle Hinweise geschätzt würde" * stöhnen * – Spacedman

Antwort

13

Oder Sie können arrows Funktion in R.

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

Interessant. Wäre es möglich, dem Pfeil etwas Augenweide hinzuzufügen? (Dicke, Farbe, Pfeilspitze, Strich ...) – heltonbiker

+1

@heltonbiker Siehe 'Pfeile'. Es heißt 'col',' lty' und 'lwd' werden akzeptiert. – Gregor

+0

Wenn Sie in Ihren Etiketten ausgefallen sein möchten, sehen Sie sich das tikzDevice-Paket an. – Gregor

0

Die naheliegendste Vorgehensweise wäre die Python matplotlib Paket zu verwenden, die eine Menge Plotten Funktionen.

Insbesondere möchten Sie this example Reverse-Engineer.

Eine andere Möglichkeit, nette Ergebnisse auf eine künstlerischere und weniger kartesische Weise zu erzielen, wäre das Erstellen und Rendern von SVG mit rsvg. Ich habe das nie ausprobiert, aber SVG sollte native Unterstützung für Pfeilspitzen haben. Außerdem können SVG-Dateien bei Bedarf in Zeichnungsprogrammen wie Inkscape bearbeitet werden.

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

verwenden Es wird ein bisschen besser aussehen, wenn Sie lwd = 3 zum arrows Anruf hinzuzufügen. Die Funktion text ermöglicht die Beschriftung und kann mit dem Parameter 'srt' gedreht werden.

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

Bitte beachten Sie, dass die list Funktion innerhalb des expression Anruf ein -Aufruf plotmath list ist, anders als die reguläre R list ebenso plotmath- paste ist anders als normale paste. Es versucht nicht, sein Argument im Eltern-Frame zu bewerten. Dafür würde man bquote oder substitute benötigen und müsste wahrscheinlich verwenden, um die "inneren" Ausdrücke zu verarbeiten.

+0

Danke, das habe ich gesucht! – sim

+0

Ich dachte, das Hinzufügen der Expressionsvektor-Methode der Markierung wäre nützlich. Check out? Plotmath, wo Sie lernen sollten, dass die Plotmath 'list' Funktion nicht die selbe ist wie die R' list' Funktion. Dies gilt auch für die Plotmath-Paste-Funktion gegenüber der Hauptpaste-Funktion. Der Plotmath 'list' ändert Kommas innerhalb von Ausdrücken in Literal-Kommas im Gegensatz zu syntaktischen Operationen. –

1

Eine einfache (TM) Möglichkeit, um einige zufällige Vektoren der Stärke 2 zu zeichnen. Ich berechne zuerst die euklidische Norm, sonst wird die Pfeilfunktion Pfeile von Punkt zu Punkt zeichnen, wodurch ein Dreieck entsteht, schön als Erklärung, aber nicht was wir wollen. Der Rest ist einfach:

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