具有不等间距y值的geom_tile(例如2 ^ X)

时间:2014-10-06 09:25:22

标签: r image ggplot2

我想在ggplot中重新创建一个“图像”图(因为包的其他一些方面)。然而,我正面临着由我的y尺度引起的问题,y尺度由不等但逻辑间隔的值定义,例如,我的z值为y = 2,4,8,16,32。这导致瓷砖不会同样大,所以我的图中有这些白色条带。我可以通过在一个因子中转换y值来解决这个问题,但我不想这样做,因为我还试图在图上绘制需要数字刻度的其他几何对象。 这有点清楚我的问题:

# random data, with y scale numeric
d <- data.frame(Var1=rep(1901:2000,10),Var2=rep(c(2,4,8,16,32),each=100),value=rnorm(500,50,5))
line=data.frame(Var1=1901:2000,Var2=rnorm(50,1.5,0.5))
ggplot(d, aes(x=Var1, y=Var2)) +
  geom_tile(aes(fill=value)) +
  geom_line(data=line)

 # y as factor
d2 = d
d2$Var2=as.factor(d2$Var2)    ggplot(d2, aes(x=Var1, y=Var2)) +
  geom_tile(aes(fill=value)) +
  geom_line(data=line)

我尝试将线值归因于最近因子水平的值,但这会引入一个很大的错误。另外,我在size中尝试了geom_tile选项,但这也没有用。

在示例中,y数据是日志转换的,但这只是为了便于制作假数据集。

谢谢。

2 个答案:

答案 0 :(得分:1)

这样的东西?

ggplot(d, aes(x=Var1, y=Var2)) +
  geom_tile(aes(fill=value)) +
  geom_line(data=line)+
  scale_y_continuous(trans="log2")

请注意添加scale_y_continuous(trans="log2")

编辑基于OP的评论。

没有内置&#34;反向log2转换&#34;,但可以使用包trans_new(...)中的scales函数创建新的转换。当然,有人已经想到了这一点:ggplot2 reverse log coordinate transform。以下代码基于链接。

library(scales)
reverselog2_trans <- function(base = 2) { 
  trans <- function(x) -log(x, base) 
  inv <- function(x) base^(-x) 
  trans_new(paste0("reverselog-", format(base)), trans, inv, log_breaks(base = base), domain = c(1e-100, Inf))
} 
ggplot(d, aes(x=Var1, y=Var2)) +
  geom_tile(aes(fill=value)) +
  geom_line(data=line)+
  scale_y_continuous(trans="reverselog2") 

答案 1 :(得分:0)

也许使用离散比例和方面的另一种方法可能是:

 d <- data.frame(Var1=rep(1901:2000,10),Var2=rep(c(2,4,8,16,32),each=100),value=rnorm(500,50,5), chart="tile" )
 d$Var2 <- factor(d$Var2, levels=rev(unique(d$Var2)))
 line <- data.frame(Var1=1901:2000,Var2=rnorm(50,1.5,0.5), chart="line")
 ggplot(d, aes(x=Var1, y=Var2)) +
   geom_tile(aes(y = Var2, fill=value) ) +
   geom_line( data=line ) +
   scale_y_discrete() +  
   facet_grid( chart ~ ., scale = "free_y", space="free_y")

,它给出了一个图表:enter image description here