当前位置: 首页 > news >正文

#绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满

哈喽呀,小伙伴们元旦假期过得都如何呀?最近看国内新闻的报道,各地疫情又有冒头的趋势,国内小伙伴的日常防护不要松懈呀。

最近忙于字幕组的工作,可还是不能放下公众号的推送。想了想新年的第一篇推送应该写什么,想了好久,最终决定写一篇如何使用R语言画圆的文章,也祝大家新的一年团团圆圆、圆圆满满。

圆的诞生

三角恒等式

其实,使用传统的绘图工具包比如ggplot2画圆并没有想象中的那么简单。由于我们绘制的为二维平面图,ggplot2的函数命令决定了我们只能绘制具有映射关系的函数图形。初中我们就学过,函数的映射关系是唯一的,一个值不可能对应两个值。根据圆的方程式,我们可得:

变换后可得:

所以,如果使用传统的圆的方程式,我们一次只可绘制出半个圆,那么我们就需要将两个半圆加在一起才能获得一个完整的圆。当然,我们也可以使用散点图的函数命令,绘制一个点,然后通过设定参数shape = 1将其形状设定为空心圆,然后通过参数size改变圆的大小,但是这样没办法定量精确控制圆心和半径。

那如何才能一次性绘制出一个标准的可精确控制的完整的圆呢?这里,我们引入一个非常基础的三角恒等式,高中三角函数应该有介绍:

由这个公式可知,取任意值以上等式皆成立,那么和就相当于半径为1圆心为的圆上的所有的点。有了这个公式,我们就有了绘制圆的起点。

最基础的圆

下面,我们根据三角恒等式绘制最最基础的,半径为1圆心为的圆。这里,我们不需要对三角恒等式做任何改变,只需设定的取值范围即可。由三角函数的基础知识可知,一个循环长度为,所以取值应至少涵盖一个完整的循环,这里我们就设定为。下面为绘制圆的函数命令:

### 设定theta取值范围
theta 0, 2*pi, length.out = 500)
### 使用三角函数构建点的坐标
x y df 
### 这里使用geom_path按照点的出现顺序将其串起来
### 如果使用geom_line无法绘制出圆形
### 设定长宽等比
ggplot(df, aes(x, y)) +
  geom_path() +
  theme(aspect.ratio = 1)
ae08c315651912ae0cb1d5bebd227c69.png

这样我们就绘制出了一个标准的以为圆心,半径为1的圆。

修改圆心和半径

如果需要获得不同圆心和半径的圆,我们只需对基础的三角恒等式做细微调整。设定半径为,那么通过简单的运算可得:

所以我们只需将和乘以相应的数字即可获得不同半径的圆。比如,我们现在绘制以为圆心,半径为2的圆:

### 使用三角函数构建点的坐标
### 半径为2 所以三角函数乘以2
x 2*sin(theta)
y 2*cos(theta)
df 
### 这里使用geom_path按照点的出现顺序将其串起来
### 如果使用geom_line无法绘制出圆形
### 设定长宽等比
ggplot(df, aes(x, y)) +
  geom_path() +
  theme(aspect.ratio = 1)
f3c52ab13cf98d13026c70c85b51c4ba.png

如果我们只想更改圆心坐标呢?修改圆心坐标,相当于将整个圆上的所有点进行位移。比如,圆心从位移到,相当于所有的点的横坐标向右2个单位纵坐标向上2个单位,我们现在绘制以为圆心,半径为1的圆:

### 使用三角函数构建点的坐标
### 圆心为(2, 2) 横坐标向右2个单位 纵坐标向上2个单位
x 2
y 2
df 
### 这里使用geom_path按照点的出现顺序将其串起来
### 如果使用geom_line无法绘制出圆形
### 设定长宽等比
ggplot(df, aes(x, y)) +
  geom_path() +
  theme(aspect.ratio = 1)
d9ddf715a5cdb712b4cab5f64fed8f9a.png

将上述两步结合,我们即可获得任意圆心任意半径的圆。比如,我们现在绘制以为圆心,半径为2的圆:

### 使用三角函数构建点的坐标
### 圆心为(3, 2) 横坐标均向右位移3个单位 纵坐标向上位移2个单位
### 半径为2 三角函数乘以2
x 2*sin(theta) + 3
y 2*cos(theta) + 2
df 
### 这里使用geom_path按照点的出现顺序将其串起来
### 如果使用geom_line无法绘制出圆形
### 设定长宽等比
ggplot(df, aes(x, y)) +
  geom_path() +
  theme(aspect.ratio = 1)
7669b195567d6ed4c1261745aa2130d0.png

实心圆

上面几个小节讲的都是绘制圆圈,如果我们想要绘制实心圆,只需将函数命令geom_path()调整为geom_polygon()。比如,我们以刚才的为圆心半径为2的圆为例:

### 使用geom_polygon()绘制实心圆
ggplot(df, aes(x, y)) +
  geom_polygon() +
  theme(aspect.ratio = 1)
cbbc307199a2ed127501b5a020ec3699.png

这个实心圆巨丑,我们可以调整参数colorfill改变边框和填充颜色,比如都调整为tiffany蓝,然后去掉坐标轴:

### 使用geom_polygon()绘制实心圆
### 设定边框和填充均为tiffany蓝
ggplot(df, aes(x, y)) +
  geom_polygon(color = "#0ABAB5", fill = "#0ABAB5") +
  theme_void() +
  theme(aspect.ratio = 1)
b254cd9f26aa5796c737f2a2a1c05ba5.png

虽然我觉得,这样也挺丑!

粉色泡泡

上面都是简单粗暴的圆,在最后,我想绘制一幅利用大自然的黄金比例开枝散叶的粉色泡泡图。这里借鉴了Antonio Sánchez Chinchón创作的Phyllotaxis: Draw Flowers Using Mathematics,之后我会就这个话题写一个专门推送。

当我们将一个圆按照黄金比例进行切割时,其中较小的圆弧对应的角度为,我们按照这个角度将圆上面的点散布开,操作如下:

### 设定偏转角度
angle 3 - sqrt(5))

### 绘制500个点
theta 1:500) * angle
x y df 
### 去掉坐标轴 设定颜色为粉色
### 偏转坐标点
ggplot(df, aes(x*theta, y*theta)) +
  geom_point(size=8, alpha=0.5, color="#e8b5b5") +
  theme_void() +
  theme(aspect.ratio = 1)

### 保存图片 
ggsave("pinkbubble.png", scale = 1.5, dpi = 300)

8fa9cbbba56e2c326c8f44187ab93e8c.png

以上,就是今天的内容。最后,祝大家新的一年平安幸福,也希望疫情早日结束2d7c1ad6e170d2e60ef45423a0686e8b.png2d7c1ad6e170d2e60ef45423a0686e8b.png2d7c1ad6e170d2e60ef45423a0686e8b.png

相关文章:

  • 二次开发python_Python二次开发在行保后处理中的应用续
  • rust核电分解机在哪里_腐蚀工厂在哪?全工厂地点位置一览
  • 返回类型_oracle数据库中自定义类型function 返回复杂自定义类型Table
  • 日期函数month_Excel办公技巧:SUMPRODUCT函数用法解析
  • python导出千万数据到excel_python将大量数据导出到Excel中的方法
  • erdas叠加显示_利用erdas对遥感影像进行分类具体步骤
  • python对象属性的继承_python入门(十四):面向对象(属性、方法、继承)
  • python 几何教学_opencv-python-学习笔记九(图像几何转换)
  • c++builder安装opengl组件_刚下完的游戏竟然缺少组件?是游戏出了问题还是系统出了问题...
  • mysql的root用户密码_如何修改MySQL root用户密码
  • mysql 授权语句格式_mysql语句的授权
  • mysql charset=utf-8_mysql数据库charset=utf-8
  • nodejs mysql 断线重连_nodejs中mysql断线重连
  • mac mysql.tar.gz_mac 安装 mysql.tar.gz
  • debian 编译mysql源码_debian 下编译mysql源码出错【求助】
  • 《Java编程思想》读书笔记-对象导论
  • 2017-08-04 前端日报
  • 2017届校招提前批面试回顾
  • 2017年终总结、随想
  • Bytom交易说明(账户管理模式)
  • Django 博客开发教程 16 - 统计文章阅读量
  • interface和setter,getter
  • Invalidate和postInvalidate的区别
  • js数组之filter
  • Kibana配置logstash,报表一体化
  • node 版本过低
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 使用parted解决大于2T的磁盘分区
  • 用mpvue开发微信小程序
  • 在weex里面使用chart图表
  • MPAndroidChart 教程:Y轴 YAxis
  • ​Linux·i2c驱动架构​
  • # Apache SeaTunnel 究竟是什么?
  • #单片机(TB6600驱动42步进电机)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $.ajax()参数及用法
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (bean配置类的注解开发)学习Spring的第十三天
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (分布式缓存)Redis分片集群
  • (四)图像的%2线性拉伸
  • (转)EXC_BREAKPOINT僵尸错误
  • ..回顾17,展望18
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .Net Redis的秒杀Dome和异步执行
  • .NET6实现破解Modbus poll点表配置文件
  • .net中的Queue和Stack
  • .NET中两种OCR方式对比
  • .sh
  • 。Net下Windows服务程序开发疑惑
  • /etc/motd and /etc/issue