Сгруппированная гистограмма, ggplot2 в R, должна отображать одно наблюдение за раз - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть набор данных, который выглядит следующим образом:

df <- data.frame(Name=rep(c('Sarah', 'Casey', 'Mary', 'Tom'), 3), 
                 Scale=rep(c('Scale1', 'Scale2', 'Scale3'), 4), 
                 Score=sample(1:7, 12, replace=T))

Я пытаюсь создать barchat в ggplot2, который в настоящее время выглядит следующим образом:

ggplot(df, aes(x=Name, y=Score, fill=Scale)) + geom_bar(stat='identity', position='dodge') +
  coord_flip() +
  scale_y_continuous(breaks=seq(0, 7, 1), limits = c(0, 7)) +  
  scale_x_discrete() +    
  scale_fill_manual(values=c('#253494', '#2c7fb8', '#000000')) + 
  theme(panel.background = element_blank(),
        legend.position = 'right',  
        axis.line = element_line(),  
        axis.title = element_blank(),    
        axis.text = element_text(size=10)) 

Однако я хочу показывать только одно наблюдение (одно Имя) за раз. Можно ли обойтись без создания тонны отдельных наборов данных, по одному для каждого человека? Мне бы хотелось, чтобы конечный результат выглядел как приведенный ниже пример, где я могу просто перебирать имена, чтобы создать отдельный график для каждого или какой-то похожий процесс.

# Trying to avoid creating separate datasets, but for the sake of the example:
df2 <- data.frame(Name=rep(c('Sarah'), 3), 
                 Scale=c('Scale1', 'Scale2', 'Scale3'), 
                 Score=sample(1:7, 3, replace=T))

ggplot(df2, aes(x=Name, y=Score, fill=Scale)) + geom_bar(stat='identity', position='dodge') +
  coord_flip() +
  scale_y_continuous(breaks=seq(0, 7, 1), limits = c(0, 7)) +  
  scale_x_discrete() +    
  scale_fill_manual(values=c('#253494', '#2c7fb8', '#000000')) + 
  theme(panel.background = element_blank(),
        legend.position = 'right',  
        axis.line = element_line(),  
        axis.title = element_blank(),    
        axis.text = element_text(size=10)) 

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Так как ваши данные уже аккуратны т.е.в длинном формате вы можете использовать facet_wrap как предложено и установить шкалы как "free", создавая таким образом фасеты с различными группами имен.

df %>% ggplot(aes(y = Score, x = Name)) +
  geom_bar(stat = "identity", aes(colour = Scale, fill = Scale),
           position = "dodge") +
  coord_flip() + 
  facet_wrap(~Name, scales = "free")

Вы можете избавиться от меток фасетов или меток осей.в зависимости от того, что вы предпочитаете.

РЕДАКТИРОВАТЬ: в ответ на комментарий.Вы можете использовать один и тот же фрейм данных для создания отдельных графиков, просто вставив фильтр в начале, следовательно,

df %>% 
  filter(Name == "Sarah") %>%
  ggplot(aes(y = Score, x = Name)) +
  geom_bar(stat = "identity", aes(colour = Scale, fill = Scale),
           position = "dodge") +
  coord_flip()

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

for(i in c("Sarah", "Casey", "Mary", "Tom")){
  df %>% 
    filter(Name == i) %>%
    ggplot(aes(y = Score, x = Name)) +
    geom_bar(stat = "identity", aes(colour = Scale, fill = Scale),
             position = "dodge") +
    coord_flip()
}

Если вы хотите объединить все это в группу, вы можете использовать ggpubr::ggarrange, чтобы поместить все графики в один и тот же объект.

0 голосов
/ 12 апреля 2019
  • facet_grid (. ~ Имя)

Может быть, каким-то образом это реализовать, он построит их все, но должен делать это на отдельных участках.

...