2013-01-17 43 views
6

Tôi muốn tạo một đường bao của biến z với dữ liệu x, y, z. Tuy nhiên, có vẻ như chúng tôi cần cung cấp dữ liệu theo thứ tự tăng dần.Có thể tạo một ô đường viền 3D không có dữ liệu liên tục trong R không?

Tôi đã cố gắng sử dụng một số mã nhưng nó đã cho tôi lỗi.

Tôi đã thử các mã sau: Trial 1:

age2100 <- read.table("temp.csv",header=TRUE,sep=",") 

x <- age2100$x 
y <- age2100$y 
z <- age2100$z 

contour(x,y,z,add=TRUE,col="black") 

Tôi đã nhận lỗi sau

Error in contour.default(x, y, z, add = TRUE, col = "black") : increasing 'x' and 'y' values expected 

sau đó tôi cố gắng sử dụng ggplot2 để tạo ra các đường viền. Tôi sử dụng đoạn mã sau:

library("ggplot2") 
library("MASS") 
library("rgdal") 
library("gpclib") 
library("maptools") 
age2100 <- read.table("temp.csv",header=TRUE,sep=",") 
v <- ggplot(age2100, aes(age2100$x, age2100$y,z=age2100$z))+geom_contour() 
v 

Tôi đã nhận lỗi sau đây: Thông điệp

Cảnh báo:

Not possible to generate contour data 

hãy tìm các dữ liệu về vị trí sau https://www.dropbox.com/s/mg2bo4rcr6n3dks/temp.csv

Ai có thể cho tôi biết làm thế nào để tạo ra các dữ liệu đường viền từ biến thứ ba (z) từ temp.csv? Tôi cần phải làm như vậy nhiều lần vì vậy tôi đang cố gắng làm trên R thay vì Arcgis.

+0

Chỉ cần một shot dài, bạn đã thử 'age2100 <- age2100 [với (age2100, trật tự (x, y)),] ' –

+0

@ sebantian-c tôi chỉ sử dụng gợi ý của bạn. Tôi đã kiểm tra dữ liệu và nó được sắp xếp nhưng tôi vẫn không thể lấy được đồ thị. Sau đó tôi đã thử cả hai phương pháp được mô tả ở trên. Tôi vẫn gặp lỗi tương tự. –

+0

Tôi tin rằng bạn cần một ma trận đầy đủ - bạn có thể nội suy một với dữ liệu xyz của bạn bằng cách sử dụng 'interp'function của gói' akima'. –

Trả lời

8

Dưới đây là một ví dụ về cách một nội suy sử dụng interp từ akima gói:

age2100 <- read.table("temp.csv",header=TRUE,sep=",") 

x <- age2100$x 
y <- age2100$y 
z <- age2100$z 

require(akima) 

fld <- interp(x,y,z) 

par(mar=c(5,5,1,1)) 
filled.contour(fld) 

enter image description here

Dưới đây là một âm mưu thay thế bằng cách sử dụng image chức năng (điều này cho phép một số linh hoạt để thêm âm mưu cấp dưới chức năng (yêu cầu hàm image.scale, được tìm thấy here):

source("image.scale.R") # http://menugget.blogspot.de/2011/08/adding-scale-to-image-plot.html 

x11(width=5, height=6) 
layout(matrix(c(1,2), nrow=1, ncol=2), widths=c(4,1), height=6, respect=TRUE) 
layout.show(2) 

par(mar=c(4,4,1,1)) 
image(fld) 
contour(fld, add=TRUE) 
points(age2100$x,age2100$y, pch=".", cex=2) 

par(mar=c(4,0,1,4)) 
image.scale(fld$z, xlab="", ylab="", xaxt="n", yaxt="n", horiz=FALSE) 
box() 
axis(4) 
mtext("text", side=4, line=2.5) 

enter image description here

+0

Marc trong hộp, Cảm ơn bạn rất nhiều vì giải pháp của bạn. Cốt truyện trông rất đẹp. Tôi có một câu hỏi. Khi tôi thêm các điểm trên lô trên, có vẻ như các điểm này hơi lệch khỏi các đường bao được tạo ra. Tôi có thể sai. Có thể thêm các điểm vào ô trên? Tôi đã sử dụng đoạn mã sau sau các điểm cốt truyện (age2100 $ x, age2100 $ y, pch = 0). Có thể hiển thị các dòng cũng trong cốt truyện? Cũng giống như chỉ định khoảng đường bao và sau đó hiển thị các đường thẳng. –

+0

Có, chức năng mạng 'filled.contour' (và các chức năng khác) chia vùng thiết bị, và do đó bạn không thể trực tiếp thêm các ô mức thấp hơn vào cốt truyện. Nó không đẹp, nhưng tôi đã thêm một vài dòng để giúp bạn với những bổ sung này. Tôi liên tục sử dụng chức năng của riêng mình để thêm thang màu cho chính xác lý do này mà bạn đề cập đến. –

+0

Cảm ơn bạn rất nhiều vì đã chỉnh sửa mã. Tôi đã chỉ tự hỏi liệu có thể thêm một shapefile và sau đó clip phần dữ liệu đường viền và sau đó chỉ hiển thị đường viền trong shapefile?Bạn có thể cho tôi một số gợi ý về cách thức đó có thể đạt được không? –

Các vấn đề liên quan