首页 > 解决方案 > 以万无一失的方式覆盖离散的 x 轴标签,以避免标签和数据不匹配

问题描述

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

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

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

例子

library(ggplot2)

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

> p

条形图

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

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

月亮太阳星星

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

标签: rggplot2

解决方案


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

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

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

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)

推荐阅读