Построение последовательного ряда (например, концентрация, время) кривой в 3d rstudio - PullRequest
1 голос
/ 06 ноября 2019

Я запускаю сэмплы на машине, где мой вывод представляет собой график безразмерного коэффициента y против скорости x. Я изменяю концентрацию данного соединения, чтобы понять, как меняется кривая в зависимости от концентрации z. Есть ли пакет, который может строить трехмерные графики данных, настроенных таким образом, то есть как серии?

Я считаю, что обычно используемые пакеты для трехмерных графиков в rstudio (lattice, scatterplot3d, rgl и т. Д.) Только кажутсяработать, когда переменные равны по размеру векторам (т.е. каждая точка представляет собой один образец):

common example x,y,z data setup

Мои данные выглядят больше так, где каждый «срез», так сказать, на оси zпредставляет один образец:

example series data

Я могу довольно легко построить его в Excel, используя поверхностные графики, но графики там дерьмовые, некрасивые и негибкие.

Лучший пример графика, к которому я стремлюсь, таков:

nytimes sample 3d plot

Источник: https://www.nytimes.com/interactive/2015/03/19/upshot/3d-yield-curve-economic-growth.html?ref=economy&abt=0002&abg=0

Ниже приведен пример моих данных. Первый столбец содержит значения x (скорость), первый ряд содержит значения z (концентрация), все остальное - значения y (произвольный безразмерный коэффициент). Поэтому первая ячейка (0) не является частью данных.

structure(list(...1 = c(0, 1.17721e-08, 1.48056166666667e-08, 
1.86639666666667e-08, 2.35371333333333e-08, 2.96521333333333e-08
), ...2 = c(0.3, 0.000326036, 0.000789132, 0.00132642, 0.00196508, 
0.00272198), ...3 = c(3, 0.00038811, 0.000915256, 0.00152748, 
0.00224812, 0.00311174), ...4 = c(6, 0.000289036, 0.000692406, 
0.00115582, 0.00169984, 0.00234574), ...5 = c(15, 0.000266082, 
0.000647076, 0.00109054, 0.00161336, 0.00224112), ...6 = c(30, 
0.000361498, 0.000818448, 0.00134682, 0.00196732, 0.00271138), 
...7 = c(100, 0.000296934, 0.000714832, 0.0012111, 0.0018063, 
0.0025273)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

Я сохранил 'dput ()' как 'example.data' и запустил следующее, чтобы получить это сообщение об ошибке:

#Store x and y as vectors, z as matrix 
> x <- c(example.data[-1,1])
> y <- c(example.data[1,-1])
> z <- as.matrix(example.data[-1,-1], nrow = 5, ncol = 6)
> persp3d(x, z, y)
Error in rgl.surface(x = NULL, y = list(...2 = 0.3, ...3 = 3, ...4 = 6,  : 
'y' length != 'x' rows * 'z' cols

Что я здесь не так делаю? x и y имеют одинаковое количество строк и столбцов соответственно матрице z

1 Ответ

0 голосов
/ 11 ноября 2019

Использование данных примера:

dat <- structure(list(...1 = c(0, 1.17721e-08, 1.48056166666667e-08, 
1.86639666666667e-08, 2.35371333333333e-08, 2.96521333333333e-08
), ...2 = c(0.3, 0.000326036, 0.000789132, 0.00132642, 0.00196508, 
0.00272198), ...3 = c(3, 0.00038811, 0.000915256, 0.00152748, 
0.00224812, 0.00311174), ...4 = c(6, 0.000289036, 0.000692406, 
0.00115582, 0.00169984, 0.00234574), ...5 = c(15, 0.000266082, 
0.000647076, 0.00109054, 0.00161336, 0.00224112), ...6 = c(30, 
0.000361498, 0.000818448, 0.00134682, 0.00196732, 0.00271138), 
...7 = c(100, 0.000296934, 0.000714832, 0.0012111, 0.0018063, 
0.0025273)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

Обычно лучше хранить данные как matrix, и для этого * x, y и z разделяются. Ваше первоначальное подмножество работало бы, за исключением того, что tibble преднамеренно сохраняет его frame -подобной вещью, в отличие от "обычного" data.frame единственного подмножества столбцов / строк и его потребности в dat[...,drop=FALSE], чтобы избежать преобразования класса.

x <- dat[-1,1][[1]]
y <- as.numeric(dat[1,-1])
z <- as.matrix(dat[-1,-1])
rgl::persp3d(x,y,z)

3d plot

Вы также могли бы преобразовать в matrix сначала , затемвы бы здесь не подвергались защите tibble.

dat <- as.matrix(dat)
x <- dat[-1,1]
y <- dat[1,-1]
z <- dat[-1,-1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...