垂直线ggplot用于x分类变量(不是日期)

时间:2017-07-28 14:50:14

标签: r ggplot2

我有这个数据框,我试图在x轴上做一个绝对的垂直线。

data <- data.frame(
  condition = c('1', '1', '1', '1', '1', '2', '2', '2', '2', '2', '3', '3', '3', '3', '3'),
  AssessmentGrade = c('400', '410', '420', '430', '440', '500', '510', '520', '530', '540', 
                      '300', '310', '320', '330', '340'), 
  Freq = c('1', '2', '1', '5', '7', '9', '1', '5', '3', '4', '5', '8', '1', '3', '5'), 
  MathGrade = c('A+', 'B-', 'C-', 'D', 'F', 'A-', 'B', 'C+', 'D-', 'F', 'A+', 'D', 'D', 'F', 'C'), 
  Condition = c('Condition 1', 'Condition 1', 'Condition 1', 'Condition 1', 'Condition 1', 
                'Condition 2', 'Condition 2', 'Condition 2', 'Condition 2', 'Condition 2', 
                'Condition 3', 'Condition 3', 'Condition 3', 'Condition 3', 'Condition 3'))

我尝试添加一个字段来制作成绩数字,这有助于

data$Gradenum <- as.numeric(data$MathGrade)

我使用ggplot来获取abubble图,但我想知道如何编辑它以使用我公司的标准颜色

p <- ggplot(data, aes(x = MathGrade, y = AssessmentGrade, size = Freq, fill = Condition)) +
 geom_point(aes(colour = Condition)) +
 ggtitle("Main Title") +
 labs(x = "First Math Grade", y = "Math Assessment Score")

如何在C +和D之间获得垂直线?如果您的x轴是日期而不是其他分类值,我会看到很多信息

3 个答案:

答案 0 :(得分:2)

硬编码解决方案容易出错

MrSnake's solution有效 - 但仅适用于给定的数据集,因为7.5的值是硬编码的

只需对数据稍作更改即会失败,例如,将"A+"的第1行中的成绩data替换为"A"

使用硬编码的xintercept 7.5

p + geom_vline(xintercept = 7.5)

绘制等级 C - C + 之间的界限,而不是 C + D

enter image description here

这可以使用有序因子来解决。但首先要注意的是,该图表包含另一个缺陷:x轴上的等级按字母顺序排列

  

A,A-,A +,B,B-,C,C-,C +,D,D-,F

我希望

  

A +,A,A-,B,B-,C +,C,C-,D-,D-,F

固定x轴

可以通过将MathGrade转换为具有给定顺序级别的有序因子来解决此问题:

grades <- c(as.vector(t(outer(LETTERS[1:4], c("+", "", "-"), paste0))), "F")
grades
 [1] "A+" "A"  "A-" "B+" "B"  "B-" "C+" "C"  "C-" "D+" "D"  "D-" "F"
data$MathGrade <- ordered(data$MathGrade, levels = grades)

factor()足以绘制正确排序的x轴,但我们需要一个有序因子用于下一步,正确放置垂直线。

以编程方式放置垂直线

假设应在等级 C - D + 之间绘制垂直线。但是,可能会发生数据中缺少其中一个或两个等级的情况。遗漏因素不会被绘制出来。在样本数据集中,没有等级为 D + 的数据,因此应在等级 C - D 之间绘制垂直线。< / p>

因此,我们需要在数据集中寻找等于或大于等级 D + 的最低等级以及等于或小于 C - 的最高等级:

upper <- as.character(min(data$MathGrade[data$MathGrade >= "D+"]))
lower <- as.character(max(data$MathGrade[data$MathGrade <= "C-"]))

这些是实际数据集中的等级,其中垂直线绘制在:

之间
xintercpt <- mean(which(levels(droplevels(data$MathGrade)) %in% c(lower, upper)))
p + geom_vline(xintercept = xintercpt)

enter image description here

答案 1 :(得分:1)

只需添加geom_vline;)

p + geom_vline(xintercept = 7.5)

enter image description here

答案 2 :(得分:0)

要更改颜色以适合您的公司计划,您可以添加以下内容:

  + scale_color_manual(values = c('Condition 1' = 'grey20', 
                                'Condition 2' = 'darkred', 
                                'Condition 3' = 'blue'))