r - ggplot 将主轴.刻度线长度与短轴.刻度线长度对齐

标签 r ggplot2

假设 x 轴的范围是 0-100。我想要获得以下规范:

  1. 20 秒(即 0、20、40、60、80 和 100)的刻度线和标签,
  2. 在 10 秒处,即在 10、30、50、70、90 处,没有标签的相同长度的刻度线
  3. 50% 长度的刻度线,5 秒处没有标签,即 5、15、25 等。

我想到的一个想法是使用geom_segment()来放置额外的刻度线(2和3)。但是,这需要指定 yyend,而刻度线需要指定单位长度,例如“cm”。是否有一个简单的解决方案来相对于主刻度线的长度放置附加刻度线,或者至少在同一单位中?

从示例图表中可以看出,刻度线的位置按预期工作,但刻度线的长度未对齐。

example

代码:

library(ggplot2)
set.seed(123)
df <- data.frame(x = rnorm(1000, mean = 50, sd = 10),
                 y = rnorm(1000, mean = 50, sd = 7))

# obtain difference between breaks with and without labels
xminor <- setdiff(seq(0, 100, 5), seq(0, 100, 20))
segment_data = data.frame(
  x = xminor,
  xend = xminor, 
  y = 0,
  yend = ifelse(xminor%%10 == 0, 3, 2)
)

ggplot() +
  geom_point(data = df, aes(x = x, y = y)) +
  geom_segment(data = segment_data,
               aes(x = x, xend = xend, y = y, yend = yend)) +
  scale_x_continuous(breaks = seq(0, 100, 20),
                     labels = seq(0, 100, 20), 
                     limits = c(0, 100),
                     expand = c(0, 0)) +
  scale_y_continuous(limits = c(0,100),
                     expand = c(0, 0)) +
  theme(
    panel.border = element_rect(color = "black", fill = NA, linewidth = 0.5),
    axis.ticks.x = element_line(linewidth = 0.5, color = "black"),
    axis.ticks.length.x = unit(-0.5, "cm"))

最佳答案

您可以通过完全删除轴刻度并在您想要的确切位置和确切长度处使用 polylineGrob 注释来实现此目的。这也意味着您不需要 segmentdata 数据框。

ggplot() +
  geom_point(data = df, aes(x = x, y = y)) +
  annotation_custom(grid::polylineGrob(
                      x = rep(0:20/20, each = 2), 
                      y = unit(rep(c(0, 0.5, 0, 0.25), length = 42), 'cm'),
                      id = rep(0:20, each = 2))) +
  scale_x_continuous(breaks = seq(0, 100, 20),
                     limits = c(0, 100),
                     expand = c(0, 0)) +
  scale_y_continuous(limits = c(0,100),
                     expand = c(0, 0)) +
  theme(
    panel.border = element_rect(color = "black", fill = NA, linewidth = 0.5),
    axis.ticks.x = element_blank(),
    plot.margin = margin(10, 20, 10, 20))

enter image description here

请注意,如果您设置了coord_cartesian(clip = 'off'),这也适用于绘图面板外部的刻度

ggplot() +
  geom_point(data = df, aes(x = x, y = y)) +
  annotation_custom(grid::polylineGrob(rep(0:20/20, each = 2), 
                      unit(rep(c(0, -0.5, 0, -0.25), length = 42), 'cm'),
                                    id = rep(0:20, each = 2))) +
  scale_x_continuous(breaks = seq(0, 100, 20),
                     limits = c(0, 100),
                     expand = c(0, 0)) +
  scale_y_continuous(limits = c(0,100),
                     expand = c(0, 0)) +
  theme(
    panel.border = element_rect(color = "black", fill = NA, linewidth = 0.5),
    axis.ticks.x = element_line(color = NA),
    axis.ticks.length.x = unit(0.5, 'cm'),
    plot.margin = margin(10, 20, 10, 20)) +
  coord_cartesian(clip = 'off')

enter image description here

关于r - ggplot 将主轴.刻度线长度与短轴.刻度线长度对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77464863/

相关文章:

R (dplyr) : count number of "0" observations before "1" in a column by ID

r - 如何使用ggplot2和lattice在直方图上叠加分布曲线

r - 通过 R 中的一组数据点拟合自定义函数

r - 将时间序列绘制为热图

r - 禁用鼠标单击以在 rmarkdown slidy_presentation 中显示另一张幻灯片

r - 绘图 - 无效的 xlim 值

r - 查找数据框对角线上的所有零

根据其他列替换数据框中的列值

r - 操纵ggproto得到多层

r - 在 ggplot2 中的 aes() 和 geom() 内部设置颜色和大小