【问题标题】:Plotting lines without for loops in R在R中绘制没有for循环的线
【发布时间】:2013-11-08 19:32:14
【问题描述】:

我正在为空间交互模型制作流程图,起点和终点都有 x-y 坐标:

问题是我一直使用嵌套的 for 循环(一个用于起点,一个用于目的地)来绘制这些线,并且确信在 R 中有更好的方法。

无论如何,为了帮助回答这个问题,我设置了一个简单的可重现示例,其中包含 4 个起点和 2 个目的地。怀疑更快绘图的答案是在矩阵代数中,但不确定从哪里开始。测试一下,请告诉我:

o <- data.frame(x = c(3,5,6,1), y = c(8,2,3,2))
plot(o)
d <- data.frame(x = c(5,3), y = c(5,3))
points(d, col="red", pch=3)
beta <- 0.6

dist <- matrix(sqrt(c(o[,1] - d[1,1], o[,1] - d[2,1] )^2 +
               c(o[,2] - d[1,2], o[,2] - d[2,2] )^2), ncol = 2)
s <- dist

for(i in 1:nrow(o)){
  for(j in 1:nrow(d)){
    s[i,j] <- exp(-beta * dist[i,j])
  }  
}

for(i in 1:nrow(o)){
  for(j in 1:nrow(d)){
   lines(c(o[i,1], d[j,1]), c(o[i,2], d[j,2]), 
         lwd = 2 * s[i,j] / mean(s))
  }  
}

编辑 - 有关此项目的一些背景信息,请参阅此处http://rpubs.com/RobinLovelace/9697

【问题讨论】:

  • 您的第一个for 循环可以替换为s &lt;- exp(-beta * dist)
  • 啊,是的 - 第一个循环作为更复杂的 s 定义的遗物存在,例如: s
  • 使用segments() 代替行?

标签: r for-loop plot lines


【解决方案1】:

替换第二个循环的一种方法是使用mapply

fun <- function(row.o, row.d)
{
 lines(c(o[row.o,1], d[row.d,1]), c(o[row.o,2], d[row.d,2]), 
         lwd = 2 * s[row.o,row.d] / mean(s))
}

#all combinatios of rows of `d` and `o` 
args.od <- expand.grid(1:nrow(o), 1:nrow(d))

mapply(fun, row.o = args.od[,1], row.d = args.od[,2])

剧情:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2020-02-26
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多