【问题标题】:Adding one label to each bar graph r为每个条形图添加一个标签 r
【发布时间】:2018-05-17 14:07:25
【问题描述】:

我正在尝试对 50 名学生的考试成绩进行图形描述。我的最终目标是创建 50 个条形图的变体,每个学生一个,轴上只有一个学生的名字,这样他/她就可以看到他们与其他人的比较,而不会透露谁得分什么。在下面的照片中,我想将“Jackson”放在第一个小节上,而其他的留空作为第一个变体。第二个只有“Smith”等。另外,我想根据他们在校的年份,变量“level”来拆分数据。

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)

【问题讨论】:

  • 也许可以使用scale_x_discrete 并设置标签,但仅显示直方图不是更容易吗?

标签: r ggplot2 bar-chart graphing


【解决方案1】:

我建议添加一些采样。然后学生无法找到规律并得出结论。 因此,您可以尝试

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]])

【讨论】:

  • 我真的很喜欢这个解决方案,@Jimbou,但是在修改变量名称以适合我的实际数据集后,我收到以下错误,我不确定为什么或者您是否可以提供一些见解“mutate_impl 中的错误(.data, dots) :评估错误:列n 的长度必须为 43(行数)或 1,而不是 42。"
  • 嗯,很难说您的数据何时与grades data.frame 完全一样。请检查nest(-ID) 之后的输出。所有数据框 data 必须具有相同的 nrow 然后是 ID 列。
【解决方案2】:

这需要一点理解,但我们可以让它发挥作用。 正如@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)
  }) 

reprex package (v0.2.0) 于 2018 年 5 月 17 日创建。

【讨论】:

    猜你喜欢
    • 2011-04-07
    • 2013-06-02
    • 2018-07-20
    • 2018-11-16
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    相关资源
    最近更新 更多