2016-03-17 2 views
5

Я изучаю образцы распределения китов вокруг конкретных структур морского дна. Я пытаюсь создать интерактивный 3D сюжет показывая в то же время:Смешивание поверхности и диаграммы рассеяния в одном 3D-графике

  1. батиметрия как поверхность (x = долгота, y = широта, z = глубина), и
  2. географическое расположение групп китов (x = долгота, y = широта, z = фиксированная глубина -30 метров, например).

Координаты проецируются в систему координат UTM.

Я обычно работаю с R и ggplot2 пакет для изготовления фигур. Здесь пакет plotly казался хорошим вариантом.

Я начал с батиметрического растра bathy_ras и data.frame точек points.

> bathy_ras 
class  : RasterLayer 
dimensions : 784, 821, 643664 (nrow, ncol, ncell) 
resolution : 102, 111 (x, y) 
extent  : 755070, 838812, -2612148, -2525124 (xmin, xmax, ymin, ymax) 
coord. ref. : +proj=utm +zone=58S +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
data source : in memory 
names  : bathymetry 
values  : -1949.42, -34.27859 (min, max) 
> str(points) 
'data.frame': 214 obs. of 3 variables: 
$ x: num 774264 777293 775476 773430 773284 ... 
$ y: num -2534165 -2533556 -2531012 -2532904 -2533695 ... 
$ z: num -30 -30 -30 -30 -30 -30 -30 -30 -30 -30 ... 

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

1) Создание участка в Rstudio с использованием сюжетного пакета.

#convert raster into a matrix of bathymetry values 
bathy_matrix <- as.matrix(bathy_ras) 
> str(bathy_matrix) 
    num [1:784, 1:821] -362 -365 -367 -369 -371 ... 

#create interactive plot 
p <- plot_ly(z=bathy_matrix, type="surface",showscale=FALSE) 
#this works fine, it get a 3D interactive surface plot of the seabed 

#but if I try to add the "points" layer it doesn't show on the plot 
p <- plot_ly(z=bathy_matrix, type="surface",showscale=FALSE) %>% 
    add_trace(x = gp_seamounts_df$utmx, y = gp_seamounts_df$utmy, z = gp_seamounts_df$z, type = "scatter3d", mode = "markers", showscale=FALSE, opacity=0.98) 

2) Создание сюжет полностью из plotly сайта. Сначала я преобразовал растровые «bathy_ras» в матрицу, содержащую все точки координат (х, у) и глубины г

#convert raster into a dataframe 
bathy_df <- as.data.frame(coordinates(bathy_ras)) 
bathy_df$z <- values(bathy_ras) 
> str(bathy_df) 
'data.frame': 643664 obs. of 3 variables: 
$ x: num 755121 755223 755325 755427 755529 ... 
$ y: num -2525179 -2525179 -2525179 -2525179 -2525179 ... 
$ z: num -362 -361 -360 -359 -358 ... 

Я создал plotly счет. Я импортировал два фрейма данных в виде .txt-файлов в моей учетной записи: bathy_df и points.

Это создает две сетки на графике. Я могу легко написать два отдельных 3D-графика для этих двух data.frames: один - график поверхности (показан ниже), другой - диаграмма рассеяния. Я попытался включить диаграмму рассеяния в поверхностный график в качестве новой трассы после этого урока (http://help.plot.ly/update-a-graphs-data/), но опция «вставить в» просто кажется недоступной, если диаграмма рассеяния находится в 3D. surface plot produced from the plotly web interface

Возможно ли комбинировать scatter3D и поверхностный участок в plotly?

пь: Я пытался raster::persp в combinaison с points(), но я не очень доволен общей эстетикой поверхности участка, поэтому я предпочел бы сделать это с помощью plotly и/или ggplot2.

ответ

7

Я считаю, что то, что вы делаете, должно работать нормально. Я думаю, что это может иметь отношение к вашим координатам x и y.Поверхность поверхности использует 1:ncol(bathy_matrix) в качестве оси x и 1:row(bathy_matrix) как точки оси y (галочки, если хотите).

Ваш пунктов должен будет иметь координаты x и y в этом диапазоне, чтобы они отображались на поверхности. Ниже приведен простой пример.

set.seed(123) 

x = sample(1:ncol(volcano), size = 50) 
y = sample(1:nrow(volcano), size = 50) 

z = c() 

for(i in 1:50) {z <- c(z, volcano[y[i], x[i]])} 

df <- data.frame(x, y, z) 

plot_ly(z = volcano, type = "surface") %>% 
    add_trace(data = df, x = x, y = y, z = z, mode = "markers", type = "scatter3d", 
      marker = list(size = 5, color = "red", symbol = 104)) 

я получаю это:

enter image description here

Надеется, что это помогает ...

+1

Благодаря alistaire, это было очень полезно на самом деле. Координаты моих очков не были в диапазоне моей матрицы, поэтому они не появлялись на сюжете. Мне пришлось перемасштабировать эти координаты (сначала в UTM lat/long, 'Xrange = [755100: 838800]', 'Yrange = [- 2612000, -2525000]') до размера моей матрицы ('Xrange = [1: ncol (bathy_matrix)] ',' Yrange = [1: nrow (bathy_matrix)] ') перед использованием plot_ly, а затем он сработал. –