【问题标题】:Labeling rescaled values on transformed data in ggplot2在 ggplot2 中对转换后的数据标记重新缩放的值
【发布时间】:2012-06-02 09:40:33
【问题描述】:

问题

当我尝试使用热图时,这是一个循环问题,答案可能令人沮丧...

我使用fieldsggplot2 包回答了关于plotting a heatmap with dissimilar data 的问题。它基本上允许使用准备绘图的akima 包插值非常不同的缩放 x 和 y 轴。

不幸的是,我无法找到重新标记轴的方法,以便它们引用原始值。我知道这将涉及在ggplot2 中使用breakslabels 参数,但除了错误我无法产生任何东西。非常感谢这两个绘图包的解决方案...

已更新解决方案

为方便起见,这是我使用ggplot2的代码:

library("akima")
library("ggplot2")

x.orig <- rnorm(20, 4, 3)
y.orig <- rnorm(20, 5e-5, 1e-5)
x <- scale(x.orig)  
y <- scale(y.orig) 
z <- rnorm(20)

t. <- interp(x,y,z)
t.df <- data.frame(t.)

gt <- data.frame( expand.grid(x=t.$x, 
                              y=t.$y), 
                  z=c(t.$z), 
                  value=cut(c(t.$z), 
                            breaks=seq(min(z),max(z),0.25)))

p <- ggplot(gt) + geom_tile(aes(x,y,fill=value)) + 
    geom_contour(aes(x=x,y=y,z=z), colour="black") 

# --------------------------------------------------------------
# Solution below prompted by X. He's answer:

get.labels <- function(break.points, orig.data, scaled.data, digits) { 
    labels <- as.character(lapply(break.points,      
            function(i) round(i * min(orig.data) 
                              / min(scaled.data),
                              digits)
                                  )
                           )
    labels
}

x.break.points <- seq(min(x), max(x), 0.5)
x.labels <- get.labels(x.break.points, x.orig, x, digits=2)
p <- p + scale_x_continuous(breaks=x.break.points, 
                            labels=x.labels)

y.break.points <- seq(min(y), max(y), 0.5)
y.labels <- get.labels(y.break.points, y.orig, y, digits=8)
p <- p + scale_y_continuous(breaks=y.break.points, 
                            labels=y.labels)

p

结果

还有待解决

还有一个问题:当代码第一次运行时,它会反向生成标签,在第二次和后续运行中,标签被正确标记。也许是另一个问题?...

【问题讨论】:

    标签: r ggplot2 heatmap


    【解决方案1】:

    我做了这样的事情:

    library("akima")
    library("ggplot2")
    
    x.orig <- rnorm(20, 4, 3)
    y.orig <- rnorm(20, 5e-5, 1e-5)
    x <- scale(x.orig)  
    y <- scale(y.orig) 
    z <- rnorm(20)
    
    t. <- interp(x,y,z)
    t.df <- data.frame(t.)
    
    gt <- data.frame( expand.grid(x=t.$x, 
                                  y=t.$y), 
                      z=c(t.$z), 
                      value=cut(c(t.$z), 
                                breaks=seq(min(z),max(z),0.25)))
    
    p <- ggplot(gt) + geom_tile(aes(x,y,fill=value)) + 
        geom_contour(aes(x=x,y=y,z=z), colour="black") 
    
    get.labels <- function(break.points, orig.data, scaled.data, digits) { 
        labels <- as.character(lapply(break.points,      
                function(i) round(i * min(orig.data) 
                                  / min(scaled.data),
                                  digits)
                                      )
                               )
        labels
    }
    
    x.break.points <- seq(min(x), max(x), 0.5)
    x.labels <- get.labels(x.break.points, x.orig, x, digits=2)
    p <- p + scale_x_continuous(breaks=x.break.points, 
                                labels=x.labels)
    
    y.break.points <- seq(min(y), max(y), 0.5)
    y.labels <- get.labels(y.break.points, y.orig, y, digits=8)
    p <- p + scale_y_continuous(breaks=y.break.points, 
                                labels=y.labels)
    
    p
    

    【讨论】:

    • 谢谢@x-he,看来我们快到了。我已经更新了这个问题,以澄清标签 L1-L4 应该参考原始比例。请看一下问题中的更新代码?
    • +1 为我指明了正确的方向。我已经完成了解决方案并更新了问题。我会建议对您的答案进行编辑。如果你接受,那么这就是打勾:)
    • 我对体重秤有疑问。您说您希望刻度指的是原始比例。但是,您更新后的问题中的刻度不是指居中后的比例(?)吗?
    • 哦,没关系 :) 我猜我答案中的更新情节具有原始比例。
    • 问题是 x.orig 和 y.orig 对于插值来说太不相似了。我想重新缩放它们以进行绘图,然后将标签映射回原始值。这是通过您的 break.points 想法实现的。再次感谢:)
    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 2022-10-05
    • 2021-01-07
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2021-12-28
    相关资源
    最近更新 更多