Построение нескольких слоев с помощью 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)

Это дает желаемый результат в сохраненном файле.

BasePlot


Затем поверх этого базового слоя я наношу один или несколько дополнительных слоев. Эти слои также имеют 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"))

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