2013-01-17 13 views
6

Voglio creare un contorno della variabile z con i dati x, y, z. Tuttavia, sembra che dobbiamo fornire i dati in ordine crescente.È possibile creare un grafico di contorno 3d senza dati continui in R?

Ho provato ad utilizzare del codice ma mi ha dato l'errore.

ho provato il seguente codice: Prova 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") 

ho ottenuto il seguente errore

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

poi ho cercato di usare ggplot2 per creare il contorno. Ho usato il seguente codice:

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 

ho ottenuto il seguente errore: messaggio

Attenzione:

Not possible to generate contour data 

Si prega di trovare i dati sul seguente percorso https://www.dropbox.com/s/mg2bo4rcr6n3dks/temp.csv

Qualcuno può dirmi come creare i dati di contorno dalla terza variabile (z) da temp.csv? Ho bisogno di farlo tutte queste volte quindi sto cercando di fare su R invece che su Arcgis.

+0

Basta un colpo lungo, hai provato 'age2100 <- age2100 [con (age2100, ordine (x, y)),]' –

+0

@ sebantian-c ho appena usato il tuo suggerimento. Ho controllato i dati e sono ordinati ma ancora non riesco a ottenere il grafico. Ho quindi provato entrambi i metodi sopra descritti. Ho ancora lo stesso errore. –

+0

Credo che tu abbia bisogno di una matrice completa - puoi interpolarne una con i tuoi dati xyz usando la funzione 'interp' del pacchetto' akima'. –

risposta

8

Ecco un esempio di come si interpola con interp dal pacchetto akima:

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

Ecco una trama alternativa utilizzando la funzione image (ciò consente una certa flessibilità per l'aggiunta inferiore plotting livello funzioni (richiede la funzione image.scale, trovata 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 nella scatola, grazie mille per la soluzione. La trama è molto bella. Ho una domanda. Quando aggiungo i punti sulla trama sopra sembra che i punti siano leggermente fuori dalle linee di contorno che vengono create. Potrei sbagliarmi. È possibile aggiungere i punti nella trama sopra? Ho usato il seguente codice dopo i punti della trama (age2100 $ x, age2100 $ y, pch = 0). È possibile mostrare le linee anche nella trama? Proprio come assegnare l'intervallo del contorno e poi mostrare le linee. –

+0

Sì, la funzione reticolo 'filled.contour' (e altri) divide la regione del dispositivo, quindi non è possibile aggiungere direttamente grafici di livello inferiore solo al grafico. Non è carino, ma ho aggiunto alcune righe per aiutarti con queste aggiunte. Uso costantemente la mia funzione per aggiungere la scala di colori proprio per questo motivo che menzioni. –

+0

Grazie mille per aver modificato il codice. Mi stavo chiedendo se è possibile aggiungere uno shapefile e quindi ritagliare la parte dei dati di contorno e quindi mostrare solo il contorno all'interno dello shapefile?Puoi darmi qualche suggerimento su come si può ottenere? –

Problemi correlati