【问题标题】:R levelplot adjust axesR levelplot调整轴
【发布时间】:2013-07-09 14:41:40
【问题描述】:

我想使用“lattice”包的 levelplot 函数将概率分布函数 (PDF) 绘制为 R 中的热图。我将 PDF 实现为函数,然后使用值范围和外部函数的两个向量为 levelplot 生成矩阵。 我希望轴显示我的问题是无法在两个轴上添加适当间隔的刻度线,分别显示两个实际值范围而不是列数或行数。

# PDF to plot heatmap
P_RCAconst <- function(x,tt,D)
  {
    1/sqrt(2*pi*D*tt)*1/x*exp(-(log(x) - 0.5*D*tt)^2/(2*D*tt))
  }

# value ranges & computation of matrix to plot
tt_log <- seq(-3,3,0.05)
tt <- exp(tt_log)
tt <- c(0,tt)
x <- seq(0,8,0.05)
z <- outer(x,tt,P_RCAconst, D=1.0)
z[,1] <- 0
z[which(x == 1),1] <- 1.5
z[1,] <- 0.1

# plot heatmap using levelplot
require("lattice")
colnames(z) <- round(tt, 2)
rownames(z) <- x
levelplot(z, cex.axis=1.5, cex.lab=1.5, col.regions=colorRampPalette(c("blue", "yellow","red", "black")), at=seq(0,1.9,length=200), xlab="x", ylab="time t", main="PDF P(x,t)")

在没有为列和行指定名称的情况下,我收到下面的图,其中刻度线是自然间隔的(与其他 R 函数中使用的一样),但值是行号和列号:

通过为列和行分配名称,我收到以下图,其中刻度线根本不可读,但至少与实际值相对应:

我已经在这个看似微不足道的问题上花费了太多时间,因此非常感谢您的帮助!

【问题讨论】:

  • lattice的doc很全,你看了两遍吗? ?levelplot?xyplot
  • 是的。例如,它建议 scale 作为修改轴的可能参数,即使用 tick.number。但是当我尝试这个时,它既没有任何效果也没有抛出错误。

标签: r lattice levelplot


【解决方案1】:

也许这个基本示例会有所帮助,

d = data.frame(x=rep(seq(0, 10, length=nrow(volcano)), ncol(volcano)), 
               y=rep(seq(0, 100, length=ncol(volcano)), each=nrow(volcano)), 
               z=c(volcano))

library(lattice)

# let lattice pick pretty tick positions
levelplot(z~x*y, data=d)

# specific tick positions and labels
levelplot(z~x*y, data=d, scales=list(x=list(at=c(2, 5, 7, 9), 
                                            labels=letters[1:4])))

# log scale
levelplot(z~x*y, data=d, scales=list(y=list(log=TRUE)))

这一切都在?xyplot 中进行了描述,尽管不可否认这是一页长文档。

【讨论】:

  • 我的问题其实很简单:我希望 x 轴显示 0 到 8 的值,y 轴显示 0 到 20 的值(或exp(3))。第一张图片具有正确的价值,但显然是无用的(因为它重叠了所有这些)。第二张图片有很好的轴,但显示完全错误的值,即行号和列号。
  • 你的问题似乎缺少一些代码,我只看到一个对 levelplot 的调用,没有你使用 scales 的例子。
  • 感谢您的提示。实际上,我从另一个帖子中注意到了这个火山示例,并且确实在那里它似乎有效。我不得不承认我没有尝试使其适应我的问题,因为我对 R 中的数据框没有任何经验。但是,既然你再次指出了这个例子,我尽了最大的努力,终于解决了!我只是写了:d = data.frame(x=rep(seq(0, 8, length=nrow(zz)), ncol(zz)), y=rep(seq(0, 20, length=ncol(zz)), each=nrow(zz)), z=c(zz)),其中zz是前面的变量z,然后是你帖子中提到的levelplot函数。
  • 现在参考您的第二条评论:我想我现在明白您的意思了。我上面的代码实际上是完整的,我现在有单独的行来使用秤。我首先尝试使用一些参数在 levelplot 函数本身中设置比例,但我也尝试使用类似 panel.axis(side="bottom", draw.labels=TRUE, check.overlap=TRUE, outside=TRUE, ticks=TRUE) 和 lattice.options(skip.boundary.labels=0)` 但没有成功。
  • 对于我未来的格子图:请问您在我的示例中如何处理比例?你将如何实现对数刻度?谢谢!
【解决方案2】:

这就是我最终使用levelplotdata.frameobject(根据 baptiste 提供的解决方案)实现函数 P(x,t) 的热图:

# PDF to plot heatmap
P_RCAconst <- function(xx,tt,D)
  {
    1/sqrt(2*pi*D*tt)*1/xx*exp(-(log(xx) - 0.5*D*tt)^2/(2*D*tt))
  }

# value ranges & computation of matrix to plot
tt_end <- 20                              # set end time
xx_end <- 8                              # set spatial boundary
tt <- seq(0,tt_end,0.01)                 # variable for time
xx <- seq(0,xx_end,0.01)                 # spatial variable
zz <- outer(xx,tt,P_RCAconst, D=1.0)     # meshgrid for P(x,t)
zz[,1] <- 0                              # set initial condition
zz[which(xx == 1),1] <- 4.0              # set another initial condition
zz[1,] <- 0.1                            # set boundary condition

# plot heatmap using levelplot
setwd("/Users/...")                      # set working dirctory
png(filename="heatmapfile.png", width=500, height=500) #or: x11()
par(oma=c(0,1.0,0,0))                    # set outer margins
require("lattice")                       # load package "lattice"
d = data.frame(x=rep(seq(0, xx_end, length=nrow(zz)), ncol(zz)),
               y=rep(seq(0, tt_end, length=ncol(zz)), each=nrow(zz)), 
               z=c(zz))
levelplot(z~x*y, data=d, cex.axis=1.5, cex.lab=1.5, cex.main=1.5, col.regions=colorRampPalette(c("blue", "yellow","red", "black")), at=c(seq(0,0.5,0.01),seq(0.55,1.4,0.05),seq(1.5,4.0,0.1)), xlab="x", ylab="time t", main="PDF P(x,t) for RC A, constant population")
dev.off()

这就是我的函数 P(x,t) 的最终热图的样子:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多