2015-07-04 62 views
6

這裏是我的問題如何用3個矢量繪製輪廓/熱圖圖?

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

我想,然後產生Z-與(X + Y)和(X-Y)的熱圖的玩具版本。問題是z是一個向量,並沒有在y和x的所有組合上定義。 請注意我不是在尋找一個答案,這些缺失值產生z,這是不是在真正的版本的問題的可能性。這只是一個最小的版本。我所能找到的所有解決方案(如filled.contour)都需要一個在獨立變量的網格上指定的z的矩陣,而不僅僅是一組沒有結構的(x,y,z)數據點se

回答

7

包裝akima有你所需要的。它使用interp進行雙變量插值。它確實爲缺失的組合生成了z值,但是如果你願意,你能否排除這些值?如果您不生成z值,只繪製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

如果你是真正的不插設置,添加到由@Frank提供的ggplot選項,也有一些美學的,你可以使用第三個維度對比點。

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可能在那裏的時候都用插值 「失蹤」,不像答案我不會給z值..

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包生成,如下所示。對於這個圖表I中使用的功能從「R圖形食譜」由溫斯頓昌繪製垂直藍線:

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