【问题标题】:geom_tile with unequally spaced y values (e.g. 2^X)具有不等间距 y 值的 geom_tile(例如 2^X)
【发布时间】:2014-10-06 09:25:22
【问题描述】:

我想在 ggplot 中重新创建一个“图像”图(因为包的其他一些方面)。但是,我面临一个由我的 y 尺度引起的问题,它由不相等但逻辑间隔的值定义,例如我会有 y = 2,4,8,16,32 的 z 值。这会导致瓷砖不一样大,所以我的图中有这些白色条带。我可以通过将 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)

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

在示例中,y 数据经过对数转换,但这只是为了便于制作假数据集。

谢谢。

【问题讨论】:

  • data=line 中的“行”是什么?你还没有定义它,ggplot 抱怨试图处理内置的“line”function
  • 对不起,我忘记复制行了。现在变了。
  • 尝试设置 height 美学来区分 Y 坐标。由于图块以 Y 坐标为中心,因此需要进行一些调整,但应该很容易。
  • 如果我这样做,白带确实消失了,但单元格的大小不同。
  • 如何让带具有相同的高度但保持数字比例以便可以绘制线图?除非有一个简单的转换,但您似乎希望它通用。您能否附上或指出您想要的图片?

标签: r image ggplot2


【解决方案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 的评论。

没有内置的“反向 log2 变换”,但可以使用包 scales 中的 trans_new(...) 函数创建新的变换。当然,有人已经想到了这一点: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") 

【讨论】:

  • 谢谢,这在示例中运行良好,但在我更复杂的图表中,我使用 scale_y_reverse,我不能同时使用两者。我如何使用两者?错误是:由多个实际参数匹配的形式参数“trans”
  • 抱歉,找到了,感谢这个链接:stackoverflow.com/questions/11053899/…。库(尺度)reverselog2_trans
  • 关闭,但对于reverselog2_trans(...),默认base 应该是2,而不是e。为了他人的利益,我会将其添加到答案中。
【解决方案2】:

也许使用离散尺度和方面的另一种方法可能是一种可能性:

 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")

给出如下图表:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-29
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 2012-03-28
    相关资源
    最近更新 更多