【问题标题】:Plotting vectors in a coordinate system with R or python使用 R 或 python 在坐标系中绘制向量
【发布时间】:2012-06-08 14:05:21
【问题描述】:

我正在寻找有关在笛卡尔平面上绘制矢量的建议。任务是绘制点(坐标),然后用箭头将它们链接到某个源点(比如 0,0)。下面的图片应该给出一个想法。我不关心颜色和命名向量/点,它只是在坐标平面上绘制箭头。我确信 R(或 python)中存在一些用于绘制线性代数向量和运算的库。

任何指针将不胜感激!


(来源:mathinsight.org

【问题讨论】:

  • "任何指针将不胜感激" groan

标签: python r vector plot coordinate-systems


【解决方案1】:

或者你可以在R中使用arrows函数。

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

【讨论】:

  • 有趣。是否可以在箭头上添加一些吸引眼球的东西? (粗细、颜色、箭头样式、破折号……)
  • @heltonbiker 见?arrows。它说colltylwd 被接受。
  • 另外,如果你想在你的标签上花哨,请查看 tikzDevice 包。
【解决方案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]) ) ))

请注意,expression 调用中的 list 函数是一个 plotmath list-调用,不同于常规的 R list,就像 plotmath-paste 不同于常规的 paste。它不会尝试在父框架中评估其参数。为此需要bquotesubstitute,并且可能需要使用sapply 来处理“内部”表达式。

【讨论】:

  • 谢谢,这就是我要找的!
  • 我认为添加标记的表达向量方法会很有用。查看 ?plotmath 您应该了解 plotmath list 函数与 R list 函数不同。 plotmath paste 函数相对于主要 paste 函数也是如此。 plotmath list 将表达式中的逗号更改为文字逗号,而不是语法操作。
【解决方案3】:

绘制几个随机 2 级向量的 Easy(TM) 方法。我首先计算欧几里得范数,否则箭头函数将绘制箭头从一个点到另一个点创建一个三角形,这很好解释,但不是我们想要的。其余的很简单:

#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 包,它有很多绘图功能。

    具体来说,您想对 this example 进行逆向工程。

    另一种获得好结果的方法是使用rsvg 创建和渲染 SVG,以一种更具艺术性和更少笛卡尔的方式。我从未尝试过,但 SVG 应该具有对箭头的原生支持。此外,如果需要,还可以在 Inkscape 等绘图程序中编辑 SVG 文件。

    【讨论】:

      【解决方案5】:

      查看matlib package

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-05
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多