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:如何用点“填充”网格的主要内容,如果未能解决你的问题,请参考以下文章