Вопрос или проблема
Я пытаюсь добиться корректного выравнивания строк в своей таблице с соответствующими точками IRR на графике (например, значения для A выравниваются с точкой IRR для A на графике).
В частности, я создаю лесной график, который включает в себя график и соответствующие таблицы данных. Каждая точка на лесном графике представляет собой отношение коэффициентов заболеваемости (IRR) на основе их воздействия на заданное recreational вещество. Для каждого вещества есть две группы. Две группы для воздействия каннабиса – A и B, группы для никотина – C и D, а группы для алкоголя – E и F. Две колонки данных содержат откорректированные и не откорректированные значения IRR.
Вот мой текущий график ниже:
Вот код:
# Загрузить необходимые библиотеки
library(tibble)
library(ggplot2)
library(dplyr)
library(forcats)
library(stringr)
library(patchwork) # Для компоновки графиков
# Определить данные
res <- tibble(
model = c("Каннабис", "A", "B", "Никотин", "C", "D", "Алкоголь", "E", "F"),
estimate = c(NA, 1.08, 1.01, NA, 1.06, 1.07, NA, 1.09, 1.22),
conf.low = c(NA, 1.02, .99, NA, 1.04, 1.03, NA, 1.07, 1.11),
conf.high = c(NA, 1.14, 1.05, NA, 1.08, 1.11, NA, 1.11, 1.33),
estimate2 = c(NA, 1.09, 1.02, NA, 1.03, 1.06, NA, 1.07, 1.2),
conf.low2 = c(NA, 1.03, .99, NA, 1.01, 1.04, NA, 1.05, 1.1),
conf.high2 = c(NA, 1.15, 1.05, NA, 1.05, 1.08, NA, 1.09, 1.3)
)
# Преобразовать 'model' в фактор с указанным порядком уровней и обратить его
res$model <- factor(res$model, levels = rev(c("Каннабис", "A", "B", "Никотин", "C", "D", "Алкоголь", "E", "F")))
# Создать лесной график на логарифмической шкале (средняя часть фигуры)
p_right <- res %>%
ggplot(aes(y = model)) + # Использовать 'model' как y с обратным фактором
theme_classic() +
# Построить линейные отрезки только для ненулевых значений
geom_linerange(data = subset(res, !is.na(estimate)), aes(xmin = conf.low, xmax = conf.high)) +
# Построить точки только для ненулевых значений
geom_point(data = subset(res, !is.na(estimate)), aes(x = estimate),
color = "black", fill = c("cyan2", "cyan2", "orange", "orange", "purple", "purple"),
shape = 21, size = 3, stroke = 0.5, position = position_dodge(width = 0.5)) +
labs(x = "Отношение коэффициентов заболеваемости") +
coord_cartesian(ylim = c(1, 9), xlim = c(.5, 1.5)) +
geom_vline(xintercept = 1, linetype = "dashed") +
annotate("text", x = 1.3, y = 9, label = "Более высокий риск") +
annotate("text", x = .7, y = 9, label = "Низкий риск") +
theme(
axis.line.y = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = element_text(size = 10), # Отображение текста по оси y для читабельности
axis.title.y = element_blank()
)
# Упорядочить результаты в форме таблицы до построения графика для меток средней стороны
res_plot <- res %>%
mutate(
across(c(estimate, conf.low, conf.high), ~ str_pad(round(.x, 2), width = 4, pad = "0", side = "right")),
estimate_lab = paste0(estimate, " (", conf.low, "-", conf.high, ")")
)
# Упорядочить результаты в форме таблицы до построения графика для меток левой стороны
res_plot2 <- res %>%
mutate(
across(c(estimate2, conf.low2, conf.high2), ~ str_pad(round(.x, 2), width = 4, pad = "0", side = "right")),
estimate_lab2 = paste0(estimate2, " (", conf.low2, "-", conf.high2, ")")
)
# Средняя сторона графика
p_mid <- res_plot %>%
ggplot(aes(y = model)) +
geom_text(aes(x = 1, label = ifelse(!is.na(estimate), estimate_lab, "")),
hjust = 0) +
theme_void() +
coord_cartesian(xlim = c(0, 4))
# Левая сторона графика
p_left <- res_plot2 %>%
ggplot(aes(y = model)) +
geom_text(aes(x = 0, label = model), hjust = 0, fontface = "bold") +
# Отображать текст estimate_lab только тогда, когда он не NA
geom_text(aes(x = 1, label = ifelse(!is.na(estimate2), estimate_lab2, "")),
hjust = 0) +
theme_void() +
coord_cartesian(xlim = c(0, 4))
# Дизайн компоновки (верх, левая, нижняя, правая)
layout <- c(
area(t = 0, l = 2, b = 10, r = 3),
area(t = 0, l = 2, b = 10, r = 9),
area(t = 0, l = 6, b = 10, r = 11)
)
# Финальная компоновка графика
final_plot <- p_left + p_mid + p_right + plot_layout(design = layout)
final_plot
Любые советы о том, как добиться выравнивания точек на графике с их строками, будут очень полезны. Большое спасибо!
Ответ или решение
Чтобы добиться правильного выравнивания точек IRR на лесном графике с соответствующими строками таблицы в R, необходимо провести несколько шагов, обеспечивающих точную настройку графика и его компонентов.
Шаг 1: Убедитесь, что данные правильно структурированы
Первоначально необходимо подтвердить, что данные в tibble
верно оформлены и организованы. Это важный этап, поскольку любые ошибки в данных могут привести к неправильному отображению графиков. Убедитесь, что вы используете корректные значения для сравнения и что отсутствующие значения (NA) правильно обрабатываются.
Шаг 2: Программирование лесного графика
В вашем коде я вижу, что вы правильно используете пакет ggplot2
для создания графика. Однако необходимо убедиться в использовании соответствующих уровней для фактора model
, чтобы гарантировать, что график строится в правильном порядке.
Шаг 3: Создание графика
Вы можете использовать код ниже, чтобы устранить проблему с выравниванием. Обратите внимание на использование position_dodge()
для обеспечения правильного размещения точек и линий:
# Программирование лесного графика
p_right <- res %>%
ggplot(aes(y = model)) +
theme_classic() +
geom_linerange(data = subset(res, !is.na(estimate)), aes(xmin = conf.low, xmax = conf.high)) +
geom_point(data = subset(res, !is.na(estimate)), aes(x = estimate),
color = "black", shape = 21, size = 3, stroke = 0.5, position = position_dodge(width = 0.5)) +
labs(x = "Индекс частоты заболеваемости") +
coord_cartesian(ylim = c(1, 9), xlim = c(.5, 1.5)) +
geom_vline(xintercept = 1, linetype = "dashed") +
annotate("text", x = 1.3, y = 9, label = "Выше риск") +
annotate("text", x = .7, y = 9, label = "Ниже риск") +
theme(
axis.line.y = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = element_text(size = 10),
axis.title.y = element_blank()
)
Шаг 4: Подготовка таблиц с подписями
Убедитесь, что ваши подписи (labels) также имеют соответствующий порядок для соответствия с графиком. Используйте их в функции geom_text()
:
# Таблица для предварительной подготовки меток
res_plot <- res %>%
mutate(
across(c(estimate, conf.low, conf.high), ~ str_pad(round(.x, 2), width = 4, pad = "0", side = "right")),
estimate_lab = paste0(estimate, " (", conf.low, "-", conf.high, ")")
)
# График с метками
p_mid <- res_plot %>%
ggplot(aes(y = model)) +
geom_text(aes(x = 1, label = ifelse(!is.na(estimate), estimate_lab, "")),
hjust = 0) +
theme_void() +
coord_cartesian(xlim = c(0, 4))
Шаг 5: Компоновка графиков
Наконец, убедитесь, что компоновка графиков осуществлена правильно, а все компоненты (графики и таблицы) имеют соответствующие области отображения.
# Компоновка финального графика
final_plot <- p_left + p_mid + p_right + plot_layout(design = layout)
final_plot
Заключение
Проведя вышеперечисленные шаги, вы должны быть в состоянии устранить проблемы с выравниванием точек IRR на лесном графике с соответствующими строками таблицы. Полная проверка и структурирование данных, использование функций пакета ggplot2
и правильное выставление аргументов должны обеспечить желаемый результат. Если у вас есть другие вопросы или потребности в уточнении, не стесняйтесь задавать их.