Поверхность с неполной сеткой - PullRequest
0 голосов
/ 09 мая 2018

Я хочу поверхностный график, но моя сетка неполная. Я искал, но безуспешно. Как я могу сделать следующую работу:

x = c(10L, 20L, 30L, 40L, 50L, 60L, 70L, 80L, 90L, 100L, 30L, 40L, 
     50L, 60L, 70L, 80L, 90L, 100L, 50L, 60L, 70L, 80L, 90L, 100L, 
     70L, 80L, 90L, 100L, 90L, 100L)
y = c(10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 20L, 20L, 
     20L, 20L, 20L, 20L, 20L, 20L, 30L, 30L, 30L, 30L, 30L, 30L, 
     40L, 40L, 40L, 40L, 50L, 50L)
z = c(6.093955007, 44.329214443, 149.103755156, 351.517349974, 
     726.51174655, 1191.039562104, 1980.245204702, 2783.308022984, 
     6974.563519067, 5149.396230019, 142.236259009, 321.170609648, 
     684.959503897, 1121.475597135, 1878.334840961, 2683.116309688, 
     4159.60732066, 5294.774284119, 687.430547359, 1119.765405426, 
     1876.57337196, 2685.951176024, 3945.696884503, 5152.986796572, 
     1870.78724464, 2677.744176903, 3951.928931107, 5160.295960254, 
     3957.503273558, 5147.237754092)

# OK but not a surface plot
scatterplot3d::scatterplot3d(x, y, z,
  color = "blue", pch = 19, 
  type = "h",
  main = "",
  xlab = "x",
  ylab = "y",
  zlab = "z",
  angle = 35,
  grid = FALSE)

# Not working:
M <- plot3D::mesh(x, y, z)
R <- with (M, sqrt(x^2 + y^2 +z^2))
p <- sin(2*R)/(R+1e-3)
plot3D::slice3D(x, y, z, colvar = p,
        xs = 0, ys = c(-4, 0, 4), zs = NULL)
plot3D::isosurf3D(x, y, z, colvar = p, level = 0, col = "red")

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Для такого рода проблем я могу порекомендовать пакет deldir, который выполняет «триангуляцию Делоне и тесселяция Дирихле».Из этого вы рассчитываете пространственные треугольники, которые дают поверхностный график.

rgl-пакет дает возможность добавить треугольники на график рассеяния.И даже лучше - результирующий сюжет анимирован, поэтому вы можете вращать и масштабировать для лучшего обзора.

x = c(10L, 20L, 30L, 40L, 50L, 60L, 70L, 80L, 90L, 100L, 30L, 40L, 
  50L, 60L, 70L, 80L, 90L, 100L, 50L, 60L, 70L, 80L, 90L, 100L, 
  70L, 80L, 90L, 100L, 90L, 100L)
y = c(10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 20L, 20L, 
  20L, 20L, 20L, 20L, 20L, 20L, 30L, 30L, 30L, 30L, 30L, 30L, 
  40L, 40L, 40L, 40L, 50L, 50L)
z = c(6.093955007, 44.329214443, 149.103755156, 351.517349974, 
  726.51174655, 1191.039562104, 1980.245204702, 2783.308022984, 
  6974.563519067, 5149.396230019, 142.236259009, 321.170609648, 
  684.959503897, 1121.475597135, 1878.334840961, 2683.116309688, 
  4159.60732066, 5294.774284119, 687.430547359, 1119.765405426, 
  1876.57337196, 2685.951176024, 3945.696884503, 5152.986796572, 
  1870.78724464, 2677.744176903, 3951.928931107, 5160.295960254, 
  3957.503273558, 5147.237754092)

# create spacial triangles
 del <- deldir::deldir(x, y, z = z)
 triangs <- do.call(rbind, triang.list(del))
# create plot 
 rgl::plot3d(x, y, z, size = 5, xlab = "my_x", ylab = "my_y", zlab = "my_z", col = "red")
 rgl::triangles3d(triangs[, c("x", "y", "z")], col = "gray")

enter image description here

Надеюсь, это поможет.

0 голосов
/ 09 мая 2018

Это скорее подсказка, чем полный ответ:

library(plotly)
plot_ly(z = ~volcano) %>% add_surface()

- хороший способ для создания таких графиков. Итак, для вашего примера:

x <- c(10L, 20L, 30L, 40L, 50L, 60L, 70L, 80L, 90L, 100L, 30L, 40L, 
  50L, 60L, 70L, 80L, 90L, 100L, 50L, 60L, 70L, 80L, 90L, 100L, 
  70L, 80L, 90L, 100L, 90L, 100L)
y <- c(10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 20L, 20L, 
  20L, 20L, 20L, 20L, 20L, 20L, 30L, 30L, 30L, 30L, 30L, 30L, 
  40L, 40L, 40L, 40L, 50L, 50L)
z <- c(6.093955007, 44.329214443, 149.103755156, 351.517349974, 
  726.51174655, 1191.039562104, 1980.245204702, 2783.308022984, 
  6974.563519067, 5149.396230019, 142.236259009, 321.170609648, 
  684.959503897, 1121.475597135, 1878.334840961, 2683.116309688, 
  4159.60732066, 5294.774284119, 687.430547359, 1119.765405426, 
  1876.57337196, 2685.951176024, 3945.696884503, 5152.986796572, 
  1870.78724464, 2677.744176903, 3951.928931107, 5160.295960254, 
  3957.503273558, 5147.237754092)

library(plotly)
m <- matrix(c(x,y,z), nrow = 3)
plot_ly(z = ~m) %>% add_surface()

производит

enter image description here

.. это первый шаг, но все еще есть некоторые проблемы с масштабированием оси x. Я думаю, что ключом к решению является установка всей (разреженной) матрицы и затем ее построение.

x <- c(10L, 20L, 30L, 40L, 50L, 60L, 70L, 80L, 90L, 100L, 30L, 40L, 
       50L, 60L, 70L, 80L, 90L, 100L, 50L, 60L, 70L, 80L, 90L, 100L, 
       70L, 80L, 90L, 100L, 90L, 100L)
y <- c(10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 20L, 20L, 
       20L, 20L, 20L, 20L, 20L, 20L, 30L, 30L, 30L, 30L, 30L, 30L, 
       40L, 40L, 40L, 40L, 50L, 50L)
z <- c(6.093955007, 44.329214443, 149.103755156, 351.517349974, 
       726.51174655, 1191.039562104, 1980.245204702, 2783.308022984, 
       6974.563519067, 5149.396230019, 142.236259009, 321.170609648, 
       684.959503897, 1121.475597135, 1878.334840961, 2683.116309688, 
       4159.60732066, 5294.774284119, 687.430547359, 1119.765405426, 
       1876.57337196, 2685.951176024, 3945.696884503, 5152.986796572, 
       1870.78724464, 2677.744176903, 3951.928931107, 5160.295960254, 
       3957.503273558, 5147.237754092)

xx <- 1:100L
yy <- 1:100L
zz <- matrix(0, nrow = 100, ncol = 100)

for (i in 1:length(x)){
  zz[x[i], y[i]] <- z[i]
}

library(plotly)
plot_ly(z = ~zz) %>% add_surface()

производит

enter image description here

, что в основном соответствует вашим данным ..

Надеюсь, я смогу это понять. И надеюсь, это поможет.

...