假设 x 轴的范围是 0-100。我想要获得以下规范:
- 20 秒(即 0、20、40、60、80 和 100)的刻度线和标签,
- 在 10 秒处,即在 10、30、50、70、90 处,没有标签的相同长度的刻度线
- 50% 长度的刻度线,5 秒处没有标签,即 5、15、25 等。
我想到的一个想法是使用geom_segment()
来放置额外的刻度线(2和3)。但是,这需要指定 y
和 yend
,而刻度线需要指定单位长度,例如“cm”。是否有一个简单的解决方案来相对于主刻度线的长度放置附加刻度线,或者至少在同一单位中?
从示例图表中可以看出,刻度线的位置按预期工作,但刻度线的长度未对齐。
代码:
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))
请注意,如果您设置了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')
关于r - ggplot 将主轴.刻度线长度与短轴.刻度线长度对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77464863/