Есть ли способ указать диапазон интерполяции geom_raster? - PullRequest
0 голосов
/ 08 января 2019

Я использую R для решения уравнения с двумя переменными в R. Я изменяю две переменные по последовательности, а затем использую geom_raster с интерполяцией для генерации графика решений.

Однако, когда я наносил данные на график, я заметил, что площадь графика превышает диапазон значений оси Y, которые я даю в качестве входных данных.

Если я использую ylim, чтобы наложить ограничение на область, то интерполированный график сжимается и больше не ограничивает значения. Если я использую vjust = 0, то верхняя часть графика ограничивает область, а нижняя - нет.

Мой код для воспроизводимого примера выглядит следующим образом:

library(ggplot2)
library(reshape2)


x_range <- seq(0.001,10, by=0.001)
y_range <- (seq(1*10^-10, 1*10^-9, by = 1*10^-10))

FUN <- function(x, y) log10((1)/(x*y))

data <- outer(x_range, y_range, FUN)

colnames(data) <- y_range
rownames(data) <- x_range

melted_data <- melt(data)

p <- ggplot(data=melted_data)

# basic plot
p + geom_raster(aes(x=Var1, y=Var2, fill=value), interpolate = TRUE) +
  geom_hline(yintercept = 1*10^-10) +
  geom_hline(yintercept = 1*10^-9)

enter image description here

# with imposed ylim
p + geom_raster(aes(x=Var1, y=Var2, fill=value), interpolate = TRUE) +
  geom_hline(yintercept = 1*10^-10) +
  geom_hline(yintercept = 1*10^-9) + 
  ylim(1*10^-9, 1*10^-10)

enter image description here

# with modified vjust
p + geom_raster(aes(x=Var1, y=Var2, fill=value), interpolate = TRUE, vjust = 0) +
  geom_hline(yintercept = 1*10^-10) +
  geom_hline(yintercept = 1*10^-9)

enter image description here

Я бы хотел, чтобы окончательный график ограничивал фактические данные (заданные двумя горизонтальными линиями при y = 1 * 10 ^ -9 и y = 1 * 10 ^ -10.

Я думаю, что я наблюдаю из-за интерполированного размера пикселя, но я не уверен.

1 Ответ

0 голосов
/ 08 января 2019

Я думаю, что это не имеет ничего общего с интерполяцией, и все, что связано с тем, что geom_raster (особый случай geom_tile) по умолчанию использует x / y в качестве центра каждой плитки. Указание vjust = 1 сдвигает плитки вниз, но идея остается той же. За пределами, наложенным geom_hline, вы видите верхнюю половину первого ряда плиток и нижнюю половину последнего ряда плиток.

Если вы не хотите показывать эти полукровки, вы можете установить пределы оси Y в coord_cartesian, а не ylim (это применяет ограничение к системе координат, а не к масштабу; см. ?coord_cartesian для получения дополнительной информации), чтобы увеличить конкретный диапазон данных:

p + geom_raster(aes(x=Var1, y=Var2, fill=value), interpolate = TRUE) +

  # limit coordinate system, without expansion
  coord_cartesian(ylim = c(1*10^-10, 1*10^-9), expand = FALSE)

coord lim approach

В качестве альтернативы, если у вас есть другие слои geom, которые выходят за пределы c(1*10^-10, 1*10^-9) и не хотите увеличивать масштаб, вы можете добавить маскирующий слой, чтобы покрыть половину плиток:

p + geom_raster(aes(x=Var1, y=Var2, fill=value), interpolate = TRUE) +

  # add masking layers
  annotate(geom = "rect", xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = 1*10^-10, fill = "white") +
  annotate(geom = "rect", xmin = -Inf, xmax = Inf, ymin = 1*10^-9, ymax = Inf, fill = "white")

masking approach

...