下面的代码将一个数学函数绘制成一个热图(来自:How to plot a maths function as a heatmap):
xvec <- yvec <- seq(0,10,length.out=41)
z <- outer(xvec,yvec,function(x,y) x*y^2)
image(xvec,yvec,z)
如何使用ggplot2 geom_tile()来创建它?
以下命令不起作用:
ggplot()+geom_tile(aes(x=xvec, y=yvec, z=z))
和
zdf = data.frame(z)
ggplot(zdf)+geom_tile(aes(z=zdf))
我很惊讶在搜索中没有发现类似的问题。谢谢你的帮助。
发布于 2014-08-14 03:28:47
您需要将X/Y坐标和数据(在您的例子中是z
)排列成一个data.frame
,而不是矩阵。
例如:
xvec <- yvec <- seq(0,10,length.out=41)
df <- expand.grid(xvec, yvec)
df$z <- apply(df, 1, function(p) p[1] * p[2]^2)
head(df)
# Var1 Var2 z
# 1 0.00 0 0
# 2 0.25 0 0
# 3 0.50 0 0
# 4 0.75 0 0
# 5 1.00 0 0
# 6 1.25 0 0
library(ggplot2)
ggplot(df) + geom_tile(aes(x=Var1, y=Var2, fill=z))
你得到的是:
发布于 2014-08-14 03:30:44
您还可以用以下方法重新塑造outer
结果
xvec <- yvec <- seq(0,10,length.out=41)
z <- outer(xvec,yvec,function(x,y) x*y^2)
ggplot(data.frame(xvec=xvec[row(z)], yvec=yvec[col(z)], z=as.numeric(z))) +
geom_tile(aes(x=xvec, y=yvec, fill=z))
我们在这里要做的是构建一个新的data.frame,它包含三组值来绘制:(x,y,color)。问题是我们有length(xvec)
行和length(yvec)
列,但是有length(xvec) * length(yvec)
实际观察。因此,这个技巧将重复行和列值,使它们与z
值的长度相同。由于z
是一个矩阵,row(z)
将为z
中的每个值提供行号。我们使用它多次重复xvec
值,并使它们与z
值保持不同步。yvec
值也是如此,但是我们将它们与columns
of z
进行匹配。这是另一种在表单中创建data.frame的方法
xvec yvec z
1 0.00 0 0
2 0.25 0 0
3 0.50 0 0
4 0.75 0 0
5 1.00 0 0
6 1.25 0 0
https://stackoverflow.com/questions/25299522
复制相似问题