2016-03-17 49 views
5

मैं विशिष्ट समुद्री ढांचे के चारों ओर व्हेल के वितरण के पैटर्न का अध्ययन कर रहा हूं।एक 3 डी प्लॉट में मिक्सिंग सतह और स्कैटरप्लॉट

  1. बेथीमेट्री एक सतह के रूप में (x = देशांतर, y = अक्षांश, z = गहराई), और
  2. भौगोलिक स्थिति: मैं एक इंटरैक्टिव 3 डी साजिश एक ही समय में दिखा बनाने के लिए कोशिश कर रहा हूँ व्हेल समूह (x = देशांतर, y = अक्षांश, z = उदाहरण के लिए निश्चित गहराई -30 मीटर)।

समन्वय एक यूटीएम समन्वय प्रणाली में पेश किए जाते हैं।

मैं आमतौर पर आंकड़ों के उत्पादन के लिए आर और ggplot2 पैकेज के साथ काम करता हूं। यहां, plotly पैकेज एक अच्छा विकल्प की तरह लग रहा था।

मैंने बाथमेट्री रास्टर bathy_ras और अंक 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) प्लॉटली पैकेज का उपयोग करके रुस्तुडियो में साजिश बनाना।

#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 वेबसाइट से पूरी तरह साजिश बना रहा है। सबसे पहले मैं (एक्स, वाई) एक मैट्रिक्स निर्देशांक के सभी बिंदुओं से युक्त और गहराई z

#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 ... 

में रेखापुंज "bathy_ras" परिवर्तित मैं एक plotly खाता बनाया था। मैंने अपने साजिश खाते में .txt फ़ाइलों के रूप में दो डेटाफ्रेम आयात किए: bathy_df और points

यह साजिश खाते में दो ग्रिड बनाता है। मैं इन दो डेटा के लिए आसानी से दो अलग-अलग 3 डी प्लॉट लिख सकता हूं। फ्रेम: एक सतह की साजिश है (नीचे दिखाया गया है), दूसरा स्कैटरप्लॉट है। मैंने इस ट्यूटोरियल (http://help.plot.ly/update-a-graphs-data/) के बाद एक नए ट्रेस के रूप में सतही साजिश में स्कैटरप्लॉट को शामिल करने का प्रयास किया लेकिन स्कैटरप्लॉट 3 डी में होने पर "डालने" विकल्प को अनुपलब्ध लगता है। surface plot produced from the plotly web interface

क्या scatter3D और plotly में एक सतह साजिश को जोड़ना संभव है?

nb: मैं points() साथ combinaison में raster::persp कोशिश की, लेकिन मैं बहुत सतह साजिश है, जिसके कारण मैं plotly और/या ggplot2 के साथ ऐसा करना पसंद करेंगे के सामान्य सौंदर्य से संतुष्ट नहीं हूं।

उत्तर

7

मुझे विश्वास है कि आप क्या कर रहे हैं ठीक काम करना चाहिए। मुझे लगता है कि इसे आपके एक्स और वाई निर्देशांक के साथ करना पड़ सकता है।सतह प्लॉट 1:ncol(bathy_matrix) का उपयोग x-axis और 1:row(bathy_matrix) के रूप में वाई अक्ष बिंदुओं के रूप में कर रहा है (यदि आप करेंगे तो टिकटें)।

आपके अंक को सतह की साजिश में दिखाने के लिए उस श्रेणी में एक्स और वाई निर्देशांक की आवश्यकता होगी। नीचे एक साधारण उदाहरण है।

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, यह वास्तव में बहुत उपयोगी था। मेरे अंक के निर्देशांक मेरे मैट्रिक्स की सीमा में नहीं थे, यही कारण है कि वे साजिश पर दिखाई नहीं दे रहे थे। मुझे इन निर्देशांकों को शुरू करना पड़ा (शुरुआत में यूटीएम लैट/लांग, 'एक्सेंज = [755100: 838800] ',' यरेंज = [- 2612000, -2525000] ') मेरे मैट्रिक्स के आकार में (' Xrange = [1: ncol (bathy_matrix)] ',' yrange = [1: nrow (bathy_matrix)] ') plot_ly का उपयोग करने से पहले और फिर यह काम किया। –

संबंधित मुद्दे