R:如何用点“填充”网格

Posted

技术标签:

【中文标题】R:如何用点“填充”网格【英文标题】:R: How to "fill" a grid with points 【发布时间】:2021-10-01 12:17:18 【问题描述】:

我正在使用 R 编程语言。

假设我有以下功能:

# function: defined the first way

my_function_a <- function(x) 
  
  final_value = sin(x[1]) + cos(x[2]) + x[3] 
  
 


    #function : defined the second way
    
    my_function_b <- function(input_1, input_2, input_3) 
    
    final_value = sin(input_1) + cos(input_2) + input_3 
     
    

目标:我想在不同的点评估这个函数,以便制作一个 3 维图。

第一次尝试:

我尝试了一种非常基本的方法来在一系列固定点(使用网格)评估这个函数:

library(plotly)
library(dplyr)

#create grid and evaluate function
input_1 <- seq(0,100,1)
input_2 <- seq(0,100,1)
input_3 <- seq(0,100,1)


my_grid <- data.frame(input_1, input_2, input_3)
my_grid$final_value = sin(input_1) + cos(input_2) + input_3 

然后我尝试绘制这个函数:

#plot function

plot_ly() %>% 
        add_trace(data = my_grid,  x=my_grid$input_1, y=my_grid$input_2, z=my_grid$input_3, type='mesh3d') %>%
        add_surface(
                z = my_grid %>% as.matrix(),
                surfacecolor = my_grid,
                cauto=F,
                cmax=max(my_grid$final_value),
                cmin=min(my_grid$final_value)
        )

这个函数的情节看起来很“简单”:

然后我意识到这是因为我只在“均匀间隔”的点上评估了这个函数,例如:

 head(my_grid)
  input_1 input_2 input_3 final_value
1       0       0       0    1.000000
2       1       1       1    2.381773
3       2       2       2    2.493151
4       3       3       3    2.151128
5       4       4       4    2.589554
6       5       5       5    4.324738

比如在上面的数据框中,你不会找到(input_1 = 5, input_2 = 2, input_3 =11)这样的点组合

第二次尝试

接下来,我尝试添加一些“随机性”来决定在哪些点处评估函数:

#create grid and evaluate function
input_1 <- rnorm(100,100,20)
input_2 <- rnorm(100,100,20)
input_3 <- rnorm(100,100,20)


my_grid <- data.frame(input_1, input_2, input_3)
my_grid$final_value = sin(input_1) + cos(input_2) + input_3 


#create plot
plot_ly() %>% 
        add_trace(data = my_grid,  x=my_grid$input_1, y=my_grid$input_2, z=my_grid$input_3, type='mesh3d') %>%
        add_surface(
                z = my_grid %>% as.matrix(),
                surfacecolor = my_grid,
                cauto=F,
                cmax=max(my_grid$final_value),
                cmin=min(my_grid$final_value)
        )

该图现在似乎包含更高级别的复杂性,如用于创建该图的数据所示:

head(my_grid)
    input_1   input_2   input_3 final_value
1  82.09936  65.48251 103.26060   102.78460
2  81.94343 118.69431  76.51834    77.55103
3  76.90372 115.58958 123.96159   124.16298
4 128.52814  85.52632  69.02835    68.53927
5  96.89466 121.53117 124.39381   124.32069
6  97.59012 126.80997  87.54789    87.76038

问题:是否有任何“更好”的方法可以用点填充此网格,以便您可以“更好看、更逼真”的情节?例如,是否可以创建一个这样的网格

#iterate input_1 from 1-100 AND fix input_2 and input_3 as constant
input_1 = 1, input_2 = 1, input_3 = 1 ; input_1 = 2, input_2 = 1, input_3 = 1 ; etc; input_1 = 100, input_2 = 1, input_3 = 1

#iterate input_2 from 1-100 AND fix input_1 and input_3 as constant 
input_1 = 1, input_2 = 2, input_3 = 1; input_1 = 1, input_2 = 3, input_3 = 1 , etc

是否可以使用这种网格来评估“my_function_a”或“my_function_b”?

谢谢

【问题讨论】:

【参考方案1】:

如果我理解正确,问题是由my_grid 未完全填充引起的。

head(my_grid)
  input_1 input_2 input_3 final_value
1       0       0       0    1.000000
2       1       1       1    2.381773
3       2       2       2    2.493151
4       3       3       3    2.151128
5       4       4       4    2.589554
6       5       5       5    4.324738

所有三个输入变量同时推进,在三维空间中创建一条线。

也许,您的意思是使用expand.grid() 创建一个三维网格:

n <- 3
my_grid <- expand.grid(i1 = 1:n, i2 = 1:n, i3 = 1:n)
my_grid$final_value = with(my_grid, sin(i1) + cos(i2) + i3)
head(my_grid)
  i1 i2 i3 final_value
1  1  1  1   2.3817733
2  2  1  1   2.4495997
3  3  1  1   1.6814223
4  1  2  1   1.4253241
5  2  2  1   1.4931506
6  3  2  1   0.7249732

现在,剧情

library(plotly)
plot_ly() %>% 
  add_trace(data = my_grid,  x=my_grid$i1, y=my_grid$i2, z=my_grid$i3, type='mesh3d') %>%
  add_surface(
    z = my_grid %>% as.matrix(),
    surfacecolor = my_grid,
    cauto=F,
    cmax=max(my_grid$final_value),
    cmin=min(my_grid$final_value)
  )

变成

【讨论】:

我对绘图代码做了一点改动:plot_ly() %>% add_trace(data = my_grid, x=my_grid$i1, y=my_grid$i2, z=my_grid$final_value, type= 'mesh3d') %>% add_surface( z = my_grid %>% as.matrix(), surfacecolor = my_grid, cauto=F, cmax=max(my_grid$final_value), cmin=min(my_grid$final_value) ) 我还找到了改变网格增量的方法:n @noob 很高兴您自己找到了解决方案! seq(from, to, by) 也是我的建议。

以上是关于R:如何用点“填充”网格的主要内容,如果未能解决你的问题,请参考以下文章

如何用mysql填充gridview?

如何用曲线上的点填充列表?

如何用增加的半径填充圆?

如何用两列 C++ 从文本文件中填充向量

如何用特定值填充列中的一系列单元格?

如何用前导零填充数组?