如何使用ggplot绘制矩阵

5
我想用ggplot绘制一个矩阵。
以下是一些示例代码:
# create a dummy matrix
d2 <- matrix(data=NA,nrow=21,ncol=21,dimnames=list(-10:10,-10:10))
sig <- 3;  mx <- 0; my <- 0;
for (jr in as.numeric(dimnames(d2)[[1]])){
  for (jc in as.numeric(dimnames(d2)[[2]])){
    d2[jr+11,jc+11] <- 1/sig/(2*pi)^.5*exp(-((jr-mx)^2+(jc-my)^2)/2/sig^2)
  }
}

# convert it to dataframe
d2.df <- data.frame(x=rep(as.numeric(dimnames(d2)[[1]]),each=ncol(d2)),y=rep(as.numeric(dimnames(d2)[[2]]),times=nrow(d2)),z=as.vector(d2))

# plot with geom_tiles
library(ggplot2)
ggplot(data=d2.df,aes(x=x,y=y,fill=z))+
  geom_tile()
  

enter image description here

这可以做到不需要转换为数据框吗?

8
不能使用ggplot2库进行操作,可以使用基础图形库(例如help("image"))实现。 - Roland
7
我投票关闭这个问题,因为在ggplot函数的帮助文档中明确说明对象必须是一个data.frame,所以这个问题不应该存在。 - Cath
我投票重新打开这个(修改后的)问题,因为字面上的答案不再是“不”,而且由amoeba提供的唯一且非常有用的答案现在已经过时,并且存在显然提供此功能的软件包(例如ggmap::ggimage)。 - jan-glx
@jan-glx 我已回滚您的编辑,因为您完全改变了问题的原始含义。如果您认为这是合适的,可以提出一个新问题。 - tjebo
@tjebo 找到了一个:https://stackoverflow.com/questions/68669634/how-do-i-graph-a-matrix-using-ggplot(有一个类似于 amoeba 的答案(虽然更加复杂)) - jan-glx
1个回答

4
如Roland所述,不行。ggplot::ggplot()接受一个data.frame或可通过fortify()运行的对象创建一个data.frame。
然而,您的转换步骤可以通过调用reshape2::melt来简化,它可以将矩阵对象转换为data.frame。您可能能够在tidyr中找到一些有用的内容,但我已经几年没看了。请参见:
d2.df <- reshape2::melt(d2, c("x", "y"), value.name = "z")
head(d2.df)
ggplot(data=d2.df,aes(x=x,y=y,fill=z))+
  geom_tile()

这并没有太多地增加 OP 的问题:输入矩阵,输出 ggplot。 - zx8754
我同意你的看法 @zx8754。 - amoeba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接