Как перекрывать гистограммы R

Воспроизведено из этого кода:

library(haven)
library(survey)
library(dplyr)

nhanesDemo <- read_xpt(url("https://wwwn.cdc.gov/Nchs/Nhanes/2015-2016/DEMO_I.XPT"))

# Rename variables into something more readable
nhanesDemo$fpl <- nhanesDemo$INDFMPIR
nhanesDemo$age <- nhanesDemo$RIDAGEYR
nhanesDemo$gender <- nhanesDemo$RIAGENDR
nhanesDemo$persWeight <- nhanesDemo$WTINT2YR
nhanesDemo$psu <- nhanesDemo$SDMVPSU
nhanesDemo$strata <- nhanesDemo$SDMVSTRA

nhanesAnalysis <- nhanesDemo %>%
  mutate(LowIncome = case_when(
    INDFMIN2 < 40 ~ T,
    T ~ F
  )) %>%
  # Select the necessary columns
  select(INDFMIN2, LowIncome, persWeight, psu, strata)

# Set up the design
nhanesDesign <- svydesign(id      = ~psu,
                          strata  = ~strata,
                          weights = ~persWeight,
                          nest    = TRUE,
                          data    = nhanesAnalysis)

svyhist(~log10(INDFMIN2), design=nhanesDesign, main = '')

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

Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
Уроки CSS 6
Уроки CSS 6
Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.
Что такое Css? Для чего он используется?
Что такое Css? Для чего он используется?
CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки...
0
0
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Если вы хотите построить гистограмму из своей модели, вы можете получить ее данные из model.frame (это то, что svyhist делает под капотом). Чтобы получить гистограмму, заполненную группой, вы можете использовать этот фрейм данных внутри ggplot:

library(ggplot2)

ggplot(model.frame(nhanesDesign), aes(log10(INDFMIN2), fill = LowIncome)) +
  geom_histogram(alpha = 0.5, color = "gray60", breaks = 0:20 / 10) +
  theme_classic() 


Редактировать

Как указывает Томас Ламли, это не включает веса выборки, поэтому, если вы хотите, вы можете сделать это:

ggplot(model.frame(nhanesDesign), aes(log10(INDFMIN2), fill = LowIncome)) +
  geom_histogram(aes(weight = persWeight), alpha = 0.5, 
                 color = "gray60", breaks = 0:20 / 10) +
  theme_classic() 

Чтобы продемонстрировать, что этот подход работает, мы можем воспроизвести подход Томаса в ggplot, используя пример данных из svyhist. Чтобы получить неравномерные размеры ячеек (если это желательно), нам нужны два слоя гистограммы, хотя я предполагаю, что это не потребуется для большинства случаев использования.

ggplot(model.frame(dstrat), aes(enroll)) +
  geom_histogram(aes(fill = "E", weight = pw, y = after_stat(density)),
                 data = subset(model.frame(dstrat), stype == "E"),
                 breaks = 0:35 * 100,
                 position = "identity", col = "gray50") +
  geom_histogram(aes(fill = "Not E", weight = pw, y = after_stat(density)),
                 data = subset(model.frame(dstrat), stype != "E"),
                 position = "identity", col = "gray50",
                 breaks = 0:7 * 500) +
  scale_fill_manual(NULL, values = c("#00880020", "#88000020")) +
  theme_classic()

Проблема в том, что он не использует веса выборки.

Thomas Lumley 15.02.2023 02:14

@ThomasLumley хорошая мысль. Я обновил, чтобы показать, как использовать веса выборки в рамках ggplot, включая версию ggplot вашего прекрасно продемонстрированного примера. Спасибо.

Allan Cameron 15.02.2023 11:05

Вы не можете просто извлечь данные и использовать ggplot, потому что это не будет использовать веса и поэтому упускает весь смысл svyhist. Однако вы можете использовать аргумент add=TRUE. Вам нужно правильно установить диапазоны осей x и y, чтобы убедиться, что весь график виден

Используя пример данных из ?svyhist

svyhist(~enroll, subset(dstrat,stype= = "E"), col = "#00880020",ylim=c(0,0.003),xlim=c(0,3500))
svyhist(~enroll, subset(dstrat,stype! = "E"), col = "#88000020",add=TRUE)

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