#r #3d #plotly #data-visualization #simulation
#r #3D #сюжетно #визуализация данных #Симуляция
Вопрос:
Я использую язык программирования R. Я следую этому руководству здесь: https://plotly.com/r/3d-line-plots /
Я скопировал и вставил следующий код и успешно создал этот график:
library(plotly)
data <- read.csv('https://raw.githubusercontent.com/plotly/datasets/master/_3d-line-plot.csv')
fig <- plot_ly(data, x = ~x1, y = ~y1, z = ~z1, type = 'scatter3d', mode = 'lines',
line = list(color = '#1f77b4', width = 1))
fig <- fig %>% add_trace(x = ~x2, y = ~y2, z = ~z2,
line = list(color = 'rgb(44, 160, 44)', width = 1))
fig <- fig %>% add_trace(x = ~x3, y = ~y3, z = ~z3,
line = list(color = 'bcbd22', width = 1))
fig
При предварительном просмотре данных, используемых для создания этого 3D-графика, он выглядит следующим образом:
> head(data)
x1 y1 z1 x2 y2 z2
1 -0.01446036 -0.7007406 0.7132696 -0.5876227 0.2779929 -0.7598812
2 0.42072305 -4.2273350 3.1998977 -1.0323807 -0.4265484 -5.4042929
3 0.47195564 -3.3451935 2.0209429 -0.9554478 -3.3332747 -7.1266061
4 -1.59808508 -5.2404711 1.4572559 0.7305834 -2.8338860 -10.2886736
5 -1.16969290 -4.3295068 1.9317851 2.9333971 -1.0720493 -11.5012063
6 0.62887816 -1.7364294 3.2375436 4.2536182 -4.1168275 -13.0858438
x3 y3 z3
1 -0.3666438 0.67189166 -0.6435324
2 1.4686770 -0.28710213 1.1944073
3 1.4915815 2.09425411 1.7574972
4 2.6986862 -0.04325033 -2.0862012
5 2.6568411 0.01913790 -3.1839338
6 -1.5095767 -2.69654294 -0.2990162
> str(data)
'data.frame': 1001 obs. of 9 variables:
$ x1: num -0.0145 0.4207 0.472 -1.5981 -1.1697 ...
$ y1: num -0.701 -4.227 -3.345 -5.24 -4.33 ...
$ z1: num 0.713 3.2 2.021 1.457 1.932 ...
$ x2: num -0.588 -1.032 -0.955 0.731 2.933 ...
$ y2: num 0.278 -0.427 -3.333 -2.834 -1.072 ...
$ z2: num -0.76 -5.4 -7.13 -10.29 -11.5 ...
$ x3: num -0.367 1.469 1.492 2.699 2.657 ...
$ y3: num 0.6719 -0.2871 2.0943 -0.0433 0.0191 ...
$ z3: num -0.644 1.194 1.757 -2.086 -3.184 ...
В качестве учебного упражнения я попытался создать аналогичный набор данных и выполнить ту же процедуру:
x1 = rnorm(1000,10,10)
x2 = rnorm(1000,10,10)
x3 = rnorm(1000,10,10)
y1 = rnorm(1000,10,10)
y2 = rnorm(1000,10,10)
y3 = rnorm(1000,10,10)
z1 = rnorm(1000,10,10)
z2 = rnorm(1000,10,10)
z3 = rnorm(1000,10,10)
data = data.frame(x1,x2,x3,y1,y2,y3,z1,z2,z3)
fig <- plot_ly(data, x = ~x1, y = ~y1, z = ~z1, type = 'scatter3d', mode = 'lines',
line = list(color = '#1f77b4', width = 1))
fig <- fig %>% add_trace(x = ~x2, y = ~y2, z = ~z2,
line = list(color = 'rgb(44, 160, 44)', width = 1))
fig <- fig %>% add_trace(x = ~x3, y = ~y3, z = ~z3,
line = list(color = 'bcbd22', width = 1))
fig
Но график, который получается из этого кода, выглядит совершенно иначе:
Может кто-нибудь, пожалуйста, помочь мне понять, почему два графика отличаются друг от друга и как я могу изменить второй график, чтобы он больше походил на первый график?
Спасибо
Ответ №1:
Проблема в том, что вы ошибочно принимаете случайное распределение за случайное блуждание. Данные, которые вы пытаетесь реплицировать, следуют случайному блужданию.
Для этого давайте создадим функцию, которая генерирует данные случайного блуждания, такие как,
random_walk <- function(n,mean,sd) {
out <- vector()
initial <- rnorm(1,10,10)
out[1] <- initial
for(i in 2:n) {
out[i] <- out[i-1] rnorm(1,mean,sd)
}
return(out)
}
Теперь мы можем создать весь наш набор данных, используя нашу функцию,
x1 <- random_walk(1000,0,1)
x2 <- random_walk(1000,0,1)
x3 <- random_walk(1000,0,1)
y1 <- random_walk(1000,0,1)
y2 <- random_walk(1000,0,1)
y3 <- random_walk(1000,0,1)
z1 <- random_walk(1000,0,1)
z2 <- random_walk(1000,0,1)
z3 <- random_walk(1000,0,1)
data_new = data.frame(x1,x2,x3,y1,y2,y3,z1,z2,z3)
Наконец, мы можем построить его,
fig_new <- plot_ly(data_new, x = ~x1, y = ~y1, z = ~z1, type = 'scatter3d', mode = 'lines',
line = list(color = '#1f77b4', width = 1))
fig_new <- fig_new %>% add_trace(x = ~x2, y = ~y2, z = ~z2,
line = list(color = 'rgb(44, 160, 44)', width = 1))
fig_new <- fig_new %>% add_trace(x = ~x3, y = ~y3, z = ~z3,
line = list(color = 'bcbd22', width = 1))
fig_new
что дает,
Комментарии:
1. Вы можете выполнить случайное блуждание для каждого вектора с
cumsum(rnorm(1000, 0, 10))
помощью .2. На самом деле, теперь, когда я думаю об этом, вы можете сэкономить кучу ввода, выполнив что-то вроде
library(tidyverse); data = paste0(rep(c("x","y","z"), each=3), 1:3) %>% set_names() %>% map_df(~assign(.x, cumsum(rnorm(1000,0,10))))
3. Спасибо за ответ! Не могли бы вы объяснить, почему для построения этого графика должна быть определена функция случайного блуждания? Предположим, у меня есть наблюдения из реальной жизни (например, ежедневный заработок финансовой компании), и я хочу построить такой график. Это все еще возможно? Спасибо!
4. Нет необходимости отображать данные случайного блуждания или какие-либо данные определенного типа. Просто график будет выглядеть по-разному в зависимости от структуры данных. При случайном блуждании местоположение каждой новой точки соотносится с предыдущими точками, поэтому 3D-график формирует «красивые» пути, каждый из которых можно визуализировать и понимать. Тем не менее,
rnorm(1000,10,10)
создает данные, которые могут перемещаться в любом месте от одной точки к другой, делая зигзагообразные движения и создавая сплошной шар точек, который вы нашли при построении своего графика.5. Это может быть легче увидеть в 1 измерении. Попробуйте запустить эти строки кода несколько раз (первая строка предназначена только для того, чтобы оба графика были нарисованы вместе):
par(mfrow=c(1,2)); plot(1:1000, rnorm(1000, 0, 10), type="l"); plot(1:1000, cumsum(rnorm(1000, 0, 10)), type="l")
. Первый график похож на созданные вами случайные данные. Обратите внимание, как точки прыгают вверх и вниз (примерно в пределах 2 стандартных отклонений от нуля) от одной точки к следующей, потому что каждая точка полностью независима от предыдущей. Второй график представляет собой случайное блуждание, где каждая последующая точка близка к предыдущей.