geom_raster插值,对数刻度

时间:2016-03-08 11:40:34

标签: r plot ggplot2 raster logarithm

我有点卡住用对数刻度绘制光栅。例如,考虑这个图:

ggplot(faithfuld, aes(waiting, eruptions)) +
 geom_raster(aes(fill = density))

enter image description here

但是如何使用这个geom的对数刻度?通常的方法都不令人满意:

 ggplot(faithfuld, aes(waiting, log10(eruptions))) +
   geom_raster(aes(fill = density))

enter image description here

 ggplot(faithfuld, aes(waiting, (eruptions))) +
   geom_raster(aes(fill = density)) + 
   scale_y_log10()

enter image description here

这根本不起作用:

 ggplot(faithfuld, aes(waiting, (eruptions))) +
   geom_raster(aes(fill = density)) + 
   coord_trans(x="log10")

Error: geom_raster only works with Cartesian coordinates

是否有使用栅格的对数刻度的选项?

确切地说,我有三列数据。 z值是我想用来为栅格着色的值,它不是根据x和y值计算的。所以我需要为ggplot函数提供所有三列。例如:

dat <- data.frame(x = rep(1:10, 10), 
                  y = unlist(lapply(1:10, function(i) rep(i, 10))), 
                  z = faithfuld$density[1:100])

ggplot(dat, aes(x = log(x), y = y, fill = z)) +
  geom_raster()

enter image description here

我可以做些什么来消除光栅中的这些空白?

请注意,这个问题与这两个问题有关:

我一直在更新R代码的要点,它结合了这些问题答案的细节(要点包含在要点中)。这个要点就在这里:https://gist.github.com/benmarwick/9a54cbd325149a8ff405

1 个答案:

答案 0 :(得分:5)

数据集faithfuld已经有一个密度列,它是等待和喷发的二维密度的估计值。您可以发现数据集中的火山爆发和等待是网格中的点。当您使用geom_raster时,它不会为您计算密度。相反,它根据x,y坐标绘制密度,在这种情况下,是网格。因此,如果你只是在y上应用对数变换,它会扭曲y之间的差异(原来它们是等间距的),这就是你在图中看到空间的原因。我使用点来显示效果:

library(ggplot2)
library(gridExtra)

# Use point to visualize the effect of log on the dataset
g1 <- ggplot(faithfuld, aes(x=waiting, y=eruptions)) +
  geom_point(size=0.5)    

g2 <- ggplot(faithfuld, aes(x=waiting, y=log(eruptions))) +
  geom_point(size=0.5)    

grid.arrange(g1, g2, ncol=2)    

enter image description here

如果您确实想要将y转换为对数比例并生成密度图,则必须将faithful数据集与geom_density_2d一起使用。

# Use geom_density_2d
ggplot(faithful, aes(x=waiting, y=log(eruptions))) +
  geom_density_2d() +
  stat_density_2d(geom="raster", aes(fill=..density..),
                  contour=FALSE)

enter image description here

更新:使用geom_rect并提供自定义xmin,xmax,ymin,ymax值以适合对数刻度的空格。

由于geom_raster使用相同尺寸的图块,您可能必须使用geom_tilegeom_rect来创建图表。我的想法是计算每个图块应该有多大(宽度),并调整每个图块的xminxmax以填补空白。

 dat <- data.frame(x = rep(1:10, 10), 
                  y = unlist(lapply(1:10, function(i) rep(i, 10))), 
                  z = faithfuld$density[1:100])
library(ggplot2)
library(gridExtra)   

g <- ggplot(dat, aes(x = log(x), y = y, fill = z)) +
  geom_raster()   

# Replace the ymin and ymax
distance <- diff((unique(dat$x)))/2
upper <- (unique(dat$x)) + c(distance, distance[length(distance)])
lower <- (unique(dat$x)) - c(distance[1], distance) 

# Create xmin, xmax, ymin, ymax
dat$xmin <- dat$x - 0.5 # default of geom_raster is 0.5
dat$xmax <- dat$x + 0.5
dat$ymin <- unlist(lapply(lower, function(i) rep(i, rle(dat$y)$lengths[1])))
dat$ymax <- unlist(lapply(upper, function(i) rep(i, rle(dat$y)$lengths[1])))        

# You can also use geom_tile with the width argument
g2 <- ggplot(dat, aes(x=log(x), y=y, xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, fill=z)) +
  geom_rect() 

# show the plots     
grid.arrange(g, g2, ncol=2)

enter image description here