#绘制圆心_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)
这样我们就绘制出了一个标准的以为圆心,半径为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)
如果我们只想更改圆心坐标呢?修改圆心坐标,相当于将整个圆上的所有点进行位移。比如,圆心从位移到,相当于所有的点的横坐标向右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)
将上述两步结合,我们即可获得任意圆心任意半径的圆。比如,我们现在绘制以为圆心,半径为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)
实心圆
上面几个小节讲的都是绘制圆圈,如果我们想要绘制实心圆,只需将函数命令geom_path()
调整为geom_polygon()
。比如,我们以刚才的为圆心半径为2的圆为例:
### 使用geom_polygon()绘制实心圆
ggplot(df, aes(x, y)) +
geom_polygon() +
theme(aspect.ratio = 1)
这个实心圆巨丑,我们可以调整参数color
和fill
改变边框和填充颜色,比如都调整为tiffany蓝,然后去掉坐标轴:
### 使用geom_polygon()绘制实心圆
### 设定边框和填充均为tiffany蓝
ggplot(df, aes(x, y)) +
geom_polygon(color = "#0ABAB5", fill = "#0ABAB5") +
theme_void() +
theme(aspect.ratio = 1)
虽然我觉得,这样也挺丑!
粉色泡泡
上面都是简单粗暴的圆,在最后,我想绘制一幅利用大自然的黄金比例开枝散叶的粉色泡泡图。这里借鉴了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)
以上,就是今天的内容。最后,祝大家新的一年平安幸福,也希望疫情早日结束