【问题标题】:Plotting a continuous function as a contour plot将连续函数绘制为等高线图
【发布时间】:2014-04-08 07:34:50
【问题描述】:

我希望根据我创建的函数创建一个连续的等高线/热图。该图将基于给定的输入和 x 和 y 限制,然后该函数会生成每 0.01 增量处具有等高线的热图。

# var 1 to 3 are given as inputs and do not change.
var1 = 3
var2 = 1
var3 = 0.02

# x and y are additional variables, but they are plotted within a range 
# on the chart, xlim = c(0, 24), ylim = c(0, 0.05)

# Given var 1 to 3, and the ranges x and y, plot the result (z) as a heat map and/or contour
result <- function(var1, var2, var3,x, y){
  var2 * (1 + (x/12) * var3) * (1 + -var1 * y)
}

# sample output at point x = 12, y = 0.02, and equals 0.9588 in this example.
result(var1 = 3, var2 = 1,var3 = 0.02,
   x=12, 
   y=0.02)

下面的图表代表了我想要完成的任务,尽管它来自网络并且与我提供的数据无关。我以前没有在等高线图中使用过连续函数。

【问题讨论】:

  • 那么是什么特别阻碍了你?根据你到目前为止的第一个问题,我看到的是,如果你想使用 image 或 image.plot 和/或等高线图制作彩色图,你需要你的函数来输出 x、y、z 或 z 值矩阵.现在它只是吐出1个数字。你可以做的是让 x 和 y 成为实际范围,即 x=c(0,3), y=c(-2,1)。此外,您将需要另一个变量来告诉您的函数在该范围内计算的频率。它是否计算过 0.5 或 1 等。这与 x 和 y 一起将确定您的输出矩阵有多大。
  • 我需要绘图来生成 z 值,给出 x 和 y 的范围。我提供的样本只有 1 个值,因为 x 和 y 都给出了,所以它只是图表上的一个点。如果我对您的理解正确,我无法制作连续情节?我的印象是这是可行的,特别是考虑到我提供的情节似乎是连续的

标签: r


【解决方案1】:

你只需要正确地构造你的函数,你几乎可以做任何事情。

result <- function(var1, var2, var3,x, y,d){
ydata=numeric(length(seq(y[1],y[2],d)))
mat=matrix(NA,length(seq(y[1],y[2],d)),length(seq(x[1],x[2],d)))
yy=seq(y[1],y[2],d)
xx=seq(x[1],x[2],d)
for(i in 1:length(xx)){
for(n in 1:length(yy)){
ydata[n]=var2 * (1 + (xx[i]/12) * var3) * (1 + -var1 * yy[n])
}
mat[,i]=ydata
}
return(mat)}

image 很奇怪,因此您需要先旋转矩阵,然后再将其输入image。您可以使用我在 stackoverflow 上找到的类似这样的简单函数。

rotate <- function(x) t(apply(x, 2, rev))

然后你就可以开始绘图了

mydata=result(var1 = 3, var2 = 1,var3 = 0.02,x=c(-1200,1200),y=c(-3005,2008),d=10)
image(rotate(mydata))
par(new=TRUE)
contour(mydata)

我会让你让情节看起来不错。

【讨论】:

  • 谢谢,到目前为止这很有帮助。我要问,为什么图中的x和y轴的范围是0到1,而不是函数中指定的?另外,我看到这不是一个连续平面,当我想制作这样的图时,我是否应该期望必须计算一组 z 值?如果我想要流畅的线条,它似乎会变慢。
  • 我可以通过添加以下代码来自定义坐标轴:x.atRange
  • 据我所知,没有任何函数可以采用两个变量方程并为您提供某个范围内的绘图。您在这里更改轴,但我认为您仍然需要对齐图像和轮廓。阅读函数 imagecontours 以了解如何做到这一点。你被你的术语弄糊涂了,你的方程是连续的,但没有情节可以是字面上连续的。为此,它必须在无限数量的点上计算函数的值。如果您希望情节看起来更好,请减小 d,您的情节会变得更精细,点数更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
相关资源
最近更新 更多