本文尝试通过灵活运用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 