首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用ggplot2绘制数学函数

用ggplot2绘制数学函数
EN

Stack Overflow用户
提问于 2014-08-14 03:24:24
回答 2查看 501关注 0票数 0

下面的代码将一个数学函数绘制成一个热图(来自:How to plot a maths function as a heatmap):

代码语言:javascript
运行
复制
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()来创建它?

以下命令不起作用:

代码语言:javascript
运行
复制
ggplot()+geom_tile(aes(x=xvec, y=yvec, z=z))

代码语言:javascript
运行
复制
zdf = data.frame(z)
ggplot(zdf)+geom_tile(aes(z=zdf))

我很惊讶在搜索中没有发现类似的问题。谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-14 03:28:47

您需要将X/Y坐标和数据(在您的例子中是z)排列成一个data.frame,而不是矩阵。

例如:

代码语言:javascript
运行
复制
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))

你得到的是:

票数 2
EN

Stack Overflow用户

发布于 2014-08-14 03:30:44

您还可以用以下方法重新塑造outer结果

代码语言:javascript
运行
复制
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的方法

代码语言:javascript
运行
复制
  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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25299522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档