У меня есть фрейм данных по строкам:

library(tidyverse); library(sf); library(ggplot2)
sfc <- tribble(~analyte, ~value, ~guideline, ~lat, ~long,
              "pH",     4,      5,          21,   52,
              "pH",     7,      5,          22,   53,
              "EC",     50,     100,        21,   52,
              "EC",     200,    100,        22,   53) %>%
  st_as_sf(coords = c("lat", "long"), crs = 4326)

Где у меня есть название некоторого аналитического теста в «аналите», результат теста в «значении», ориентировочное значение, которое должно быть ниже в «ориентире», и расположение точки отбора пробы в широте и долготе. Для каждого аналита существует только одно руководство.

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

ggplot(sfc) +
  geom_sf(aes(size = value)) +
  facet_wrap(~analyte)

Однако я хочу, чтобы шкала размеров изменялась для каждого аспекта, чтобы он выглядел примерно так:

value         size
0         ->  0 px
guideline ->  5 px
max(value)->  (max(value)/guideline)*5) px

С масштабированием размера, разным для каждого аспекта / аналита, но со значением 0 всегда устанавливается размер 0 пикселей, а значение, равное нормативному значению этого аналита, всегда устанавливается как 5 пикселей.

Итак, я думаю, что мне нужно использовать trans_new () для создания нового преобразования, но я изо всех сил пытаюсь понять, как я могу сообщить функции, что такое имя аналита этого аспекта, чтобы она могла найти соответствующее ориентировочное значение.

Любые идеи поощряются.

Уточнение редактирования: Глядя на график, я хотел бы увидеть как фактическую величину значения (например, pH около 10), а также величину, которую значение больше или меньше нормативного значения (например, значение pH 10 примерно вдвое превышает нормативное значение 5). Поэтому в идеале я хотел бы иметь легенду для каждого аспекта, где размер каждой точки показывает относительный размер измеренного значения по сравнению с нормативным значением, но фактические измеренные значения (а не процент нормативного значения) отображаются в виде метки на каждой легенде. .

0
vorpal 30 Окт 2021 в 08:31
Вам нужна отдельная легенда для каждого аспекта? Если нет, похоже, вы можете использовать dplyr :: case_when для изменения размеров в восходящем направлении.
 – 
Jon Spring
30 Окт 2021 в 10:32

1 ответ

Лучший ответ

Возможно, что-то подобное?

sfc %>%
  group_by(analyte) %>%
  mutate(value_scaled = value / max(value)) %>%
  ungroup() %>%
ggplot() +
  geom_sf(aes(size = value_scaled)) +
  scale_size_continuous(range = c(0, 5)) +
  facet_wrap(~analyte)

enter image description here

1
Jon Spring 30 Окт 2021 в 10:35
Что-то в этом роде ответит на вопрос, который я впервые задал. Однако я надеялся на разную шкалу для каждого аспекта с истинным значением аналита, указанным на этикетках шкалы, но размером точки, показывающим отношение истинного значения к нормативному значению.
 – 
vorpal
31 Окт 2021 в 10:39
1
Я не думаю, что есть простой способ получить отдельные легенды для каждой грани. Возможно, проще сделать отдельные графики и использовать patchwork для объединения.
 – 
Jon Spring
31 Окт 2021 в 18:35