条形图颜色取决于R中的条件值

时间:2017-03-18 19:11:09

标签: r ggplot2

因此,我试图为学生成绩的条形图着色,这取决于他们是否通过了某项考试。

为了做到这一点,我读了两个单独的.csv文件并构建了数据,因此它按某个变量排序。以下是其中一个数据集的负责人:

 head(Y)
  fName mid lab exam overall
1 OOJOE  50  94 77.5      77
2 JWTWB  45  50 60.5      54
3 XQXQA  65  78 69.0      71
4 PVTMX  35  84 30.5      47
5 ZZBDP  70 100 74.0      81
6 JVYMA  65  96 73.5      79

其他数据集(X)包含有关学生出勤率等的信息。 我为每个学生制作了一个箱线图,显示出席人数中位数(使用数据集X),但我的总体目标是根据每个学生的总成绩是否达到40(来自数据集Y)来为箱图着色。

我正在使用ggplot ...这是我到目前为止所尝试的内容:

ggplot(data=X,aes(x=fName, y=delay, group=fName)) + 
  geom_boxplot(color = Y$overall <40) + 
  scale_colour_manual(name = 'overall < 40', values = setNames(c('red','green'),c(T, F))) + 
  coord_flip()

但这只是告诉我这是一个无效的颜色名称......我也试过了:

ggplot(data=X,aes(x=fName, y=delay, group=fName)) + 
  geom_boxplot(color =  ifelse(Y$overall >= 40,'red','green')) +
  coord_flip()

这确实将箱形图分成两种不同的颜色......但是它没有正确地执行它(即,它没有着色值&gt; = 40红色而所有其他颜色都是绿色...它似乎只是随机分配一些学生红色和一些绿色)。我怀疑它不起作用,因为ifelse命令与ggplot不兼容,但我不确定。

关于我如何解决此问题的任何建议?

编辑: 这是X的头部,只是为了显示延迟列的一个例子:

head(X)
  fName    Information                fTime            min.Time.     delay
1 ARONR Course outline 2010-09-22T09:16:00Z 2010-09-20T20:21:00Z 1.5381944
2 ARONR    Lab  Dec 13 2010-12-11T17:21:00Z 2010-12-09T12:20:00Z 2.2090278
3 ARONR      Lab Nov 1 2010-11-03T11:10:00Z 2010-10-28T17:21:00Z 5.7423611
4 ARONR     Lab Nov 22 2010-11-22T14:16:00Z 2010-11-22T11:51:00Z 0.1006944
5 ARONR     Lab Nov 29 2010-11-29T15:04:00Z 2010-11-25T18:00:00Z 3.8777778
6 ARONR      Lab Nov 8 2010-11-10T11:07:00Z 2010-11-05T19:12:00Z 4.6631944

这里有一些额外的数据,只有一个学生帮助在共同密钥下合并: Y数据集:

fName mid lab exam overall
ZZBDP  70 100 74.0      81

X数据集:

fName    Information                fTime            min.Time.     delay
ZZBDP  Lecture Dec 1 2010-12-01T13:02:00Z 2010-12-01T12:31:00Z 2.152778e-02                 ZZBDP  Lecture Dec 8 2010-12-08T08:49:00Z 2010-12-07T16:43:00Z 6.708333e-01
ZZBDP Lecture Nov 10 2010-11-10T11:14:00Z 2010-11-09T13:35:00Z 9.020833e-01
ZZBDP Lecture Nov 17 2010-11-17T18:25:00Z 2010-11-17T10:31:00Z 3.291667e-01
ZZBDP Lecture Nov 24 2010-11-24T09:23:00Z 2010-11-23T11:35:00Z 9.083333e-01

1 个答案:

答案 0 :(得分:1)

通过将更新后的XY data.frames转换为data.tables,然后在fName上合并它们,我得到以下data.tabledt ):

library(data.table)
library(ggplot2)
X <- structure(list(fName = c("ZZBDP", "ZZBDP", "ZZBDP", "ZZBDP", 
      "ZZBDP"), Information = c("Lecture Dec 1", "Lecture Dec 8", "Lecture Nov 10", 
      "Lecture Nov 17", "Lecture Nov 24"), fTime = c("2010-12-01T13:02:00Z", 
      "2010-12-08T08:49:00Z", "2010-11-10T11:14:00Z", "2010-11-17T18:25:00Z", 
      "2010-11-24T09:23:00Z"), min.Time. = c("2010-12-01T12:31:00Z", 
      "2010-12-07T16:43:00Z", "2010-11-09T13:35:00Z", "2010-11-17T10:31:00Z", 
      "2010-11-23T11:35:00Z"), delay = c(0.0215, 0.671, 0.902, 0.329, 
      0.908)), .Names = c("fName", "Information", "fTime", "min.Time.", 
      "delay"), row.names = c(NA, -5L), class = "data.frame")  

Y <- structure(list(fName = c("OOJOE", "JWTWB", "XQXQA", "PVTMX", 
      "ZZBDP", "JVYMA"), mid = c(50L, 45L, 65L, 35L, 70L, 65L), lab = c(94L, 
      50L, 78L, 84L, 100L, 96L), exam = c(77.5, 60.5, 69, 30.5, 74, 
      73.5), overall = c(77L, 54L, 71L, 47L, 81L, 79L)), .Names = c("fName", 
      "mid", "lab", "exam", "overall"), row.names = c(NA, -6L), class = "data.frame")  

# Convert to data.table
setDT(X)
setDT(Y)

# Merge X and Y on fName and store in dt
dt <- Y[X, on="fName"]

>dt
   fName mid lab exam overall    Information                fTime            min.Time.  delay
1: ZZBDP  70 100   74      81  Lecture Dec 1 2010-12-01T13:02:00Z 2010-12-01T12:31:00Z 0.0215
2: ZZBDP  70 100   74      81  Lecture Dec 8 2010-12-08T08:49:00Z 2010-12-07T16:43:00Z 0.6710
3: ZZBDP  70 100   74      81 Lecture Nov 10 2010-11-10T11:14:00Z 2010-11-09T13:35:00Z 0.9020
4: ZZBDP  70 100   74      81 Lecture Nov 17 2010-11-17T18:25:00Z 2010-11-17T10:31:00Z 0.3290
5: ZZBDP  70 100   74      81 Lecture Nov 24 2010-11-24T09:23:00Z 2010-11-23T11:35:00Z 0.9080

以上data.table包含自变量(fName),因变量(delay)和用于着色的变量(overall)。

制作delay vs fName的箱线图,其中大于或等于40的overall分数为红色(以及40以下的绿色),请使用:

ggplot(dt, aes(x = fName, y = delay, group = fName, color = overall >= 40)) + 
  geom_boxplot() + scale_color_manual(values = c("red", "green")) +
  coord_flip()

enter image description here