首页 > 解决方案 > R - 在变量级别的绘图顶部添加刻度?

问题描述

在 ggplot2 中,当我在变量中有级别时,如何在顶部 x 轴上添加刻度?

例如,看看这个图形:

library(ggplot2)

ToothGrowth$dose <- factor(ToothGrowth$dose, levels=unique(ToothGrowth$dose))

p <- ggplot(data=ToothGrowth, aes(x=supp, y=len, fill=dose)) +
geom_boxplot() +
theme_bw(base_size=20) +
scale_y_continuous(sec.axis=dup_axis(labels=NULL,name=NULL))
p

上面的图在右轴上也有刻度,这是我需要的一半。

但是当我尝试在顶轴上添加刻度时:

p + 
scale_x_continuous(labels = levels(ToothGrowth$supp),
                   breaks = seq_along(levels(ToothGrowth$supp)),
                   sec.axis=dup_axis(labels=NULL,name=NULL))

我收到消息:

Error: Discrete value supplied to continuous scale

我认为这是因为我在dose变量中有级别。

我尝试使用scale_x_discrete. 但是,它不接受参数 sec.axis。

有什么办法让它工作吗?

标签: rggplot2

解决方案


您可以将 x 变量转换为数字,然后分组并从原始变量中复制标签。

ToothGrowth %>%
  mutate(supp2 = as.numeric(supp)) %>%
  ggplot(aes(x=supp2, y=len, group = supp)) +
  geom_boxplot() +
  theme_bw(base_size=20) +
  scale_y_continuous(sec.axis=dup_axis(labels=NULL,name=NULL)) +
  scale_x_continuous(labels = levels(ToothGrowth$supp), breaks = seq_along(levels(ToothGrowth$supp)), sec.axis=dup_axis(labels=NULL,name=NULL)) 

编辑以响应 OP 更新帖子:

这确实使事情复杂了一点。这会让你接近,但它并不完美。也许其他人会提出更好的方法或移除内部边界的方法。

ToothGrowth %>%
  mutate(dose = factor(dose),
         cons = 1) %>%
  ggplot(aes(x = cons, y = len)) +
  geom_boxplot(aes(fill = dose)) +
  facet_wrap(~supp, strip.position = "bottom") +
  theme_bw(base_size = 20) +
  scale_y_continuous(sec.axis = dup_axis(labels = NULL,name = NULL)) +
  scale_x_continuous(labels = NULL, breaks = 1, sec.axis = dup_axis(labels = NULL,name = NULL)) +
  theme(strip.placement = "outside",
        strip.background = element_rect(color = "white", fill = "white"),
        panel.spacing.x = unit(0, "mm"),
        axis.title.x = element_blank())

这使:

在此处输入图像描述


推荐阅读