geomtextpath | 成功让你的ggplot注释拥有傲人曲线!~

news2024/11/24 22:27:08

1写在前面

最近的世界杯结果的确是让人大跌眼镜🕶️, 日本队🇯🇵先后击败世界杯冠军, 德国队🇩🇪和西班牙队🇪🇸, 韩国队🇰🇷逆转葡萄牙🇵🇹, 踩着乌拉圭🇺🇾进入淘汰赛(请韩国队🇰🇷自觉感谢裁判), 让无数人站上天台😂.
不过大家要是看看这几十年日本足球⚽️的发展也就不会觉得奇怪了, 就算有一天日本队将梦想照进现实,捧起大力神杯🏆, 我也不觉得有什么奇怪的.
还是祝各亚洲球队取得好成绩, 也祝梅西C罗在顶峰相遇, 人生不留遗憾😘.


接着是这一期的教程, 最近用了一下geomtextpath, 是个不错的ggplot2扩展包, 让你的geom_text卷起来吧.😂

主要函数有2个, geom_textpathgeom_labelpath, 我们逐一介绍吧.🧐

2用到的包

rm(list = ls())
# remotes::install_github("AllanCameron/geomtextpath", quiet = TRUE)
library(tidyverse)
library(geomtextpath)
library(ggsci)
library(RColorBrewer)

3等价函数

这里我们给大家补充一下在使用text或者label时, 用到的包内对等函数, 不同figure可以选用对应的text或者label.😉

ggplot geomText equivalentLabel equivalent
geom_pathgeom_textpathgeom_labelpath
geom_segmentgeom_textsegmentgeom_labelsegment
geom_linegeom_textlinegeom_labelline
geom_ablinegeom_textablinegeom_labelabline
geom_hlinegeom_texthlinegeom_labelhline
geom_vlinegeom_textvlinegeom_labelvline
geom_curvegeom_textcurvegeom_labelcurve
geom_densitygeom_textdensitygeom_labeldensity
geom_smoothgeom_textsmoothgeom_labelsmooth
geom_contourgeom_textcontourgeom_labelcontour
geom_density2dgeom_textdensity2dgeom_labeldensity2d
geom_sfgeom_textsfgeom_labelsf

4示例数据

示例数据我们就用大名鼎鼎的Orangeiris吧.

4.1 示例数据一

dat1 <- Orange
DT::datatable(dat1)
alt

4.2 示例数据二

dat2 <- iris
DT::datatable(dat2)
alt

5标注曲线

5.1 简单绘图

这里用到的是geom_textline函数, 一起看一下吧.🥳

dat1 %>% 
dplyr::filter(., Tree == 1) %>%
ggplot(aes(x = age, y = circumference)) +
geom_textline(label = "This is my text oh oh oh!",
size = 4, vjust = -0.2,
linewidth = 1, linecolor = "red4", linetype = 2,
color = "deepskyblue4")
alt

5.2 进阶绘图

有时候我们还想标注上复杂的公式, 大家可以这样试一下.😏

lab <- expression(paste("y = ", frac(1, sigma*sqrt(2*pi)), " ",
plain(e)^{frac(-(x-mu)^2, 2*sigma^2)}))

df <- data.frame(x = seq(-2, 0, len = 100),
y = dnorm(seq(-2, 0, len = 100)),
z = as.character(lab))
df %>%
ggplot(aes(x, y)) +
geom_textpath(aes(label = z),
vjust = -0.2, hjust = 0.1,
size = 8, parse = T)
alt

6标注densityplot

6.1 绘图

这里用到的是geom_textdensity函数, 我们再改一下颜色主题.🤗

dat2 %>% 
ggplot(aes(x = Sepal.Width, colour = Species, label = Species)) +
geom_textdensity(size = 6, fontface = 2, hjust = 0.2, vjust = 0.3) +
scale_color_npg()+
theme_bw()+
theme(panel.background = element_blank(),
panel.grid = element_blank(),
legend.position = "none")
alt

6.2 更改文字位置

我们试着把他们改到最大值处.😂

dat2 %>% 
ggplot(aes(x = Sepal.Width, colour = Species, label = Species)) +
scale_color_npg()+
theme_bw()+
theme(panel.background = element_blank(),
panel.grid = element_blank(),
legend.position = "none")+

geom_textdensity(size = 5, fontface = 2, spacing = 50,
vjust = -0.2, hjust = "ymax") +
ylim(c(0, 1.5))
alt

7标注趋势线

这里用到的是geom_labelsmooth函数, method可选如下:👇

  • "lm";
  • "glm";
  • "gam";
  • "loess";

dat2 %>% 
ggplot(aes(x = Sepal.Width, y = Petal.Width, color = Species)) +
geom_point(alpha = 0.3) +
geom_labelsmooth(aes(label = Species),
text_smoothing = 30,
fill = "#F6F6FF", # label背景色
method = "loess",
formula = y ~ x,
size = 4, linewidth = 1,
boxlinewidth = 0.3) +
scale_color_npg()+
theme_bw()+
theme(panel.background = element_blank(),
panel.grid = element_blank(),
legend.position = "none")
alt

Note! 这里你也可以使用geom_textsmooth, 大家自己试一下有什么区别吧.😗

8标注contour lines

我们试着在contour lines上标注一下吧, 用到的函数是eom_textcontour.🤩

df <- expand.grid(x = seq(nrow(volcano)), y = seq(ncol(volcano)))
df$z <- as.vector(volcano)

ggplot(df, aes(x, y, z = z)) +
geom_contour_filled(bins = 6, alpha = 0.8) +
geom_textcontour(bins = 6, size = 2.5, straight = T) +
scale_fill_manual(values = colorRampPalette(brewer.pal(9,"Greens"))(9))+
theme_bw()+
theme(panel.background = element_blank(),
panel.grid = element_blank(),
legend.position = "none")
alt

9标注阈值线

我们在这里可以使用geom_texthline, geom_textvline, geom_textabline来进行各种阈值线的绘制.🤓

dat2 %>% 
ggplot(aes(Sepal.Length, Sepal.Width)) +
geom_point() +
geom_texthline(yintercept = 3,
label = "hline",
hjust = 0.8, color = "red4") +
geom_textvline(xintercept = 6,
label = "vline",
hjust = 0.8, color = "blue4",
linetype = 2, vjust = 1.3) +
geom_textabline(slope = 15, intercept = -100,
label = "abline",
color = "green4", hjust = 0.6, vjust = -0.2)+
theme_bw()+
theme(panel.background = element_blank(),
panel.grid = element_blank(),
legend.position = "none")
alt

10标注统计学差异

我们常规使用直线或者直接标注*的方式来展示统计学差异.😘
这里我们试试换一种方式来绘图吧.🫢

dat2 %>% 
ggplot(aes(x = Species, y = Sepal.Length)) +
geom_boxplot(aes(fill = Species))+
geom_textcurve(data = data.frame(x = 1, xend = 2,
y = 8.72, yend = 8.52),
aes(x, y, xend = xend, yend = yend),
hjust = 0.35, ncp = 20,
curvature = -0.8,
label = "significant difference") +
scale_y_continuous(limits = c(4, 14))+
scale_fill_aaas()+
theme_bw()+
theme(panel.background = element_blank(),
panel.grid = element_blank(),
legend.position = "none")
alt

11test_smoothing

有的时候画出来的figure过于尖锐, 不够平滑, 这样就不好标注了, 这里也提供了text_smoothing参数用来解决这个问题, 0 (none) to 100 (maximum), 大家试一下吧, 我在这里先做一个示范.😘

dat2 %>% 
ggplot(aes(Sepal.Length, Petal.Length)) +
geom_textline(linecolour = "red4", size = 4, vjust = -7.5,
label = "smooth_text", text_smoothing = 40)
alt

12复杂绘图的坐标轴改变

12.1 初步绘图

我们先画个图, 然后我们再把坐标coord_polar().🤩

p <- data.frame(x1 = c(seq(0, 10/6 * pi, pi/3),
seq(0, 10/6 * pi, 2*pi/3)),
y1 = c(rep(2, 6), rep(-1, 3)),
x2 = c(seq(0, 10/6 * pi, pi/3) + pi/3,
seq(0, 10/6 * pi, 2*pi/3) + 2*pi/3),
y2 = c(rep(4, 6), rep(2, 3)),
group = letters[c(1:6, (1:3) * 2)],
alpha = c(rep(1, 6), rep(0.4, 3))) |>
ggplot(aes(x1, y1)) +
geom_rect(aes(xmin = x1, xmax = x2, ymin = y1, ymax = y2, fill = group,
alpha = alpha),
color = "white", size = 2) +
geom_textpath(data = data.frame(x1 = seq(0, 2 * pi, length = 300),
y1 = rep(0.5, 300),
label = rep(c("A and B", "C and D", "E and F"), each = 100)),
aes(label = label), linetype = 0, size = 8,
upright = TRUE) +
geom_textpath(data = data.frame(x1 = seq(0, 2 * pi, length = 300),
y1 = rep(3, 300),
label = rep(c("apple", "banana", "cucumber", "durian",
"egg", "flower"),
each = 50)),
aes(label = label), linetype = 0, size = 4.6, color = "white",
upright = TRUE) +
scale_y_continuous(limits = c(-5, 4)) +
scale_x_continuous(limits = c(0, 2*pi)) +
scale_fill_npg()+
scale_alpha_identity() +
theme_void() +
theme(legend.position = "none")

p
alt

12.2 更改坐标系

这个包非常强大, 大家完全不用担心使用coord_polar()后, 文字的位置会有改变, 请放心使用!😂

p + coord_polar()
alt

Nice! 这种图无论是在研究型paper还是Review中使用, 都是可以拉高水平的图🌟~


12.3 直接使用coord_curvedpolar()

在这种polar式的坐标系中, 如果标注的文字太长, 我们可以使用coord_curvedpolar(), 要比coord_polar()合适, 大家试一试吧.😉

df <- data.frame(x = c("Apple label", "Banana label",
"Cucumber label", "Durian label"),
y = c(7, 10, 12, 5))

p <- ggplot(df, aes(x, y, fill = x)) +
geom_col(width = 0.5) +
scale_fill_npg()+
theme(axis.text.x = element_text(size = 15),
legend.position = "none")
p
alt

搞定!~🥳🥳🥳

p + coord_curvedpolar()
alt

馒头
最后祝大家早日不卷!~

点个在看吧各位~ ✐.ɴɪᴄᴇ ᴅᴀʏ 〰

📍 往期精彩

📍 🤩 ComplexHeatmap | 颜狗写的高颜值热图代码!
📍 🤥 ComplexHeatmap | 你的热图注释还挤在一起看不清吗!?
📍 🤨 Google | 谷歌翻译崩了我们怎么办!?(附完美解决方案)
📍 🤩 scRNA-seq | 吐血整理的单细胞入门教程
📍 🤣 NetworkD3 | 让我们一起画个动态的桑基图吧~
📍 🤩 RColorBrewer | 再多的配色也能轻松搞定!~
📍 🧐 rms | 批量完成你的线性回归
📍 🤩 CMplot | 完美复刻Nature上的曼哈顿图
📍 🤠 Network | 高颜值动态网络可视化工具
📍 🤗 boxjitter | 完美复刻Nature上的高颜值统计图
📍 🤫 linkET | 完美解决ggcor安装失败方案(附教程)
📍 ......

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/58202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

定时轮询-长轮询-websocket

一般网页 点击网页后&#xff0c;前端向后端 发送请求&#xff08;使用http协议&#xff09; 那么如何实现后端主动先前端发送数据&#xff0c;比如&#xff1a;网页游戏 聊天室 文件共享 扫码登入 http定时轮询 &#xff08;轮询&#xff09; 在前端代码中每隔一段时间向后…

宝塔面板Linux

目录 1.宝塔面板简介 2.安装与连接 3.安装软件 4.端口管理 5.宝塔面板设置 这里主要讲的是宝塔面板的主要操作&#xff0c;本节应与xshell与xftp共同使用 1.宝塔面板简介 宝塔面板是一款服务器管理软件&#xff0c;支持windows和linux系统&#xff0c;可以通过Web端轻松…

第六章- Verilog HDL 高级程序设计举例【Verilog】

第六章 Verilog HDL 高级程序设计举例【Verilog】前言推荐第六章 Verilog HDL 高级程序设计举例状态机用状态机设计1101序列检测器需要定义几个状态&#xff1f;代码设计——端口信号声明状态寄存器次态生成逻辑设计(C1模块)输出逻辑设计(C2模块)完整代码测试结果用状态机设计1…

vSphere-ESXi

VMware-vShpere 第一步&#xff1a; 在VMware虚拟机上安装一台ESXI 开启虚拟机 至此&#xff0c;虚拟机ESXI安装完毕 第二步&#xff1a;使用ESXI虚拟机IP上浏览器 登录后&#xff0c;上传一个映像文件至ISO文件 将VM虚拟机关机 手动添加一块硬盘 然后再使用虚拟机IP进入浏览器…

python入门——基础语法

python入门——基础语法 注释 单行注释&#xff1a;使用# 多行注释&#xff1a;使用 “”" “”" type()&#xff1a;查看数据的类型 int()&#xff1a;转化为整数 float()&#xff1a;转化为浮点数 str()&#xff1a;转化为字符串 标识符不可以使用这些 …

Spring WebFlux简单使用

官网&#xff1a;https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html 1.WebFlux介绍 Spring WebFlux 是 Spring Framework 5.0中引入的新的响应式web框架。与Spring MVC不同&#xff0c;它不需要Servlet API&#xff0c;是完全异步且非阻…

蓝桥杯嵌入式LCD屏幕

文章目录前言一、拷贝官方例程二、cubeMX配置三、LCD代码及函数分析使用四、sprintf函数总结前言 本篇文章将带大家学习LCD屏幕的操作&#xff0c;LCD的配置是非常复杂的&#xff0c;在比赛上去实现这些驱动程序基本上是不可能的&#xff0c;当然了比赛官方也是知道这一点的&a…

SpringMVC基础篇:MVC基础知识

第一章&#xff1a;SpringMVC引言 一&#xff1a;什么是SpringMVC 概念&#xff1a;SpringMVC是在Spring框架基础上衍生而来的一个MVC框架&#xff0c;主要解决了原有的MVC框架过程中控制器&#xff08;Controller&#xff09;的问题。 SpringMVC是Java开发当中最主流的web技…

了解软件测试

软件测试课程 1.1课程内容&#xff1a; 软件基础课程 ------设计测试用例方法 自动化课程&#xff08;web自动化&#xff09;------ 抢票功能 性能测试课程 ----项目性能测试 1.2 什么是测试 1.21 生活中测试的案例 坐地铁&#xff0c;做核酸&#xff0c;扫核酸码 比如当我…

[附源码]计算机毕业设计学生社团信息管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

零基础学习软件测试,掌握四点就够了

近年来越来越多的人转行到软件测试这一领域&#xff0c;对于很多外行的人来说&#xff0c;肯定对这一行业有很多不了解&#xff0c;对于这一职业的职责以及要求都会不清楚&#xff0c;那么我们今天就来梳理一下关于软件测试行业的信息。 一、软件测试的主要职责你知道吗&#x…

裸辞闭关60天,啃下这些软件测试笔记,有幸通过阿里测开岗P6面试

时代在发展&#xff0c;互联网之下&#xff0c;稍有一些落后可能就会被淘汰掉&#xff0c;因此我们需要不断去审视自己&#xff0c;通过学习来让自己得到相应的提升。 近段时间&#xff0c;我也了解到很多小伙伴不清楚作为测试工程师应该掌握什么样的核心知识&#xff1f;实际…

暴力算法 --- 莫队

文章目录莫队基础莫队带修改莫队树上莫队回滚莫队莫队 什么是莫队&#xff1f; 答&#xff1a;优雅的暴力&#xff01;&#xff01;&#xff01; 基础莫队 重复的数 题目描述&#xff1a;给出一个长度为NNN的序列&#xff0c;有若干查询&#xff0c;每次查询区间[li,ri][l_i,…

网页信息抓取-网页信息采集器

抓取整个网页&#xff0c;我们怎么抓取整个网页自己想要的文章内容&#xff0c;很多人一想到内容抓取。就想到要学习一门编程语言&#xff0c;最让大家熟知的就是python爬虫。如果完全靠自己自学&#xff0c;又是从零基础开始学习Python的情况下&#xff0c;我认为至少需要半年…

Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏

云收藏项目已经开源2年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时很新的技术,现在看来其实很多新技术是没有必要使用的,但做为学习案例来讲确实是一个绝佳的 Spring Boot 实践。 从开源到现在,写了一些教程给大家介绍如何部署云收藏,如何在IDE中运…

[附源码]计算机毕业设计ssm校园二手交易平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

解决JSP中Bean在页面显示不正确问题(scope关键字)

问题出现 有一天我在编写JSP的程序时&#xff0c;在Java后端写了跳转并且传输数据语句&#xff0c;但前端界面渲染出来的数据却是我在DAO中初始化的数据。 第一句语句将book对象注入request的Session中&#xff0c;第二句实现跳转到JSP页面&#xff0c;第三句将此时的request和…

Logistic回归——银行违约情况分析

文章目录一、Logistic回归原理1、Sigmoid函数作用2、用梯度下降法求解参数二、利用Logistic回归分类1、数据预处理2、利用梯度上升计算回归系数3、训练和验证总结一、Logistic回归原理 1、Sigmoid函数作用 Logistic回归的原理是用逻辑函数把线性回归的结果(-∞,∞)映射到(0,1…

【408篇】C语言笔记-第十章(线性表)

文章目录第一节&#xff1a;线性表的顺序表示线性表1. 定义2. 特点线性表的顺序表示1. 顺序表2. 优缺点比较3. 插入操作4. 删除操作5. 动态分配代码示例第二节&#xff1a;线性表的链式表示单链表优缺点对比插入操作删除操作代码示例第一节&#xff1a;线性表的顺序表示 线性表…

python中的序列(列表、元组、字符串)的切片操作

目录 一.序列 二. 序列常用操作——切片 注意 演示 一.序列 序列是指:内容连续、有序&#xff0c;可使用下标索引的一类数据容器 列表、元组、字符串&#xff0c;均可以可以视为序列。 二. 序列常用操作——切片 序列支持切片&#xff0c;即:列表、元组、字符串&#xf…