Как показать диапазон значений шкалы при построении графика на линейчатой ​​диаграмме в R - PullRequest
0 голосов
/ 09 октября 2019

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

Например, если у меня средний балл 3 по шкале, состоящей из 5 предметов с 5-балльной шкалой Лайкерта, я также хочу посмотреть, варьировался ли мой индивидуальный рейтинг предметов от 1-5 (имеется в виду Iбыло повсеместно, в среднем 3) или 2-4 (то есть я более последовательно набирал около 3).

Изначально я просто собирался делать шкалы ошибок, но мне нужно, чтобы он отображал диапазон оценок, а не стандартную ошибку или доверительный интервал. Я использую ggplot2 и в идеале мне нужно придерживаться этого пакета R из-за некоторых других кодировок, для которых он мне нужен.

# Make some data
dat <- data.frame(Item1=c(1,2,2,4,5), Item2=c(3,3,1,5,2), Item3=c(1,5,5,4,5), 
                  Item4=c(1,4,3,4,2), Item5=c(3,2,3,4,3))

# Find mean scores
for (i in 1:nrow(dat)) {
  dat$ScaleMean[i] <- round(rowMeans(dat, na.rm=T)[i],2)  
}

# Find cohort mean
dat$CoScaleMean <- round(mean(dat$ScaleMean, na.rm=T), 2)

# Add participant IDs
dat$ID <- c(1,2,3,4,5)

# Create long data format
dat.long3 <- melt(dat, id.vars=c('ID'), 
                 measure.vars=c('ScaleMean', 'CoScaleMean'))

# Rename variable and value columns
colnames(dat.long3)[c(2,3)] <- c('Scale', 'Score')

# Bar chart
dat.long3 %>% 
  filter(ID == 1) %>%
  ggplot(aes(x=Scale, y=Score)) + 
  geom_bar(aes(x=Scale, y=Score, fill=Scale), stat = 'identity', width=.9, alpha=1, position='dodge') +
  coord_flip() +
  ggtitle(label='Scale Name') +
  scale_y_continuous(breaks=seq(0, 5, 1), limits = c(0, 5), expand=c(0,0)) +  
  scale_x_discrete(labels=element_blank()) +    
  scale_fill_manual(label=paste0(c('Your Score', 'Cohort Score')), values=c('gold', 'darkorange')) + 
  guides(fill = guide_legend(nrow = 2, reverse = TRUE)) +
  geom_text(aes(x=Scale, label=Score, y=1), size=5, color='#000000')

Это для другого человека, который запрашивает визуальное представление в диаграмме (не таблица) и должен держать его в форме гистограммы (без рамок и т. д.). Я не уверен, какие еще есть варианты для достижения этой цели, если таковые имеются? Ваша помощь очень ценится!

1 Ответ

0 голосов
/ 09 октября 2019

Вы можете создать пользовательскую метку с пакетом glue и вызвать ее в geom_text. Начиная после dat$ID <- c(1, 2, 3, 4, 5):

library(dplyr)
library(tidyr)
library(purrr)
library(glue)

dat <- dat %>% 
  nest(items = Item1:Item5) %>% 
  mutate(min = map_dbl(items, min), 
         max = map_dbl(items, max),
         ScaleMean = glue("{ScaleMean} [{min}-{max}]"),
         CoScaleMean = glue("{CoScaleMean} [{min}-{max}]")) %>% 
  select(ID, ScaleMean, CoScaleMean)

# Create long data format
dat.long3 <- melt(dat, id.vars=c('ID'), 
                  measure.vars=c('ScaleMean', 'CoScaleMean'))

dat.long3 <- dat.long3 %>% 
  separate(value, into = c("value", "range"), sep = " ") %>% 
  mutate(value = as.numeric(value))

# Rename variable and value columns
colnames(dat.long3)[c(2,3)] <- c('Scale', 'Score')

# Bar chart
dat.long3 %>% 
  mutate(label = glue("{Score} {range}")) %>% 
  dplyr::filter(ID == 1) %>%
  ggplot(aes(x=Scale, y=Score)) + 
  geom_bar(aes(x=Scale, y=Score, fill=Scale), stat = 'identity', width=.9, alpha=1, position='dodge') +
  coord_flip() +
  ggtitle(label='Scale Name') +
  scale_y_continuous(breaks=seq(0, 5, 1), limits = c(0, 5), expand=c(0,0)) +  
  scale_x_discrete(labels=element_blank()) +    
  scale_fill_manual(label=paste0(c('Your Score', 'Cohort Score')), values=c('gold', 'darkorange')) + 
  guides(fill = guide_legend(nrow = 2, reverse = TRUE)) +
  geom_text(aes(x=Scale, label=label, y=1), size=5, color='#000000')
...