четверг, 6 июля 2017 г.

Трехмерные графики в R с помощью функции surf3D

В R есть очень мощный пакет для работы с 3D-графикой. Сначала я пробовал persp и wireframe, однако они оказались очень сложными, особенно при работе со сложными математическими функциями. Поэтому с трехмерной графикой я работал в Wolfram Mathematica, пока я не узнал о пакете plot3D (от Karline Soetaert). Он позволяет моментально строить трехмерные графики с помощью функции surf3D.
Например, рассмотрим график поверхности раковины моллюска, которая задается параметрическими уравнениями:


x(u,v) = (1.16 v )(1+cos (u))cos (v);
y (u,v)=(−1.16 v )(1+cos (u))sin (v);
z (u,v)=(−2×1.16 v )(1+sin (u));
где u∈[0,2π ],v∈[−15,6].

Код, строящий график с анимацией в R:
library(plot3D)
library(animation)

saveGIF({
 par( mai = c( 0.1, 0.1, 0.1, 0.1))
 for( i in 1 : 100){
   X <- 0="" 2="" length.out="100)</span" pi="" seq="">
   Y <- -="" 15="" 6="" length.out="100)</span" seq="">
   M <- mesh="" span="" x="" y="">
   u <- m="" span="" x="">
   v <- m="" span="" y="">
   
   # x, y and z grids
   x <- 1.16="" 1="" cos="" span="" u="" v="">
   y <- -="" 1.16="" 1="" cos="" sin="" span="" u="" v="">
   z <- -="" 1.16="" 1="" 2="" sin="" span="" u="" v="">
   
   # full colored image
   surf3D( x, y, z, colvar = z,
           col = ramp.col( col = c( "red", "red", "orange"), n = 100),
           colkey = FALSE, shade = 0.5, expand = 1.2, box = FALSE,
           phi = 35, theta = i, lighting = TRUE, ltheta = 560,
           lphi = - i)
 }
}, interval = 0.1, ani.width = 550, ani.height = 350)

animation.gif

Теперь построим бутылку Клейна в виде восьмерки

x(u,v) = [a+cos(1/2)sin (v)−sin(1/2))sin(2v)]cos (u);
y (u,v) = [a+cos(1/2)sin (v)−sin(1/2)sin (2v)]sin (u);
z (u,v) = sin((1/2) u)sin (v)+cos((1/2)u)sin(2v).
Для u∈[0,2π ),v∈[0,2π ),  и  a>2 .

Код R:
 
saveGIF({
 par( mai = c( 0.1, 0.1, 0.1, 0.1))
 for( i in 1 : 100){
   X <- 0="" 2="" length.out="100)</span" pi="" seq="">
   Y <- 0="" 2="" length.out="100)</span" pi="" seq="">
   M <- mesh="" span="" x="" y="">
   u <- m="" span="" x="">
   v <- m="" span="" y="">
   
   # x, y and z grids
   x <- -="" 2="" 3="" cos="" sin="" span="" u="" v="">
   y <- -="" 2="" 3="" cos="" sin="" span="" u="" v="">
   z <- 2="" cos="" sin="" span="" u="" v="">
   
   # full colored image
   surf3D( x, y, z, colvar = z,
           col = ramp.col( col = c( "darkred", "orange"), n = 100),
           colkey = FALSE, shade = 0.5, expand = 0.5, box = FALSE,
           phi = 40, theta = i, lighting = TRUE, ltheta = 560,
           lphi = - 50)
 }
}, interval = 0.1, ani.width = 550, ani.height = 350)

animation2.gif

Теперь давайте рассмотрим подробнее скрипт для построения для этой статичной прозрачной раковины моллюска:

Rplot.png
1 library( plot3D)
2
3 X <- 0="" 2="" length.out="50)</span" pi="" seq="">
4 Y <- -="" 15="" 6="" length.out="50)</span" seq="">
5 M <- mesh="" span="" x="" y="">
6 u <- m="" span="" x="">
7 v <- m="" span="" y="">
8
9 # x, y and z grids
10 x <- 1.16="" 1="" cos="" span="" u="" v="">
11 y <- -="" 1.16="" 1="" cos="" sin="" span="" u="" v="">
12 z <- -="" 1.16="" 1="" 2="" sin="" span="" u="" v="">
13
14 # full colored image
15 par( mai = c( 0.01, 0.01, 0.01, 0.01))
16 surf3D( x, y, z, colvar = z,
17       col = ramp.col( col = c( "violet", "pink"), n = 100),
18       colkey = FALSE, shade = 0.5, alpha = 0.3, expand = 1.2,
19       box = FALSE, phi = 35, border = "black", theta = 70,
20       lighting = TRUE, ltheta = 560, lphi = - 50)

1.  Загружаем пакет в первой строке.Call the package, that's obviously the first line;
2. Строки 3 - 7. Присваиваем значения диапазона переменных u и v.
3. Строки 10 - 12. Задаем параметрические уравнения фигуры.
4. Строка 15. Задаем размеры графика в дюймах.
5. Строка 16. Генерируем график.

Источник

Комментариев нет:

Отправить комментарий