在ggplot2中为两个facet组指定不同的x轴标签

4

我有两种方法的箱线图,每种方法都有两种验证方法和三种情况,要使用ggplot2绘制。一切正常,但我想更改x轴刻度标签以区分每组中使用的技术类型。

我使用了以下代码:

data <- read.csv("results.csv", header = TRUE, sep=',')

ggplot() + 
  geom_boxplot(data = data, aes(x = Validation, y = Accuracy, fill = Scenario)) +
  facet_wrap(~ Method) +
  labs(fill = "")

我的数据结构如下:

Method        Validation        Scenario       Accuracy
-------------------------------------------------------
Method 1      Iterations        Scenario 1     0.90
Method 1      Iterations        Scenario 2     0.80
Method 1      Iterations        Scenario 3     0.86
Method 1      Recursive         Scenario 2     0.82
Method 2      Iterations        Scenario 1     0.69
Method 2      Recursive         Scenario 3     0.75

并得到了以下的图表:

enter image description here

我只想在 Method 1 和 Method 2 中将第一个 x-tick 标签(Iterations)更改为分别是 100-iterations10-iterations
我尝试添加了以下代码,但这会同时更改两组标签。
+ scale_x_discrete(name = "Validation", 
                   labels = c("100-iterations", "Recursive", 
                              "10-iterations", "Recursive")) +

事先感谢。

1个回答

11

ggplot包的facet选项并没有为不同分面上的坐标轴标签/刻度设计(详见这里),但是在这种情况下的一个解决方法是为不同的分面变化x轴变量的值,并在facet_wrap()中设置scales = "free_x",以便每个分面的x轴仅显示相关值:

library(ggplot2)
library(dplyr)

ggplot(data %>%
         mutate(Validation = case_when(Validation == "Recursive" ~ "Recursive",
                                       Method == "Method 1" ~ "100-iterations",
                                       TRUE ~ "10-iterations")),
       aes(x = Validation, y = Accuracy, fill = Scenario)) +
  geom_boxplot() +
  facet_wrap(~ Method, scales = "free_x")

plot

数据:

set.seed(1)
data <- data.frame(
  Method = rep(c("Method 1", "Method 2"), each = 100),
  Validation = rep(c("Iterations", "Recursive"), times = 100),
  Scenario = sample(c("Scenario 1", "Scenario 2", "Scenario 3"), 200, replace = TRUE),
  Accuracy = runif(200)
)

哇!太完美了。非常感谢你的有用回答,@Z.Lin。 - Taher A. Ghaleb
很好的答案。对于这种情况,排序工作正常,但在其他情况下,您可能需要因子化x轴变量以精细控制顺序。例如,要反转顺序:mutate(Validation = factor(Validation, levels = c("Recursive", "10-iterations", "100-iterations"))) - Matt L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接