【问题标题】:Bar plot colour depending on conditional value in R条形图颜色取决于 R 中的条件值
【发布时间】:2017-08-10 06:18:46
【问题描述】:

因此,我尝试根据学生是否通过某项考试来为学生成绩的条形图着色。

为此,我读取了两个单独的 .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()

这确实将箱线图分成两种不同的颜色......但它没有正确地做到这一点(即,它没有将值> = 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

【问题讨论】:

  • 什么是delay?它不在您的 data.frame 中
  • 延迟是来自 X 数据集的变量。它是一个浮点数(例如:1.5381944),用于衡量学生访问在线材料所花费的时间......这个特定问题的箱线图显示了每个学生的延迟中位数(而不是上面提到的出勤率)

标签: r ggplot2


【解决方案1】:

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

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

要制作delayfName 的箱线图,其中overall 得分大于或等于40 为红色(低于40 为绿色),请使用:

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

【讨论】:

  • 感谢您的帮助...但这是我遇到的问题...我正在阅读两个单独的 .csv 文件(我称之为 X 和 Y)。数据集 X 包含变量延迟,而数据集 Y 具有整体变量。我已经编辑了主要问题以显示 X 的头部。您是否建议我将延迟列从 X 连接到数据集 Y 并使用 gglplot,还是有其他方法?
  • 好的,然后我将使用 data.table 使用公共键(fName?)合并 X 和 Y,然后绘制合并的数据。您的 X 和 Y 示例不包含通用键,因此我无法提供示例。如果您需要这方面的帮助,请提供同一个人的 X 和 Y 数据。
  • 好的,我将编辑主要问题以提供有关单个学生的一些数据...感谢您的所有帮助...我不确定如何使用公共密钥进行合并。
猜你喜欢
  • 2021-06-25
  • 1970-01-01
  • 2015-09-27
  • 2013-02-11
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2015-09-06
相关资源
最近更新 更多