本文尝试通过灵活运用ggplot的segment图层,配合scale、theme的格式调整,实现比theme的axis.*参数更加自由的坐标轴风格调整。
主要目标是把ggplot的坐标轴改为箭头风格。
以iris数据集为例,classic主题的点图风格为:
library(tidyverse)
p <-
iris %>%
ggplot(aes(x =Sepal.Length, y =Sepal.Width, color =Species))+
geom_point()+
theme_classic()
p
如果要更改坐标轴为箭头风格,可以选择把原来的坐标轴隐藏,然后使用geom_segment图层添加一个线段图层,加上箭头即可。
p2 <-
p +
theme(
axis.line.x = element_blank(),
)+
annotate(
'segment',
x =-Inf, xend =Inf,
y =-Inf, yend =-Inf,
arrow = grid::arrow(angle =25, type ="closed", length = unit(5,"mm")),
arrow.fill ="red",
color ="blue"
)
p2
发现了两个瑕疵:
下面逐个解决他们:
之所以没有显示完全是因为ggplot默认是会把不同绘图元素划定显示范围,超出他们的显示范围就会截断超出的元素。
坐标轴的范围和中间绘图区域的范围是各自恰好对齐的,而箭头在绘制时,很明显其下半部分会侵入到坐标轴显示区域,因此就会被截断,这个截断的行为可以通过clip控制。
p3 <- p2 + coord_cartesian(clip ="off")
p3
接下来进一步调整ticks和label。
可以通过对坐标轴的breaks进行调整,通过floor对x轴范围进行向下调整即可。
也可以手动指定范围,根据上图显示,只需要指定x轴breaks是5-7即可。
注意是调整breaks,不是调整limits/xlim,limits的调整会导致数据点的筛选。
x_rng <- iris$Sepal.Length%>% range()%>% floor()
p4 <-
p3 +
scale_x_continuous(
breaks = x_rng[1]: x_rng[2]
)
p4
题外话,使用grid和cowplot其实也可以自定义坐标轴风格,比如小坐标轴风格:
library(cowplot)
library(grid)
axis_segment <-
gList(
segmentsGrob(
x0 = unit(0,"npc"), x1 = unit(0.3,"npc"),
y0 = unit(0.03,"npc"), y1 = unit(0.03,"npc"),
arrow = arrow(type ="closed"),
gp = gpar(fill ="black")
),
segmentsGrob(
x0 = unit(0.03,"npc"), x1 = unit(0.03,"npc"),
y0 = unit(0,"npc"), y1 = unit(0.3,"npc"),
arrow = arrow(type ="closed"),
gp = gpar(fill ="black")
)
)
p_no_axis <- p + theme_void()
p_with_axis <-
ggdraw()+
draw_plot(p_no_axis, x =0.1, y =0.1, height =0.9, width =0.9)+
draw_grob(axis_segment, x =0.05, y =0.05)
p_with_axis