Интерполяция geom_raster с масштабом журнала

Я немного застрял, создавая растр с логарифмической шкалой. Рассмотрим этот график, например:

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

1 ответ

Решение

Набор данных faithfuld уже есть столбец для плотности, который является оценками 2D плотности для ожидания и извержений. Вы можете обнаружить, что извержения и ожидания в наборе данных являются точками в сетке. Когда вы используете 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)

Другие вопросы по тегам