Постройте прямоугольники, используя geom_rect с непрерывной осью x и дискретными значениями по оси y (R)

Я пытаюсь построить прямоугольники по оси x для разных классов по оси y. Я хочу сделать это с помощью geom_rect, но я не хочу использовать y_min и y_max, так как я хочу, чтобы они определялись классами (то есть факторами), которые у меня есть в моих данных.

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

Пример маленькой игрушки:

data <- data.frame(x_start = c(0, 2, 4, 6),
                   x_end = c(1, 3, 5, 7),
                   y_start = c(0, 0, 2, 2),
                   y_end = c(1, 1, 3, 3),
                   info = c("x", "x", "y", "y"))

Оригинальный сюжет:

ggplot(data ,aes(xmin=x_start, xmax=x_end, ymin=y_start, ymax=y_end, fill=info)) + geom_rect()

Сюжет, который я хочу:

ggplot(data ,aes(xmin=x_start, xmax=x_end, ymin=y_start, ymax=y_end, fill=info)) + geom_rect() +
        scale_y_continuous(breaks = c(0.5,2.5), labels = c("x","y"))

Если x и y являются факторами, то числовое значение на оси y будет зависеть от их представления факторов. Похоже, вы хотите, чтобы первые две строки имели прямоугольники в (x = 0-1, y = 0,75-1,25), а следующие две в (4-5, 1,75-2-25). Просто настройте такой набор данных и постройте обычный gg-way.

IRTFM 20.11.2022 22:38

@IRTFM - не могли бы вы показать пример того, что вы имеете в виду?

GabrielMontenegro 20.11.2022 22:44

Джон Спринг дал ответ. Я не мог сказать, как, по вашему мнению, были организованы данные. Должны ли были быть определенные значения для x и y? И вы надеялись увидеть фиксированное смещение выше и ниже этих значений для границ прямоугольника? Или у вас был диапазон для x и y, и вы хотели, чтобы метки оси y располагались по центру каждого диапазона?

IRTFM 21.11.2022 01:06
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
3
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
library(dplyr)
y_lab <- data %>%
  distinct(y_end, y_start, info) %>%
  mutate(y_mid = (y_end + y_start)/2)

ggplot(data, aes(xmin=x_start, xmax=x_end, ymin=y_start, ymax=y_end, fill=info)) +
  geom_rect() +
  scale_y_continuous(breaks = y_lab$y_mid, labels = y_lab$info)

Или используя geom_tile:

ggplot(data, aes(x = (x_start + x_end)/2, y = info, fill=info, width = 1)) +
  geom_tile()

Этот код работает, но он очень похож на то, что я делал — нет ли способа просто использовать категориальную переменную для y? возможно, есть еще один geom_function, о котором я не знаю, который будет работать аналогично прямоугольникам, но может отображать категориальные переменные по оси Y?

GabrielMontenegro 22.11.2022 15:32

Отредактировано с альтернативой geom_tile(). Он параметризуется своим центром x/y и шириной/высотой и работает более автоматически с дискретными осями.

Jon Spring 22.11.2022 19:51

Это имеет большой смысл - я принял ответ!

GabrielMontenegro 23.11.2022 21:58

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