Построение нескольких слоев с помощью geom_raster() или geom_tile или geom_rect()
У меня есть data.frame черно-белых растровых данных, которые я использую в качестве фонового / базового слоя. Он имеет три столбца: x, y, z. Где x и y - соответствующие координаты, а z - непрерывное значение, определяющее изображение 512 x 512. Я установил эту фоновую заливку на черно-белый градиент и построил график geom_raster()
в ggplot2
и затем сохраните изображение в файл PDF.
### MWE of base layer
# original 512x512 data is read in from a file in matrix format, so here's a mocked up example of same:
h = matrix(data = rep(c(1:512), 512), byrow = T, nrow = 512, ncol = 512)
# convert to data.frame with all the rows of z-data in first column
h = data.frame(z = as.vector(t(h)))
# create equally spaced 512x512 x and y pixel coordinate vectors
x = c(-255:256)
y = c(-255:256)
# add x and y coordinate vectors to the data.frame
h$x = rep(t(x), 512)
h$y = rep(t(-y), each=512)
# plot the data
ggplot() +
coord_fixed() +
geom_raster(data=h, aes(x,y,fill=z)) +
scale_fill_gradient(low="black", high="white", na.value="transparent")
# save to png
ggsave("testbaseplot.png", dpi=300)
Это дает желаемый результат в сохраненном файле.
Затем поверх этого базового слоя я наношу один или несколько дополнительных слоев. Эти слои также имеют x, y и r. Где r является либо непрерывным, либо дискретным значением в зависимости от региона. Например, слой, определяющий границы области, будет обозначать отдельные области, тогда как слой, определяющий топологию в области, будет определять топологию.
В идеале я бы хотел использовать geom_raster()
дважды, один раз для каждого слоя (базовый, оверлейный) и используйте разные aes(fill=)
на каждом слое, с разными scale_fill_*()
для каждого слоя. Однако попытка этого приводит к ошибкам:
# MWE of mock overlay = 4 square labeled regions
# create z-data for some example shapes
r = data.frame(r = as.vector(c(rep(rep(c('a','b'),each=100),100),
rep(rep(c('c','d'),each=100),100))))
# create x and y coordinates
r$x = rep(c(-99:100),200)
r$y = rep(c(-99:100),each=200)
# plot base layer and 1 overlay layer, both as geom_raster
ggplot() +
coord_fixed() +
geom_raster(data=h, aes(x,y,fill=z)) +
scale_fill_gradient(low="black", high="white", na.value="transparent") +
geom_raster(data=r, aes(x,y,fill=r)) +
scale_fill_manual(values=c("red","white","blue","yellow"))
Сообщение об ошибке:
Шкала для "заполнения" уже присутствует. Добавление еще одной шкалы для "заливки", которая заменит существующую шкалу. Ошибка: непрерывное значение подается в дискретную шкалу
Я думал, может быть, я мог бы сделать один geom_raster()
с aes(fill=z)
и один с aes(colour=r)
а также scale_colour_manual
но geom_raster()
не распознает aes(colour=)
вариант, поэтому я использовал geom_tile(aes(colour=r))
вместо:
# plot looks fine
ggplot() +
coord_fixed() +
geom_raster(data=h, aes(x,y,fill=z)) +
scale_fill_gradient(low="black", high="white", na.value="transparent") +
geom_tile(data=r, aes(x,y,colour=r), fill="transparent") +
scale_colour_manual(values=c("red","white","blue","yellow"))
# saved file does not
ggsave("testlayerplot.png", dpi=300)
График хорошо выглядит в окне предпросмотра RStudio, но при сохранении в виде файла (pdf, png и т. Д.) Слой листов содержит сетку нежелательных линий.
Я считаю, что эти строки появляются, потому что geom_tile
заливка по умолчанию серая. Это связано с форматом файла? Из-за серой заливки по умолчанию geom_tile
игнорируя fill="transparent"
вариант? Другая причина?
Я чувствую, что подхожу к этому неправильно. Я, вероятно, преобразовываю исходные растровые данные в матричном формате в x, y, z data.frame
форматировать излишне... и потому что я понимаю data.frame
формат лучше.
Первая часть: Могу ли я использовать ggplot
построить один растр над другим, не получая нежелательных линий? Если так, то как? Могу ли я также добавить alpha=.5
прозрачность наложенного слоя?
Вторая часть: есть ли способ, которым я могу построить оригинальный формат матрицы растра без преобразования в x, y, z data.frame
форматировать первым? Если так, то как? Можно ли установить прозрачность на наложенном слое?
1 ответ
Немного поработав, вы можете использовать annotate
чтобы создать фон без отображения, чтобы шкалы заливки оставались доступными для центра:
h$z <- (h$z - min(h$z))/diff(range(h$z))
ggplot() +
coord_fixed() +
annotate(geom = 'raster', x = h$x, y = h$y,
fill = scales::colour_ramp(c("black", "white"))(h$z)) +
geom_raster(data = r, aes(x,y,fill=r)) +
scale_fill_manual(values=c("red","white","blue","yellow"))