以下代码将数学函数绘制为热图(来自: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))
我很惊讶没有找到类似的搜索问题。 谢谢你的帮助。
答案 0 :(得分:2)
您需要将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))
你得到:
答案 1 :(得分:2)
您还可以使用
重塑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
z
之前的值。这是以
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