我有点卡住用对数刻度绘制光栅。例如,考虑这个图:
ggplot(faithfuld, aes(waiting, eruptions)) +
geom_raster(aes(fill = density))
但是如何使用这个geom的对数刻度?通常的方法都不令人满意:
ggplot(faithfuld, aes(waiting, log10(eruptions))) +
geom_raster(aes(fill = density))
ggplot(faithfuld, aes(waiting, (eruptions))) +
geom_raster(aes(fill = density)) +
scale_y_log10()
这根本不起作用:
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()
我可以做些什么来消除光栅中的这些空白?
请注意,这个问题与这两个问题有关:
我一直在更新R代码的要点,它结合了这些问题答案的细节(要点包含在要点中)。这个要点就在这里:https://gist.github.com/benmarwick/9a54cbd325149a8ff405
答案 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)
如果您确实想要将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)
更新:使用geom_rect
并提供自定义xmin,xmax,ymin,ymax值以适合对数刻度的空格。
由于geom_raster
使用相同尺寸的图块,您可能必须使用geom_tile
或geom_rect
来创建图表。我的想法是计算每个图块应该有多大(宽度),并调整每个图块的xmin
和xmax
以填补空白。
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)