График с двумя осями ggplot2 с вектором символов на вторичной оси

Я хочу включить вторичную ось Y в свой график коэффициентов. На вторичной оси я хочу отобразить переменную, содержащую точечные оценки и их 95% ДИ. Примеры, которые я видел до сих пор, работают, если информация на вторичной оси является числовой, но моя переменная является символьной. Например, на изображении ниже вторичная ось Y показывает p-значение, а решение здесь не работает для символьных переменных enter image description here.

В приведенном ниже примере данных я хочу показать переменную с пометкой «оценки», где P-значение показано на приведенном ниже примере.

structure(list(Exposure = c("Organic Carbon", "Organic Carbon", 
"Organic Carbon", "Organic Carbon", "Black Carbon", "Black Carbon", 
"Black Carbon", "Black Carbon", "Carbon Monoxide", "Carbon Monoxide", 
"Carbon Monoxide", "Carbon Monoxide"), `Unit Increase` = c("1 µg/m3", 
"1 µg/m3", "1 µg/m3", "1 µg/m3", "1 µg/m3", "1 µg/m3", "1 µg/m3", 
"1 µg/m3", "10 ppbv", "10 ppbv", "10 ppbv", "10 ppbv"), Models = c("Model 1", 
"Model 2", "Model 3", "Model 4", "Model 1", "Model 2", "Model 3", 
"Model 4", "Model 1", "Model 2", "Model 3", "Model 4"), mean = c(1.00227974541066, 
0.985112091974051, 0.983374917346068, 0.981911815085857, 1.05170784539884, 
0.866397662179956, 0.852380008027597, 0.843141476496602, 1.0285956205419, 
1.01469851838101, 1.01167376733896, 1.01112354142356), sd = c(0.009168606994035, 
0.00941380294243673, 0.00930958569680644, 0.00931923969816641, 
0.0923351388901415, 0.0926479017865309, 0.0923142930597128, 0.0916749212837342, 
0.000753411222911813, 0.000758915467329065, 0.000747152757518728, 
0.000748722745120326), lci = c(0.984429504585927, 0.967102723558839, 
0.96559452133446, 0.964139630281724, 0.877605428442938, 0.722528919823888, 
0.711303894242616, 0.704476676931527, 1.01351836592852, 0.999717112334597, 
0.996966839004107, 0.996393951145291), uci = c(1.02045365704779, 
1.00345683050333, 1.0014827204373, 1.00001159824068, 1.26034930530902, 
1.03891330635438, 1.02143638459725, 1.00910019120188, 1.04389716670672, 
1.02990443046443, 1.02659764746465, 1.02607087773444), estimates = c("1.002 (0.984 - 1.020)", 
"0.985 (0.967 - 1.003)", "0.983 (0.966 - 1.001)", "0.982 (0.964 - 1.000)", 
"1.052 (0.878 - 1.260)", "0.866 (0.723 - 1.039)", "0.852 (0.711 - 1.021)", 
"0.843 (0.704 - 1.009)", "1.029 (1.014 - 1.044)", "1.015 (1.000 - 1.030)", 
"1.012 (0.997 - 1.027)", "1.011 (0.996 - 1.026)")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -12L))

До сих пор я пробовал это

df %>% 
  ggplot(aes(x=mean, y= interaction(`Unit Increase`,Exposure, sep = "&"), colour=Models)) + 
  scale_color_brewer(palette="Set1",
                     breaks=c("Model 1","Model 2","Model 3", "Model 4")) + 
  geom_vline(xintercept = 1) + 
  geom_point(position = position_dodge(width=.75)) + 
  geom_errorbarh(aes(xmin = lci, xmax=uci), position=position_dodge(width=.75), height=0) + 
  labs(x="Odds Ratio", y="Exposures (Unit of Increase)", colour="Models") +
  guides(
    y = guide_axis_nested(delim = "&", n.dodge = 1)) +
  theme(
    axis.text.y.left = element_text(margin = margin(r = 5, l = 5)),
    ggh4x.axis.nesttext.y = element_text(margin = margin(r = 6, l = 6)),
    ggh4x.axis.nestline = element_blank()) + 
  theme_classic()

и получил вот такой результат (без второй оси)

enter image description here

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Дискретные шкалы не поддерживают дополнительные оси, см. проблема. Тем не менее, вы можете обойти это, используя ggh4x::guide_axis_manual(). Это немного больно, где именно должны быть разрывы (я сжульничал, посмотрев на layer_data()).

library(ggplot2)
library(ggh4x)

# df <- structure(...) # omitted for brevity

ggplot(df, aes(x=mean, y = interaction(`Unit Increase`, Exposure, sep = "&"), 
               colour=Models)) + 
  scale_color_brewer(palette="Set1",
                     breaks=c("Model 1","Model 2","Model 3", "Model 4")) + 
  geom_vline(xintercept = 1) + 
  geom_point(position = position_dodge(width=.75)) + 
  geom_errorbarh(aes(xmin = lci, xmax=uci), position=position_dodge(width=.75), height=0) + 
  labs(x="Odds Ratio", y="Exposures (Unit of Increase)", colour="Models") +
  guides(
    y = guide_axis_nested(delim = "&", n.dodge = 1),
    y.sec = guide_axis_manual(
      breaks = as.vector(outer(c(-0.28125, -0.09375, 0.09375, 0.28125), 1:3, "+")),
      labels = df$estimates
    )
  ) +
  theme_classic() +
  theme(
    axis.text.y.left = element_text(margin = margin(r = 5, l = 5)),
    ggh4x.axis.nesttext.y = element_text(margin = margin(r = 6, l = 6)),
    ggh4x.axis.nestline.y = element_blank())

Created on 2022-05-16 by the reprex package (v2.0.1)

ggh4x пакет действительно полезный пакет.
TarJae 16.05.2022 20:49

@teunbrand спасибо. пакет ggh4x действительно полезен.

Ekow_ababio 16.05.2022 20:52

@teunbrand, можете ли вы показать мне, как вы использовали функцию layer_data (с просьбой использовать ее в будущем в других случаях). Я попытался, но получил одну строку результата со следующими заголовками: xintercept, PANEL, group, color size, linetype, alpha

Ekow_ababio 17.05.2022 14:05

Да, я думаю, вам нужно указать номер слоя с аргументом i.

teunbrand 17.05.2022 18:52

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