在数据按次刻度显示并使用离散刻度时,手动设置主刻度及其标签
我有一个数据集,由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() 替换为:

