Как сделать тепловую карту с неровной осью Y?

Как я могу сделать тепловую карту (или если она называется как-то иначе), когда ось Y неравномерна? Я тоже открыт для интерполяции, но желательно без нее.

Когда у меня был слой с равными интервалами, я мог использовать это, чтобы получить рисунок ниже.

ggplot(a, aes(x=time, y=Layer, fill = Value))+
  geom_tile()+
  scale_fill_gradient2(low="blue",mid="yellow",high="red", midpoint=0.5)+
  theme_bw()

Но я не могу продолжить, когда слой не от 1 до 10 натуральных чисел.

введите здесь описание изображения

dput(droplevels(head(smx,10)))

structure(list(value = c(5.4023420028113e-07, 5.4023420028113e-07, 
    5.4023420028113e-07, 5.4023420028113e-07, 5.4023420028113e-07, 
    5.4023420028113e-07, 5.4023420028113e-07, 6.74006442227979e-08, 
    6.74006442227979e-08, 6.74006442227979e-08), 
time = structure(c(17156, 17156, 17156, 17156, 17156, 17156, 17156, 17162,     
    17162, 17162), 
class = "Date"), 
layer = c(0.0120349472577243, 0.0177233992991887, 0.00844582491793334,   
    0.00756873916071316, 0.0437965816456147, 0.0168056962032031, 
    0.0181395468747096, 0.0120349472577243, 0.0177233992991887, 
    0.00844582491793334)), 
.Names = c("value", "time", "layer"), 
row.names = c(NA, 10L), 
class = "data.frame")

ВСЕ ДАННЫЕ ЗДЕСЬ

https://pastebin.com/mXUiSyvX


person maximusdooku    schedule 31.08.2017    source источник
comment
Что конкретно идет не так, когда вы пытаетесь построить свои данные, и как вы хотите, чтобы окончательный график выглядел?   -  person Marius    schedule 01.09.2017
comment
По сути, у меня есть горизонтальные линии и никаких блоков. Окончательный сюжет должен быть похож на тот, который я прикрепил, но в основном везде блоки разного размера...   -  person maximusdooku    schedule 01.09.2017
comment
Таким образом, плитки должны покрывать всю площадь участка или закрывать нижнюю часть следующей плитки? Вам нужно подумать о том, как значения времени и слоя в ваших данных сопоставляются с тайлами, которые вы хотите видеть.   -  person Marius    schedule 01.09.2017


Ответы (1)


Вы можете использовать geom_rect вместо geom_tile, чтобы указать различную высоту плитки. Из файла справки:

geom_rect и geom_tile делают одно и то же, но имеют разные параметры: geom_rect использует расположение четырех углов (xmin, xmax, ymin и ymax), а geom_tile использует центр тайла и его размер (x, y, ширина, высота).

Предполагая, что переменная слоя в вашем фрейме данных относится к верхней части каждой плитки (т.е. ymax), вы можете создать переменную слоя с запаздыванием для каждой даты, чтобы получить ymin в той же строке фрейма данных. Основываясь на вашем наборе данных, я также предположил, что самая низкая плитка начинается с ymin = 0:

library(dplyr)

ggplot(smx %>%
         group_by(time) %>%
         arrange(layer) %>%
         mutate(layer.min = layer - diff(c(0, layer))) %>% #assuming y axis starts from 0
         ungroup(), aes(fill = value))+
  geom_rect(aes(xmin = time - 0.5, xmax = time + 0.5,
                ymin = layer.min, ymax = layer),
            colour = "black") +
  scale_fill_gradient2(low="blue",mid="yellow",high="red", midpoint = 0.2) +
  scale_x_date(date_breaks = "1 day", date_labels = "%b %d") +
  theme_bw()

ggplot тепловая карта с использованием geom_rect

(Я включил черный контур для плиток и изменил среднюю точку для более четкого визуального различия в этом ответе. Не стесняйтесь удалять их для вашего фактического варианта использования.)

person Z.Lin    schedule 01.09.2017