如何用3个向量绘制轮廓/热图图?

时间:2015-07-04 02:07:47

标签: r plot

这是我的问题的玩具版本

Menu Item 1
Menu Item 2
Menu Item 3
Menu Item 4
Menu Item 5

然后我想生成z与(x + y)和(x-y)的热图。问题是z是一个向量,并没有在y和x的所有组合上定义。 请注意我不是在寻找为这些缺失值生成z的答案,这在问题的真实版本中是不可能的。这只是一个可以使用的最小版本。我能够找到的所有解决方案,例如Menu Item 需要在自变量网格上指定z的矩阵,而不仅仅是一组没有结构的(x,y,z)数据点 per se

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

您可以使用roundcut强制/操纵磁贴大小和整体外观:

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 here enter image description here

答案 2 :(得分: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包生成,如下所示。对于此图表,我使用了&#34; R Graphics Cookbook&#34;由Winston Chang画出垂直的蓝线:

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 :(得分: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)