2014-11-17 2 views
1

Я пытаюсь построить участок поверхности в R данных с осями x и y с сеткой. По оси х изменяется от 1 до 8, в то время как ось ординат изменяется от -4 до 4.Как рисовать поверхностный график в R с произвольными данными, т. Е. Не функция x и y

Ниже приведены данные для участка:

-4 -3 -2 -1 0 1 2 3 4 
1 159 144 133 132 138 123 80 28 -22 
2 153 135 121 122 160 162 110 50 -7 
3 148 126 107 104 161 190 135 67 3 
4 145 120 96 92 161 202 149 77 8 
5 144 117 92 89 161 205 153 80 10 
6 145 120 96 92 161 202 149 77 8 
7 148 126 107 104 161 190 135 67 3 
8 153 135 121 122 160 162 110 50 -7 
9 159 144 133 132 138 123 80 28 -22 

Любая помощь будет высоко оценена.

+0

Пожалуйста, сделайте свой [вопрос воспроизводимым] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Также покажите, что вы пробовали до сих пор. –

+1

Когда люди улучшают ваше сообщение, правильно форматируя код и исправляя опечатки, не заменяйте его исходным контентом. – jbaums

+1

Большое спасибо за улучшение. Я пытался сделать данные такими, но не смог. Так что это был очень приятный жест от вас @ jbaums! Благодаря! –

ответ

4

Либо latticeExtra::wireframe, либо rgl::persp3d может отображать трехмерные поверхностные графики.

z <- as.matrix(read.table(text='-4 -3 -2 -1 0 1 2 3 4 
1 159 144 133 132 138 123 80 28 -22 
2 153 135 121 122 160 162 110 50 -7 
3 148 126 107 104 161 190 135 67 3 
4 145 120 96 92 161 202 149 77 8 
5 144 117 92 89 161 205 153 80 10 
6 145 120 96 92 161 202 149 77 8 
7 148 126 107 104 161 190 135 67 3 
8 153 135 121 122 160 162 110 50 -7 
9 159 144 133 132 138 123 80 28 -22', header=TRUE, check.names=FALSE)) 

Во-первых, с latticeExtra:

library(latticeExtra) 
wireframe(z, scales=list(arrows=FALSE), xlab='x', ylab='y', drape=TRUE, 
      col.regions=terrain.colors(10), at=seq(min(z), max(z), len=11)) 

enter image description here

См ?wireframe подробную информацию о том, как определить угол обзора.

В качестве альтернативы persp3d из пакета rgl может создавать 3D-поверхности, которые можно поворачивать/увеличивать с помощью мыши.

library(rgl) 
persp3d(1:9, -4:4, z, col = "lightblue", xlab='x', ylab='y') 

Вы могли бы также рассмотреть Heatmap/levelplot для этого:

lattice::levelplot(z, col.regions=terrain.colors, xlab='x', ylab='y', 
      scales=list(tck=1:0)) 

enter image description here


EDIT

Вы можете использовать akima интерполировать данные, если хотите увеличить а также разрешение сюжетов.

Например:

library(akima) 

xyz <- transform(expand.grid(x=as.numeric(rownames(z)), 
          y=as.numeric(colnames(z))), z=c(z)) 

z_interp <- interp(xyz$x, xyz$y, xyz$z) 

xyz_interp <- transform(expand.grid(x=z_interp$x, y=z_interp$y), z=c(z_interp$z)) 

wireframe(z ~ x * y, data=xyz_interp, scales=list(arrows=FALSE), 
      drape=TRUE, col.regions=terrain.colors(10), 
      at=seq(min(xyz_interp$z), max(xyz_interp$z), len=11)) 

enter image description here

управления интерполированное разрешение с аргументами xo и yo к interp.

+0

Спасибо тонну! Мне нравится идея карты тепла так же хорошо! Но резолюция кажется слишком бедной, из-за моих данных, я думаю. Даже поверхностный участок не выглядит эстетически отличным из-за отсутствия более тонких значений. Есть ли способ обойти эту проблему и создать более непрерывный перспективный сюжет? –

+0

@Prasannadahal - см. Мое редактирование для метода интерполяции. – jbaums

+0

Большое спасибо @jbaums! Спас мой день! –