在 ggplot 的顶部和右侧添加轴刻度线?
Add axis tick-marks on top and to the right to a ggplot?
在 base
图形中,我们可以使用 axis
和 side
参数轻松地在图的不同边添加刻度线:
par(tck = 0.025)
plot(1:10)
axis(side = 3, labels = FALSE)
axis(side = 4, labels = FALSE)
如何在 ggplot2
的顶部和右侧镜像 x 和 y 轴刻度?有 annotation_logticks
可以做到这一点,但似乎只适用于对数标度(如函数名称适用)。对于光栅尺,有没有同样简单的方法?
这反映了轴刻度线(使用 gtable
函数),并将刻度线放在绘图面板中。
编辑 2016 年 4 月 18 日 axis.ticks.margin
已弃用。请改用文本边距。
编辑 2015 年 19 月:更好地定位刻度线
library(ggplot2) # v2.1.0
library(gtable) # v0.2.0
library(grid)
# Get a plot
p = ggplot(data.frame(x = 1:10, y = 1:10), aes(x,y)) +
geom_point() +
theme_bw() +
theme(panel.grid = element_blank(),
axis.ticks.length=unit(-0.25, "cm"),
axis.text.x = element_text(margin = margin(t = .5, unit = "cm")),
axis.text.y = element_text(margin = margin(r = .5, unit = "cm")))
# Convert the plot to a grob
gt <- ggplotGrob(p)
# Get the position of the panel in the layout
panel <-c(subset(gt$layout, name=="panel", se=t:r))
## For the bottom axis
# Get the row number of the bottom axis in the layout
rn <- which(gt$layout$name == "axis-b")
# Extract the axis (tick marks only)
axis.grob <- gt$grobs[[rn]]
axisb <- axis.grob$children[[2]] # Two children - get the second
axisb # Note: two grobs - tick marks and text
# Get the tick marks
xaxis = axisb$grobs[[1]] # NOTE: tick marks first
xaxis$y = xaxis$y - unit(0.25, "cm") # Position them inside the panel
# Add a new row to gt, and insert the revised xaxis grob into the new row.
gt <- gtable_add_rows(gt, unit(0, "lines"), panel$t-1)
gt <- gtable_add_grob(gt, xaxis, l = panel$l, t = panel$t, r = panel$r, name = "ticks")
## Repeat for the left axis
# Get the row number of the left axis in the layout
panel <-c(subset(gt$layout, name=="panel", se=t:r))
rn <- which(gt$layout$name == "axis-l")
# Extract the axis (tick marks and axis text)
axis.grob <- gt$grobs[[rn]]
axisl <- axis.grob$children[[2]] # Two children - get the second
axisl # Note: two grobs - text and tick marks
# Get the tick marks
yaxis = axisl$grobs[[2]] # NOTE: tick marks second
yaxis$x = yaxis$x - unit(0.25, "cm") # Position them inside the panel
# Add a new column to gt, and insert the revised yaxis grob into the new column.
gt <- gtable_add_cols(gt, unit(0, "lines"), panel$r)
gt <- gtable_add_grob(gt, yaxis, t = panel$t, l = panel$r+1, name = "ticks")
# Turn clipping off
gt$layout[gt$layout$name == "ticks", ]$clip = "off"
# Draw it
grid.draw(gt)
从 ggplot2 2.2.0 开始,您可以在 scale_
中使用 sec.axis
参数。
dup_axis
is a shorthand for creating a secondary axis that is a duplication of the primary axis, effectively mirroring the primary axis.
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point() +
scale_x_continuous(sec.axis = dup_axis()) +
scale_y_continuous(sec.axis = dup_axis())
这并没有解决离散问题,但次轴不必是主轴的重复。所以在“side=4”上我可以对“side=2”轴进行变换。
查看更多信息:
https://ggplot2.tidyverse.org/reference/sec_axis.html
例如,scale_y_continuous(sec.axis = sec_axis(~ . + 10))
在 base
图形中,我们可以使用 axis
和 side
参数轻松地在图的不同边添加刻度线:
par(tck = 0.025)
plot(1:10)
axis(side = 3, labels = FALSE)
axis(side = 4, labels = FALSE)
如何在 ggplot2
的顶部和右侧镜像 x 和 y 轴刻度?有 annotation_logticks
可以做到这一点,但似乎只适用于对数标度(如函数名称适用)。对于光栅尺,有没有同样简单的方法?
这反映了轴刻度线(使用 gtable
函数),并将刻度线放在绘图面板中。
编辑 2016 年 4 月 18 日 axis.ticks.margin
已弃用。请改用文本边距。
编辑 2015 年 19 月:更好地定位刻度线
library(ggplot2) # v2.1.0
library(gtable) # v0.2.0
library(grid)
# Get a plot
p = ggplot(data.frame(x = 1:10, y = 1:10), aes(x,y)) +
geom_point() +
theme_bw() +
theme(panel.grid = element_blank(),
axis.ticks.length=unit(-0.25, "cm"),
axis.text.x = element_text(margin = margin(t = .5, unit = "cm")),
axis.text.y = element_text(margin = margin(r = .5, unit = "cm")))
# Convert the plot to a grob
gt <- ggplotGrob(p)
# Get the position of the panel in the layout
panel <-c(subset(gt$layout, name=="panel", se=t:r))
## For the bottom axis
# Get the row number of the bottom axis in the layout
rn <- which(gt$layout$name == "axis-b")
# Extract the axis (tick marks only)
axis.grob <- gt$grobs[[rn]]
axisb <- axis.grob$children[[2]] # Two children - get the second
axisb # Note: two grobs - tick marks and text
# Get the tick marks
xaxis = axisb$grobs[[1]] # NOTE: tick marks first
xaxis$y = xaxis$y - unit(0.25, "cm") # Position them inside the panel
# Add a new row to gt, and insert the revised xaxis grob into the new row.
gt <- gtable_add_rows(gt, unit(0, "lines"), panel$t-1)
gt <- gtable_add_grob(gt, xaxis, l = panel$l, t = panel$t, r = panel$r, name = "ticks")
## Repeat for the left axis
# Get the row number of the left axis in the layout
panel <-c(subset(gt$layout, name=="panel", se=t:r))
rn <- which(gt$layout$name == "axis-l")
# Extract the axis (tick marks and axis text)
axis.grob <- gt$grobs[[rn]]
axisl <- axis.grob$children[[2]] # Two children - get the second
axisl # Note: two grobs - text and tick marks
# Get the tick marks
yaxis = axisl$grobs[[2]] # NOTE: tick marks second
yaxis$x = yaxis$x - unit(0.25, "cm") # Position them inside the panel
# Add a new column to gt, and insert the revised yaxis grob into the new column.
gt <- gtable_add_cols(gt, unit(0, "lines"), panel$r)
gt <- gtable_add_grob(gt, yaxis, t = panel$t, l = panel$r+1, name = "ticks")
# Turn clipping off
gt$layout[gt$layout$name == "ticks", ]$clip = "off"
# Draw it
grid.draw(gt)
从 ggplot2 2.2.0 开始,您可以在 scale_
中使用 sec.axis
参数。
dup_axis
is a shorthand for creating a secondary axis that is a duplication of the primary axis, effectively mirroring the primary axis.
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point() +
scale_x_continuous(sec.axis = dup_axis()) +
scale_y_continuous(sec.axis = dup_axis())
这并没有解决离散问题,但次轴不必是主轴的重复。所以在“side=4”上我可以对“side=2”轴进行变换。
查看更多信息: https://ggplot2.tidyverse.org/reference/sec_axis.html
例如,scale_y_continuous(sec.axis = sec_axis(~ . + 10))