Построение векторов в системе координат с помощью R или Python

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

Любые указатели будут оценены!

векторы на плоскости
(источник: mathinsight.org)


person sim    schedule 04.06.2012    source источник
comment
любые указатели будут оценены стон   -  person Spacedman    schedule 04.06.2012


Ответы (5)


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

plot(c(0,1),c(0,1))
arrows(0,0,1,1)
person danas.zuokas    schedule 04.06.2012
comment
Интересно. Можно ли добавить стрелке немного красоты? (толщина, цвет, вид стрелки, тире...) - person heltonbiker; 04.06.2012
comment
@heltonbiker См. ?arrows. Он говорит, что col, lty и lwd принимаются. - person Gregor Thomas; 04.06.2012
comment
Кроме того, если вы хотите, чтобы ваши ярлыки были необычными, ознакомьтесь с пакетом tikzDevice. - person Gregor Thomas; 04.06.2012

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

введите здесь описание изображения

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

person IRTFM    schedule 04.06.2012
comment
Спасибо, это то, что я искал! - person sim; 05.06.2012
comment
Я подумал, что добавление векторного метода маркировки экспрессии было бы полезно. Ознакомьтесь с ?plotmath, где вы должны узнать, что функция plotmath list не совпадает с функцией R list. Это также верно для функции plotmath paste по отношению к основной функции paste. Графика list изменяет запятые внутри выражений на буквальные запятые, а не на синтаксические операции. - person IRTFM; 05.06.2012

Простой (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")
person runlevel0    schedule 29.01.2015

Наиболее очевидным способом действий было бы использование пакета Python matplotlib, который имеет множество функций построения графиков.

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

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

person heltonbiker    schedule 04.06.2012

Ознакомьтесь с пакетом matlib.

library(matlib)
#setting up the plot
xlim <- c(0,6)
ylim <- c(0,6)
par(mar=c(3,3,1,1)+.1)
plot(xlim, ylim, type="n", xlab="X1", ylab="X2", asp=1)
grid()
# define some vectors
a=c(4,2)
b=c(1,3)
# plot the vectors
vectors(b, labels="b", pos.lab=4, frac.lab=.5, col="green")
vectors(a, labels="a", pos.lab=4, frac.lab=.5)
vectors(a+b, labels="a+b", pos.lab=4, frac.lab=.5, col="red")
# vector a+b starting from a is equal to b.
vectors(a+b, labels="b", pos.lab=4, frac.lab=.5, origin=a, col="green")

результат

person Evan Rosica    schedule 14.08.2020