2015-07-04 3 views
6

Вот это игрушка версия моей проблемыКак построить график контура/графика с тремя векторами?

x = runif(10); 
y = runif(10); 
z = (x+y)*(x-y); 

Я хотел бы, чтобы затем создать Heatmap из г против прогноза (х + у) и (х-у). Проблема состоит в том, что z является вектором и не определяется по всем комбинациям y и x. Обратите внимание: я не ищу ответа, который генерирует z для этих отсутствующих значений, что не является реальностью в реальной версии проблемы. Это минимальная версия для работы. Для всех решений, которые мне удалось найти, таких как filled.contour, нужна матрица для z, заданная по сетке независимых переменных, а не только набор точек данных (x, y, z) без структуры заse ,

ответ

7

Пакет akima имеет то, что вам нужно. Он выполняет двумерную интерполяцию с interp. Он генерирует значения z для отсутствующих комбинаций, но разве вы не можете просто исключить их, если хотите? Если вы не генерируете z-значения, просто зарисуйте 3d-разброс z ~ x * y.

x = runif(10); 
y = runif(10); 
z = (x+y)*(x-y); 

library(akima) 
dens <- interp(x+y, x-y, z, 
       xo=seq(min(x+y), max(x+y), length=100), 
       yo=seq(min(x-y), max(x-y), length=100), 
       duplicate="median") 

filled.contour(dens, xlab="x+y", ylab="x-y", main="z", 
       color.palette = heat.colors) 

enter image description here

Если вы действительно установить на не интерполирования, чтобы добавить к опциям ggplot предоставленных @Frank, существует целый ряд эстетики вы можете использовать, чтобы контрастировать очки третьего измерения.

library(ggplot2) 
dat <- data.frame(x1=x+y, x2=x-y, z=z) 

## Scaling points by z dimension using size, color, and shading 
ggplot(dat, aes(x1, x2, size=z, alpha=z, color=z)) + 
    geom_point() + 
    scale_color_gradient(low="red", high="yellow") + 
    theme_bw() 

enter image description here

5

Здесь есть возможность с ggplot2, где я не генерировать значения для г, когда они "не хватает", в отличие от ответа, используя интерполяцию ..

set.seed(54321) 
x = runif(10) 
y = runif(10) 
z = (x+y)*(x-y) 

ggplot(df, aes(x+y, x-y, fill=z)) + 
    scale_fill_gradient(low = "blue", high = "red") + geom_tile() 

enter image description here

Вы можете заставить/изменить размер плитки и общий вид, используя round или cut:

ggplot(df, aes(round(x+y,1),round(x-y,1), fill=z) 
    scale_fill_gradient(low = "blue", high = "red") + 
    geom_tile() 
# OR 
ggplot(df, aes(cut(x+y, 15), cut(x-y, 15), fill=z)) 
    scale_fill_gradient(low = "blue", high = "red") + 
    geom_tile() + 
    theme(axis.text.x=element_blank(), axis.text.y=element_blank()) 

enter image description hereenter image description here

+1

эти последние ggplots действительно хороший – jenesaisquoi

3

Может быть, самый простой способ для достижения результата, который напоминает то, что я считаю, запрашиваемый выход может состоять в использовании lattice пакет:

set.seed(12358) 
x <- runif(10) 
y <- runif(10) 
z <-(x+y)*(x-y) 
x1<-x+y 
y1<-x-y 
library(lattice) 
df<-data.frame(x=x1,y=y1,z=z) 
levelplot(z~x1*y1,df,cuts=9,col.regions=grey.colors(10)[10:1]) 

enter image description here

Но, по общему признанию, это выглядит не очень красиво. Вероятно, лучшим способом представления данных является интерактивный 3D-диаграмма рассеяния, которая может быть сгенерирована с помощью пакета rgl, как показано ниже.Для этой диаграммы я использовал функцию от «R Graphics Cookbook» Уинстон Чанг рисовать вертикальные синие линии:

library(rgl) 
plot3d(x1,y1,z, size=1,type="s") 
interleave <- function(v1,v2) as.vector(rbind(v1,v2)) 
segments3d(interleave(x1,x1), interleave(y1,y1), interleave(z,0),alpha=0.4,col="blue") 
planes3d(a=0,b=0,c=1,d=0,alpha=0.1) 

enter image description here

Поскольку OP очень ясно, что никакой интерполяции не жаждали говорилось, я воздержусь от публикации простых возможностей для отображения таких непрерывных тепловых карт, хотя я считаю, что для такого типа набора данных обычно имеет смысл интерполировать данные.

Фактически, у меня есть некоторые трудности с пониманием использования тепловой карты (которая, по моему мнению, является 2D-объектом), примененной к бесструктурному множеству отключенных точек.

3

Вот вариант с базовым сюжетом:

x = runif(10); 
y = runif(10); 
z = (x+y)*(x-y); 

n = 5 
zz = cut(z, n) 
cols <- heat.colors(n) 
plot(x, y, col=cols[zz], cex=4, pch=20) 
legend('topright', legend=levels(zz), pch=20, col=cols, pt.cex=3) 
+0

следует отметить, что один должен убедиться, чтобы установить 'метки = false' в разрезанной аргумент (если манипуляция с zz). В противном случае многие функции будут обрабатывать zz как символ типа. В противном случае очень хороший вариант! – MHH

Смежные вопросы