首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R tips: 箭头风格的ggplot坐标轴

R tips: 箭头风格的ggplot坐标轴

作者头像
生信菜鸟团
发布2025-08-04 09:57:27
发布2025-08-04 09:57:27
13800
代码可运行
举报
文章被收录于专栏:生信菜鸟团生信菜鸟团
运行总次数:0
代码可运行

本文尝试通过灵活运用ggplot的segment图层,配合scale、theme的格式调整,实现比theme的axis.*参数更加自由的坐标轴风格调整。

主要目标是把ggplot的坐标轴改为箭头风格。

以iris数据集为例,classic主题的点图风格为:

代码语言:javascript
代码运行次数:0
运行
复制
  1. library(tidyverse)
  2. p <-
  3. iris %>%
  4. ggplot(aes(x =Sepal.Length, y =Sepal.Width, color =Species))+
  5. geom_point()+
  6. theme_classic()
  7. p

如果要更改坐标轴为箭头风格,可以选择把原来的坐标轴隐藏,然后使用geom_segment图层添加一个线段图层,加上箭头即可。

  1. axis.line.x用于关闭原来的x坐标轴,同理axis.line.y可以关闭y坐标轴,或者axis.line可以把x y坐标轴全部关闭。
  2. annotate函数添加一个segment图层。 为了更好的灵活控制坐标轴位置,并不需要先拿到原来的坐标轴范围是多少,只需要使用-Inf代表坐标轴的最左/最下的位置,Inf代表代坐标轴的最右/最上的位置即可。
  3. grid::arrow可以创建一个箭头,箭头的长度、角度、风格都可以调整,还可以arrow.fill和color定义箭头的填充色和线段的颜色。
代码语言:javascript
代码运行次数:0
运行
复制
  1. p2 <-
  2. p +
  3. theme(
  4. axis.line.x = element_blank(),
  5. )+
  6. annotate(
  7. 'segment',
  8. x =-Inf, xend =Inf,
  9. y =-Inf, yend =-Inf,
  10. arrow = grid::arrow(angle =25, type ="closed", length = unit(5,"mm")),
  11. arrow.fill ="red",
  12. color ="blue"
  13. )
  14. p2

发现了两个瑕疵:

  1. 箭头显示不全;
  2. x轴最后的一个labe有所重叠,可以考虑不显示;

下面逐个解决他们:

之所以没有显示完全是因为ggplot默认是会把不同绘图元素划定显示范围,超出他们的显示范围就会截断超出的元素。

坐标轴的范围和中间绘图区域的范围是各自恰好对齐的,而箭头在绘制时,很明显其下半部分会侵入到坐标轴显示区域,因此就会被截断,这个截断的行为可以通过clip控制。

代码语言:javascript
代码运行次数:0
运行
复制
  1. p3 <- p2 + coord_cartesian(clip ="off")
  2. p3

接下来进一步调整ticks和label。

可以通过对坐标轴的breaks进行调整,通过floor对x轴范围进行向下调整即可。

也可以手动指定范围,根据上图显示,只需要指定x轴breaks是5-7即可。

注意是调整breaks,不是调整limits/xlim,limits的调整会导致数据点的筛选。

代码语言:javascript
代码运行次数:0
运行
复制
  1. x_rng <- iris$Sepal.Length%>% range()%>% floor()
  2. p4 <-
  3. p3 +
  4. scale_x_continuous(
  5. breaks = x_rng[1]: x_rng[2]
  6. )
  7. p4

题外话,使用grid和cowplot其实也可以自定义坐标轴风格,比如小坐标轴风格:

代码语言:javascript
代码运行次数:0
运行
复制
  1. library(cowplot)
  2. library(grid)
  3. axis_segment <-
  4. gList(
  5. segmentsGrob(
  6. x0 = unit(0,"npc"), x1 = unit(0.3,"npc"),
  7. y0 = unit(0.03,"npc"), y1 = unit(0.03,"npc"),
  8. arrow = arrow(type ="closed"),
  9. gp = gpar(fill ="black")
  10. ),
  11. segmentsGrob(
  12. x0 = unit(0.03,"npc"), x1 = unit(0.03,"npc"),
  13. y0 = unit(0,"npc"), y1 = unit(0.3,"npc"),
  14. arrow = arrow(type ="closed"),
  15. gp = gpar(fill ="black")
  16. )
  17. )
  18. p_no_axis <- p + theme_void()
  19. p_with_axis <-
  20. ggdraw()+
  21. draw_plot(p_no_axis, x =0.1, y =0.1, height =0.9, width =0.9)+
  22. draw_grob(axis_segment, x =0.05, y =0.05)
  23. p_with_axis
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信菜鸟团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档