用ggplot2绘制数学函数

时间:2014-08-14 03:24:24

标签: r ggplot2

以下代码将数学函数绘制为热图(来自: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))

我很惊讶没有找到类似的搜索问题。 谢谢你的帮助。

2 个答案:

答案 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))

你得到:

enter image description here

答案 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之前的值。这是以

形式创建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