Добавление одной метки к каждой гистограмме - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь составить графическое изображение результатов тестов 50 учеников. Моей конечной целью было бы создать 50 вариаций гистограммы, по одной для каждого учащегося, с указанием только имени одного учащегося на оси, чтобы он / она могли видеть, как они сравниваются с другими, не раскрывая, кто что набрал. На фотографии ниже я хотел бы поставить «Джексон» на первый столбец, а остальные оставить пустым для первого варианта. Второй будет иметь только «Смит» и т. Д. Кроме того, я хотел бы разделить данные на основе их год в школе, переменная «уровень».

names <- c("Jackson", "Smith", "Johnson", "Richards", "Matthews", "Redmond", "Phillips")
scores <- c(.99, .65, .73, .89, .88, .92, .87)
level <- c(10,11,10,11,11,11,11)
grades <- cbind.data.frame(names, scores, level)


Gradesplit <- split(grades, grades$level)
plotdata <- function(grades) {
              ggplot(data = grades, aes(x = names, y = scores, fill = scores))+ 
                geom_bar(stat = "identity", position = "dodge")+ 
                theme(axis.text.x=element_text(angle= 45, vjust=.5)) +
                ggtitle("test scores by level-  February 2018", grades$level)}

lapply(Gradesplit, plotdata)

enter image description here

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Рекомендую добавить несколько образцов. Тогда студенты не могут найти закономерности и сделать выводы. Таким образом, вы можете попробовать

library(tidyverse)
# bring the data in adequat format
# In brief, a list of the same data.frame for each student
df <- 1:nrow(grades) %>% 
     purrr::map( ~grades) %>% 
     set_names(grades$names) %>% 
     bind_rows(.id = "ID") %>% 
     nest(-ID) %>%  
# the plots using purrr::map2  
     mutate(level=map2(data,ID, ~.x %>% filter(names == .y) %>% select(level))) %>% 
     mutate(data=
           map2(data, ID, ~.x %>% 
                  mutate(n=paste0("#", sample(seq_len(n()), size = n())),
                         names=ifelse(names == .y, as.character(names), n),
                         names=factor(names, levels = c(.y, sample(n, n())))))) %>%
     mutate(plots=map2(data,level, ~ggplot(data=.x,aes(x = names, y = scores, fill = scores))+ 
               geom_col() +
               ggtitle("test scores by level-  February 2018", subtitle = .y$level)
     )) 
# and or illustration purposes the first four plots
library(cowplot)
plot_grid(df$plots[[1]], df$plots[[2]], df$plots[[3]],df$plots[[4]])

enter image description here

0 голосов
/ 17 мая 2018

Требуется немного понимания, но мы можем заставить его работать. Как сказал @richardtelford, нам нужно вручную построить метки, для этого мы можем «зациклить» имена, отфильтровать по уровню каждого имени, построить вектор соответствующей длины и, наконец, построить график с такими метками:

names <- c("Jackson", "Smith", "Johnson", "Richards", "Matthews", "Redmond", "Phillips")
scores <- c(.99, .65, .73, .89, .88, .92, .87)
level <- c(10,11,10,11,11,11,11)
grades <- cbind.data.frame(names, scores, level)


library(purrr)
library(dplyr)
library(ggplot2)

grades$names %>% 
  walk(~{
    filtered_grades <- grades %>% 
      filter(level == level[names == .x]) 

    labels <- array(data = '',dim = nrow(filtered_grades))
    labels[filtered_grades$names == as.character(.x)] <- as.character(.x)

    p <- filtered_grades %>% 
      ggplot() +
      geom_col(aes(names, scores, fill = scores)) +
      scale_x_discrete(labels = labels)
      print(p)
  }) 

Создано в 2018-05-17 пакетом представ. (v0.2.0).

...