首页 > 解决方案 > 将等高线图从标准 R 转换为 ggplot

问题描述

我正在努力寻找如何将标准 R 中的等高线图转换为 ggplot2 中的等高线图。

在 R 中,函数轮廓的参数是 2 个值向量和要绘制的值矩阵。

例如,考虑以下代码

X=seq(from=1,to=100,length=100)
Y=seq(from=300,400,length=100)

M=matrix(NA,100,100)

for (i in seq_along(X)){
  for (j in seq_along(Y)){
    M[i,j]=log(j)*sqrt(i)
  }
}

contour(X,Y,M)

M 是一个 100x100 矩阵,每个条目是 X 和 Y 中每个元素的函数。此代码不会产生错误

现在我正在努力将此示例转换为 ggplot。

我尝试以下代码

d=data.frame(X,Y,M)
ggplot(d,aes(x=X,y=Y,z=M))+stat_contour()

现在在我看来,通常变量 z 也意味着长度为 100 的向量。我觉得我需要做的是为 Y 中的每个元素重复向量 X,并为 X 中的每个元素重复向量 Y,这样 X 和 Y 的长度都是 100x100=10,000 个元素。但这对我来说似乎不对,我也不知道该怎么做。有没有更简单的方法可以从 R 轮廓转换为 ggplot 轮廓?

非常感谢。

标签: rggplot2contour

解决方案


ggplot 库喜欢“整洁”格式的数据。在这种情况下,X、Y 和 Z 各有 3 列。

解决这个问题的关键是获取 X 和 Y 的所有组合并将您的平方 M 矩阵转换为向量。该expand.grid函数将生成所有 X&Y 组合的数据框

X=seq(from=1,to=100,length=100)
Y=seq(from=300,400,length=100)

M=matrix(NA,100,100)

for (i in seq_along(X)){
  for (j in seq_along(Y)){
    M[i,j]=log(j)*sqrt(i)
  }
}

contour(X,Y,M)

#create all of the combinations of x&y
d<-expand.grid(X, Y)
names(d)<-c("X", "Y")

#Convert from a square matrix to a single vector
d$M<-matrix(M, ncol=1)

library(ggplot2)
ggplot(d, aes(x=X, y=Y ,z=M))+stat_contour()

在此处输入图像描述


推荐阅读