【问题标题】:Vertical Line ggplot for x categorical variable (not date)x分类变量的垂直线ggplot(不是日期)
【发布时间】:2021-08-06 17:41:00
【问题描述】:

我有这个数据框,我试图在 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 来获取气泡图,但我想知道如何编辑它以使用我公司的标准颜色

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 轴是日期而不是其他分类值,我会看到很多信息

【问题讨论】:

  • @Miha 恕我直言,这不是一个好的欺骗目标,因为链接的问题是在连续数据具有特定 y 值的 x 位置要求垂直线。在这里,OP 要求为分类变量画一条垂直线。
  • @Walker 是否打算将等级排序为 A-、A+、B、B-、C、C-、C+、...?不应该改为 A+, A-, B, B-, C+, C, C-, ...吗?

标签: r ggplot2


【解决方案1】:

硬编码的解决方案容易出错

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

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

使用 7.5 的硬编码 xintercept

p + geom_vline(xintercept = 7.5)

在等级C-C+之间画线,而不是C+D

这可以使用有序因子来解决。但首先请注意,该图表包含另一个缺陷: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级之间画一条垂直线。

所以,我们需要在数据集中寻找等于或大于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)

【讨论】:

    【解决方案2】:

    只需添加geom_vline ;)

    p + geom_vline(xintercept = 7.5)
    

    【讨论】:

    • 我们能对我说“神圣的蝙蝠侠”吗?谢谢你!一旦我输入了数字,我想我必须明确地说 data$Gradenum=7.5,但我不知道该怎么称呼它。太简单!谢谢!!!!!!!!!
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 2012-04-04
      • 2019-05-05
      • 1970-01-01
      • 2010-12-22
      相关资源
      最近更新 更多