矢量场可视化R.

use*_*209 13 plot r vector

我有一个包含大量行的大文本文件.每行对应一个向量.这是每行的示例:

        x           y               dx              dy
99.421875   52.078125   0.653356799108  0.782479314511
Run Code Online (Sandbox Code Playgroud)

前两列是矢量开始的坐标.并且两个第二列是坐标增量(结束减去开始).我需要制作这个矢量场的图片(一张图片上的所有矢量).我怎么能这样做?谢谢

Vin*_*ynd 33

如果有大量数据(问题说"大文件"),绘制单个矢量可能无法给出非常易读的情节.这是另一种方法:矢量场描述了一种使平面上绘制的东西变形的方法; 将其应用于白噪声图像.

vector_field <- function(
  f,  # Function describing the vector field
  xmin=0, xmax=1, ymin=0, ymax=1,
  width=600, height=600,
  iterations=50,
  epsilon=.01,
  trace=TRUE
) {
  z <- matrix(runif(width*height),nr=height)
  i_to_x <- function(i) xmin + i / width  * (xmax - xmin)
  j_to_y <- function(j) ymin + j / height * (ymax - ymin)
  x_to_i <- function(x) pmin( width,  pmax( 1, floor( (x-xmin)/(xmax-xmin) * width  ) ) )
  y_to_j <- function(y) pmin( height, pmax( 1, floor( (y-ymin)/(ymax-ymin) * height ) ) )
  i <- col(z)
  j <- row(z)
  x <- i_to_x(i)
  y <- j_to_y(j)
  res <- z
  for(k in 1:iterations) {
    v <- matrix( f(x, y), nc=2 )
    x <- x+.01*v[,1]
    y <- y+.01*v[,2]
    i <- x_to_i(x)
    j <- y_to_j(y)
    res <- res + z[cbind(i,j)]
    if(trace) {
      cat(k, "/", iterations, "\n", sep="")
      dev.hold()
      image(res)
      dev.flush()
    }
  }
  if(trace) {
    dev.hold()
    image(res>quantile(res,.6), col=0:1)
    dev.flush()
  }
  res
}

# Sample data
van_der_Pol <- function(x,y, mu=1) c(y, mu * ( 1 - x^2 ) * y - x )
res <- vector_field(
  van_der_Pol,
  xmin=-3, xmax=3, ymin=-3, ymax=3,
  width=800, height=800,
  iterations=50,
  epsilon=.01
)
image(-res)
Run Code Online (Sandbox Code Playgroud)

范德波尔吸引子

您可能希望对结果应用一些图像处理,以使其更具可读性.

image(res > quantile(res,.6), col=0:1)
Run Code Online (Sandbox Code Playgroud)

阈值化之后

在您的情况下,矢量字段不是由函数描述的:您可以使用最近邻居的值或某些二维插值(例如,从akima包中).


jub*_*uba 14

有了ggplot2,你可以这样做:

library(grid) 
df <- data.frame(x=runif(10),y=runif(10),dx=rnorm(10),dy=rnorm(10))
ggplot(data=df, aes(x=x, y=y)) + geom_segment(aes(xend=x+dx, yend=y+dy), arrow = arrow(length = unit(0.3,"cm")))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这几乎直接来自geom_segment 帮助页面.


tim*_*ffe 5

好的,这是一个基础解决方案:

DF <- data.frame(x=rnorm(10),y=rnorm(10),dx=runif(10),dy=runif(10))
plot(NULL, type = "n", xlim=c(-3,3),ylim=c(-3,3))
arrows(DF[,1], DF[,2], DF[,1] + DF[,3], DF[,2] + DF[,4])
Run Code Online (Sandbox Code Playgroud)