在数据按次刻度显示并使用离散刻度时,手动设置主刻度及其标签

编程语言 2026-07-10

我有一个数据集,由71个样本的两次观测组成,但样本来自不同的来源。我想为每个来源在坐标轴上设置主刻度线并附上相应标签,但遇到了瓶颈。我在这里的Stack Overflow上看了好几个例子,但没有找到能够回答同样的问题且我能复现代码的答案。我尝试过:

  • 使用scale_x_discrete设置minor_breaks(没有作用,出现unused argument的错误)。
  • 使用scale_x_continuous(没有作用,因为数据是离散的,任何形式的使用都会导致x 轴消失,不管我输入什么函数或向量)。
  • 通过使用该示例中的levels与/或factors将离散/连续数据转换,参见这个例子 改变x 轴刻度标签ggplot2不工作,导致坐标轴消失,scale_x_discrete

没有成功。

以下是我的代码:

pH.plot<- ggplot(pH.1, aes(y=pH.1$pH) )  +
  #geom_histogram()+
  geom_point(aes(x=Sample), size=2) +
  scale_x_discrete(breaks=pH.Kond.Alk.1$Mill, labels = pH.Kond.Alk.1$Mill )+
  theme(
    axis.title.x=element_blank(),
    axis.title.y=element_blank(),
    legend.title = element_blank(), 
    axis.text.x = element_text(angle = 90) )

以及所用的数据框:

str(pH.Kond.Alk.1)
tibble [142 × 5] (S3: tbl_df/tbl/data.frame)
 $ Sample  : chr [1:142] "Kx V17" "Mu V17" "Ob V17" "Vä V17" ...
 $ Mill    : Factor w/ 16 levels "Aspa","Billingsfors",..: 8 9 10 14 16 7 13 6 15 4 ...
 $ Halfyear: Factor w/ 5 levels "S17","F17","S18",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ LS      : Factor w/ 2 levels "L/S 2","L/S 10": 1 1 1 1 1 1 1 1 1 1 ...
 $ pH      : num [1:142] 12.67 11.76 9.73 13.2 10.68 ...

上面的代码给出了下面的图像,就它本身而言几乎就是我想要的。正如你所看到的,标签按代码所指定重复了好几次,但我希望实现的是:按标签对样本进行分组/分离,绘制一个主网格线或主刻度线,或以其他方式将样本按照标签分组,并在“主刻度标记”的分组中只重复显示一次标签,以提升可读性。通常我会用颜色或形状来区分,但现在这两者已被占用。有什么想法吗?这有可能吗?

样本和次要刻度正确,但没有主刻度,且只想让标签在分组中重复一次

解决方案

我认为分面,特别是 facet_grid,在这里是一个不错的选项,因为你的分组中元素数量不一,且你可能希望每组所占的空间能据此反映出来。facet_wrap 可能更好,如果你每组的元素数量几乎接近均匀,并且你想换成多行显示。或者如果你想要更多选项/控制,可以看看 ggh4x 包的选项:https://teunbrand.github.io/ggh4x/articles/Facets.html

下面是一些伪数据。(正如评论中所述,提供包含样本数据的问题更容易给出相关且可完全复现的答案。请在将来的问题中也这样做以便答案更具参考性。)`` library(ggplot2) library(dplyr) set.seed(42) pH.1 <- data.frame(Mill = rep(LETTERS[1:10], rpois(10, 5))) |> mutate(Sample = paste("sample", row_number()), pH = runif(n(), 10, 13))


然后我们可以把这放在按每个 Mill 的 x 值数量来分面的布局中:

ggplot(pH.1, aes(y=pH) ) + geom_point(aes(x=Sample), size=2) + facet_grid(.~Mill, scale = "free_x", space = "free_x", switch = "x") + theme( strip.background = element_rect(fill = NA), axis.title.x=element_blank(), axis.title.y=element_blank(), legend.title = element_blank(), axis.text.x = element_text(angle = 90, vjust = 0.5)) ```

在此处输入图像描述

或将 axis.text.x = element_blank(), axis.ticks.x = element_blank() 替换为:

在此处输入图像描述

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章