r - 以万无一失的方式覆盖离散 x 轴标签,以避免标签和数据不匹配

标签 r ggplot2

假设我有一个带有 x 轴标签的条形图,我想替换它。如何将新标签值映射到旧标签值,以确保标签正确并且标签和条形图不匹配?

ggplot2中,可以使用scale_x_discrete()中的labels参数来编辑x轴标签。通过将带有字符串的向量传递给标签,我们可以控制标签的内容及其顺序。然而,在创建标签向量时,人们可能会错误地以错误的顺序写入标签,从而以一种可能被忽视的方式使标签和数据不匹配,但实际上会创建错误的数字。

有没有办法通过指定哪个新标签与每个旧标签匹配来避免这种危险?

示例

library(ggplot2)

p <- ggplot(PlantGrowth, aes(x = group, y = weight, fill = group)) +
     geom_bar(stat = "identity")

> p

barplot

现在假设我想替换 x 轴上的标签集

我的替代标签集是
ctrl -> Moon
trt1 -> 太阳
trt2 -> 星星
p + scale_x_discrete(labels = c("sun", "moon", "stars")

moon_sun_stars

哎呀!我错误地以错误的顺序写出了标签向量。它应该是c(月亮,太阳,星星)而不是c(太阳,月亮,星星)。这种错误很容易被忽视,从而导致情节错误。 有没有办法更直接地将新标签映射到旧标签?类似于 dplyr::rename 如何为每个变量紧密指定 new_val = old_val ?那么,这种不匹配的情况就不太可能发生。

最佳答案

当然可以。您可以使用命名向量来分配新标签和值,如下所示:

library(ggplot2)

p <- ggplot(PlantGrowth, aes(x = group, y = weight, fill = group)) +
  geom_bar(stat = "identity")

p + 
  scale_x_discrete(labels = c(ctrl = "moon", trt1 = "sun", trt2 = "stars")) +
  scale_fill_manual(labels = c(ctrl = "moon", trt1 = "sun", trt2 = "stars"),
                    values = c(ctrl = "blue", trt1 = "red", trt2 = "green"))

我的首选方法是在 ggplot 调用之外预先定义标签和值的向量,而不是在 scale_xxx_xxx 内重新编码,以减少代码重复并更容易更改标签或值。

labels <- c(ctrl = "moon", trt1 = "sun", trt2 = "stars")
colors <- c(ctrl = "blue", trt1 = "red", trt2 = "green")

p + 
  scale_x_discrete(labels = labels) +
  scale_fill_manual(labels = labels, values = colors)

关于r - 以万无一失的方式覆盖离散 x 轴标签,以避免标签和数据不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63366733/

相关文章:

r - 是否有与 Python 的 '*' 等效的 R?

mysql - 使用 R 和 dplyr 探索 MySQL 数据库

java - 中断 Java 调用或回调或 R 中的类似内容

r - 印度的 R 包?

r - 如何在运行时向用户询问一个整数,如果没有得到则再次递归询问?

r - 使用 ggarrange 定位 ggplot 标签的问题

if-statement - Shiny 的多个 IF if 语句

r - ggplot和ggplotly之间的图例位置差异?

r - 饼图和条形图在同一图上对齐

将 csv 文件读入数据帧列表 r