在 x 轴上的离散组之间添加刻度

Posted

技术标签:

【中文标题】在 x 轴上的离散组之间添加刻度【英文标题】:Add ticks in-between discrete groups on x-axis 【发布时间】:2018-10-01 16:43:02 【问题描述】:

我想将我的一个分组箱线图(如下)替换为前后类型,但保持分组。这是使用来自ggpubrggboxplot() 制作的。我知道还有ggpaired(),但我无法将其分组为这样。

感谢this question,我能够创建像这样的分组前后图。我现在想将轴从 4 个标记更改为 2 个(只是“是”和“否”,因为“之前”和“之后”仍在图例中。

这是我的带有虚拟数据的代码:

library(tidyverse)

set.seed(123)
data.frame(ID = rep(LETTERS[1:10], 2),
           consent = rep(sample(c("Yes", "No"), 10, replace = T), 2),
           height = sample(rnorm(20, 170, sd = 10)),
           ind = rep(c("before", "after"), each = 2)
           ) %>%
  ggplot(aes(x = interaction(ind, consent), y = height, color = ind))+
  geom_point()+
  geom_line(aes(group = interaction(ID, consent)), color = "black")+
  scale_x_discrete("response")

甚至可以减少轴上的类别数量吗?或者我可以使用ggpaired() 创建分组图,但不使用分面?

【问题讨论】:

你有不想使用构面的理由吗? 愚蠢的理由 - 我不喜欢它的外观 :-) 另外,我需要让我的图表尽可能相似。不过,我找到了一种调整主题的方法。所以我最终还是使用了方面.. 嘿,这是正当的理由! 【参考方案1】:

解决方案可以是创建虚拟数值变量(在之前和之后之间)并将其放在 x 轴上。然后你可以改变它的名字。

# Generate OP data
library(tidyverse)
set.seed(123)
df <- data.frame(ID = rep(LETTERS[1:10], 2),
           consent = rep(sample(c("Yes", "No"), 10, replace = T), 2),
           height = sample(rnorm(20, 170, sd = 10)),
           ind = rep(c("before", "after"), each = 2)
           )
df$name <- paste(df$consent, df$ind)

# Generate dummy numeric variable for `name` combinations 
foo <- data.frame(name = c("Yes before", "Yes", "Yes after", 
                           "No before", "No", "No after"),
                  X = 1:6)
#         name X
# 1 Yes before 1
# 2        Yes 2
# 3  Yes after 3
# 4  No before 4
# 5         No 5
# 6   No after 6

现在我们只需要将name 映射到X 并将其放在x 轴上:

df <- merge(foo, df)
ggplot(df, aes(X, height))+
    geom_point(aes(color = ind)) +
    geom_line(aes(group = interaction(ID, consent))) +
    scale_x_continuous(breaks = c(2, 5), labels = foo$name[c(2, 5)])

【讨论】:

谢谢!这种方法看起来不错,我什至没有想到。不过我最终还是使用了构面,因为我不喜欢修改我的数据框,并且在将组与 stat_compare_means() 进行比较时更简单 @Venca 是的,你的 facet 解决方案看起来也很整洁!【参考方案2】:

@camille 让我想到了有趣的解决方案。显然,不仅可以将分面标签放在图的底部,甚至可以放在轴下方。这解决了我的问题,而无需修改我的数据框:

library(ggpubr) #for theme_pubr and JCO palette

ggplot(df, aes(x = ind, y = height, group = ID))+
geom_point(aes(color = ind), size = 3)+
geom_line()+
labs(y = "Height")+
facet_wrap(~ consent, 
           strip.position = "bottom", ncol = 5)+   #put facet label to the bottom 
theme_pubr()+
color_palette("jco")+
theme(strip.placement = "outside",   #move the facet label under axis
      strip.text = element_text(size = 12),
      strip.background = element_blank(),
      axis.title.x = element_blank(),
      legend.position = "none")

来自问题的数据框结果:

【讨论】:

以上是关于在 x 轴上的离散组之间添加刻度的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2中同一轴上的不同刻度长度

在 R 中的 x 轴上显示次要对数刻度

在 R 中,如何在显示日期的 x 轴上添加每月刻度线?

添加 d3 时间轴开头的额外刻度

Plotly:如何为 x 轴上的时间序列设置主要刻度线/网格线的值?

echarts 中怎么设置x轴上的刻度桩的方向