Построение векторов в системе координат с R или python

Я ищу советы по построению векторов в декартовой плоскости. Задача состоит в том, чтобы построить точки (координаты) и затем связать их стрелкой с какой-либо исходной точкой (скажем, 0,0). Изображение ниже должно дать представление. Меня не волнуют цвета и названия векторов/точек, речь идет только о нанесении стрелок на координатной плоскости. Я уверен, что в R (или python) существует какая-то библиотека для построения векторов и операций линейной алгебры.

Любые указатели приветствуются!

vectors in a plane
(источник: mathinsight.org)

Ответ 1

Или вы можете использовать функцию arrows в R.

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

Ответ 2

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

Это будет выглядеть немного лучше, если вы добавите lwd = 3 в вызов arrows. Функция text позволяет маркировать и может вращаться с параметром '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

Обратите внимание, что функция list внутри вызова expression представляет собой plotmath list -call, отличный от обычного R list так же, как plotmath- paste отличается от обычного paste. Он не пытается оценить свой аргумент в родительском кадре. Для этого понадобится bquote или substitute и, вероятно, потребуется использовать sapply для обработки "внутренних" выражений.

Ответ 3

Легкий (TM) способ рисовать несколько векторов случайной величины 2. Сначала я рассчитываю эвклидовую норму, иначе функция стрелки будет отображать стрелки из точки в точку, создавая треугольник, как объяснение, но не то, что мы хотим. Остальное просто:

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

Ответ 4

Самый очевидный способ действий - использовать пакет python matplotlib, который имеет много особенностей построения.

В частности, вы хотели бы реконструировать этот пример.

Другим способом получения хороших результатов, более художественно и менее декартово, было бы создание и рендеринг SVG с помощью rsvg. Я никогда не пробовал этого, но SVG должен иметь встроенную поддержку стрелок. Кроме того, файлы SVG можно редактировать в программах рисования, таких как Inkscape, если это необходимо.