【问题标题】:Plotting heatmap in ggplot2 without evenly spaced points在没有均匀间隔点的情况下在 ggplot2 中绘制热图
【发布时间】:2019-12-18 16:43:24
【问题描述】:

我有由 (x,y,z) 值组成的数据,我想将其绘制为 ggplot2 中的热图。但是,这些点的间距不均匀(即 x 和 y 数据点不能很好地落在规则网格上),这会阻止数据正常显示。我发现this 发布了关于类似问题的帖子,他们建议使用interp 函数将数据插入到均匀间隔的网格中。我在下面包含了一些示例代码来完成此操作

library(akima)

data <- data.frame("x" = c(1, 3, 5), "y" = c(-1, 2, 8), "z" = c(5, 1, 2))
resolution <- 0.1
a <- interp(x=data$x, y=data$y, z=data$z, 
  xo=seq(min(data$x),max(data$x),by=resolution),
  yo=seq(min(data$y),max(data$y),by=resolution), duplicate="mean")

结果变量a可以使用image函数自动显示,但我想使用ggplot2。我无法理解 a 的结构 - 它似乎是一个列表列表,但每个列表的长度不同,我不确定如何将其转换为适合 ggplot2 的形式。我无法在interp 的文档中找到答案。有人可以解释如何重铸 a 以使其可以使用 ggplot2 绘制吗?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    a$x 包含 x 坐标

    a$y 包含 y 坐标

    a$z 包含实际矩阵

    library(akima)
    library(data.table)
    
    data <- data.frame("x" = c(1,3,5,7), "y" = c(-1,2,8,5), "z" = c(5,1,2,7))
    resolution <- 0.1
    a <- interp(x=data$x, y=data$y, z=data$z, 
                xo=seq(min(data$x),max(data$x),by=resolution),
                yo=seq(min(data$y),max(data$y),by=resolution), duplicate="mean")
    
    x.coordinate <- a$x
    y.coordinate <- a$y
    energy.table <- as.data.frame(a$z) 
    
    names(energy.table) <- y.coordinate
    energy.table[is.na(energy.table)] <- 0
    energy.table$x <- x.coordinate
    longenergy <- melt(as.data.table(energy.table),id="x")
    
    ggheat <- ggplot(longenergy,aes(x=variable,y=x, fill=value)) +
                    geom_tile() + 
                    theme(axis.text.x=element_blank(),axis.text.y=element_blank()) + 
                    xlab("y") + ylab("x") 
    ggheat
    

    上面的代码生成下面的图像。然后,您可以使用 ggplot 来修复颜色、标签、标题……

    【讨论】:

    • 不建议使用aes(x=longenergy$variable),但是aes(x = variable),你已经指定了数据。
    • @Axeman 感谢您指出这一点,我会解决的。我从一个旧脚本中获取了这段代码,该脚本用于绘制来自分子动力学模拟的势能表面。我正在使用包装在函数中的代码,而显式声明是使 ggplot 识别值的一种方式。这是在我找到environment = environment()之前
    猜你喜欢
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多