Интерполяция 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()
Что я могу сделать, чтобы избавиться от этих пробелов в растре?
Обратите внимание, что этот вопрос связан с этими двумя:
- интерполяция geom_raster с масштабом журнала
- Используйте R для воссоздания контурного сюжета, сделанного в Igor
Я держал обновленную суть кода 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)