Я не уверен, что это удовлетворяет все, но это должно быть началом. Чтобы сократить время построения графика, я суммирую данные в сетке, что позволяет использовать geom_raster
. Я не совсем понимаю разрывы и все, что вы используете, так что вы можете изменить часть того, как я разделил данные для создания отдельных полос. Я попробовал пару способов с cut_interval
и cut_width
- это было бы хорошим местом для подключения различных опций, таких как количество или ширина полос.
Так как вы упомянули получение среднего z
для каждой полосы, я группирую по сеточным x
и y
и разрезу dist
, затем использую среднее значение z
для установки полос. Я добавил шаг, чтобы сделать метки, как в примере - вы, вероятно, захотите повернуть их вспять или отрегулировать их расположение - но это происходит из-за получения номера факторного уровня каждой полосы.
library(tidyverse)
set.seed(555)
n <- 1e6
df <- data_frame(
x = 100 - abs(rnorm(n, 0, 5)),
y = 50 + rnorm(n, 0, 3),
dist = sqrt((x - 100)^2 + (y - 50)^2),
z = exp(-(dist / 8)^2)
) %>%
mutate(brk = cut(dist, seq(0, max(dist), by = 5), include.lowest = T))
summarized <- df %>%
filter(!is.na(brk)) %>%
mutate(x_grid = floor(x), y_grid = floor(y)) %>%
group_by(x_grid, y_grid, brk) %>%
summarise(avg_z = mean(z)) %>%
ungroup() %>%
# mutate(z_brk = cut_width(avg_z, width = 0.15)) %>%
mutate(z_brk = cut_interval(avg_z, n = 9)) %>%
mutate(brk_num = as.numeric(z_brk))
head(summarized)
#> # A tibble: 6 x 6
#> x_grid y_grid brk avg_z z_brk brk_num
#> <dbl> <dbl> <fct> <dbl> <fct> <dbl>
#> 1 75 46 (20,25] 0.0000697 [6.97e-05,0.11] 1
#> 2 75 47 (20,25] 0.000101 [6.97e-05,0.11] 1
#> 3 75 49 (20,25] 0.0000926 [6.97e-05,0.11] 1
#> 4 75 50 (20,25] 0.0000858 [6.97e-05,0.11] 1
#> 5 75 52 (20,25] 0.0000800 [6.97e-05,0.11] 1
#> 6 76 51 (20,25] 0.000209 [6.97e-05,0.11] 1
Чтобы сделать метки, суммируйте эти данные, чтобы в каждой полосе было по одной строке - я сделал это, взяв минимум с сеткой x
, затем используя среднее значение y
, чтобы они отображались в середина сюжета.
labels <- summarized %>%
group_by(brk_num) %>%
summarise(min_x = min(x_grid)) %>%
ungroup() %>%
mutate(y_grid = mean(summarized$y_grid))
head(labels)
#> # A tibble: 6 x 3
#> brk_num min_x y_grid
#> <dbl> <dbl> <dbl>
#> 1 1 75 49.7
#> 2 2 88 49.7
#> 3 3 90 49.7
#> 4 4 92 49.7
#> 5 5 93 49.7
#> 6 6 94 49.7
geom_raster
отлично подходит для тех ситуаций, когда у вас есть данные в равномерно распределенной сетке, которой просто нужны однородные плитки в каждой позиции. На данный момент суммарные данные имеют 595 строк вместо исходного 1 миллиона, поэтому время для построения графика не должно быть проблемой.
ggplot(summarized) +
geom_raster(aes(x = x_grid, y = y_grid, fill = z_brk)) +
geom_label(aes(x = min_x, y = y_grid, label = brk_num), data = labels, size = 3, hjust = 0.5) +
theme_void() +
theme(legend.position = "none", panel.background = element_rect(fill = "gray40")) +
coord_fixed() +
scale_fill_brewer(palette = "PuBu")
Создано в 2018-11-04 пакетом Представить (v0.2.1)