上篇推文介绍了ggplot2
中的一些矩形函数,本篇来介绍一些不规则面状图形的画法。一共有如下几个函数:
geom_ribbon
geom_area
geom_polygon
首先定义如下示例数据:
library(tidyverse)
dta = tibble(
x0 = seq(-2*pi, 2*pi, 0.01*pi),
y0 = sin(x0),
z0 = cos(x0)
)
geom_ribbon()
该函数的映射变量中有一个x
变量,两个y
变量(即ymin
、ymax
),不规则图形是两条曲线所夹的图形。
ggplot(dta) +
geom_ribbon(aes(x0, ymin = y0, ymax = z0),
fill = "#66BD63", alpha = 0.5) +
geom_line(aes(x0, y0), col = "red") +
geom_line(aes(x0, z0), col = "blue") +
theme_bw()
![426a7d45541d04a2c4b675534a6b8aac.png](https://i-blog.csdnimg.cn/blog_migrate/62d0ce18ad6daad9f2faadba0843a91e.png)
将ymin
和ymax
参数的值调换,不会影响所绘制的图形:
ggplot(dta) +
geom_ribbon(aes(x0, ymin = z0, ymax = y0),
fill = "#66BD63", alpha = 0.5) +
geom_line(aes(x0, z0), col = "red") +
geom_line(aes(x0, y0), col = "blue") +
theme_bw()
![3ec1935d986e2822e40f5685294a7e75.png](https://i-blog.csdnimg.cn/blog_migrate/e4031a3f985d9550f1f3e126feca0408.png)
同样地,也可以设置一个y
变量,两个x
变量(即xmin
、xmax
):
ggplot(dta) +
geom_ribbon(aes(y = x0, xmin = z0, xmax = y0),
fill = "#66BD63", alpha = 0.5) +
geom_path(aes(y0, x0), col = "red") +
geom_path(aes(z0, x0), col = "blue") +
theme_bw()
![2e4271c5b7dc0886e9144445c7213d83.png](https://i-blog.csdnimg.cn/blog_migrate/0d1213aedde32eb55dc21acd018249bb.png)
geom_area()
该函数的映射变量中x
和y
各一个,不规则图形是曲线与x轴所围成的图形。
ggplot(dta) +
geom_area(aes(x0, y = y0),
fill = "red", alpha = 0.2) +
geom_area(aes(x0, y = z0),
fill = "blue", alpha = 0.2) +
geom_line(aes(x0, y0), col = "red") +
geom_line(aes(x0, z0), col = "blue") +
theme_bw()
![3e594ee5c80818244259c33e98c63b9e.png](https://i-blog.csdnimg.cn/blog_migrate/3ec92296e82253527677b291bc283547.png)
❝❞
上图中,红色区域是正弦函数与x轴所围成的图形;蓝色区域为余弦函数与x轴所围成的图形;紫色区域为前二者重叠区域。
geom_polygon()
该函数的映射变量中x
和y
各一个,不规则区域为曲线首尾相连所围成的图形。
ggplot(dta) +
geom_polygon(aes(x0, y = y0),
fill = "red", alpha = 0.2) +
geom_polygon(aes(x0, y = z0),
fill = "blue", alpha = 0.2) +
geom_line(aes(x0, y0), col = "red") +
geom_line(aes(x0, z0), col = "blue") +
theme_bw()
![439f9e39f8f089173b09d9bbd09e4175.png](https://i-blog.csdnimg.cn/blog_migrate/a43872bce5856b3df7959cca07a09b2e.png)
❝❞
由于在区间内,正弦函数的首、尾点均在x轴上,因此红色区域为正弦函数与直线y = 0(即x轴)所围成的图形;
余弦函数的首、尾点均在直线y = 1上,因此蓝色区域为余弦函数与该直线所围成的区域。
当首、尾点不在同一水平线上时:
dta2 = tibble(
x0 = seq(-pi, 4*pi, 0.01*pi),
y0 = sin(x0),
z0 = cos(x0)
)
ggplot(dta2) +
geom_polygon(aes(x0, y = z0),
fill = "blue", alpha = 0.2) +
geom_line(aes(x0, z0), col = "blue") +
theme_bw()
![e9aafd630090bb23e9b5d1fa0e03a657.png](https://i-blog.csdnimg.cn/blog_migrate/644c562c7044e4374842016404190a82.png)
需要注意的是,geom_polygon()
函数绘制图形时,是依次连接各点并将首尾连接,因此变量元素的顺序会影响所绘制的图形。如将示例数据的行顺序随机打乱再进行图形绘制:
n = dim(dta2)[1]
dta3 <- tibble(
x0 = sample(dta2$x0, n),
y0 = sin(x0),
z0 = cos(x0)
)
ggplot(dta3) +
geom_polygon(aes(x0, y = y0),
fill = "red", alpha = 0.2) +
geom_polygon(aes(x0, y = z0),
fill = "blue", alpha = 0.2) +
geom_line(aes(x0, y0), col = "red") +
geom_line(aes(x0, z0), col = "blue") +
theme_bw()
![b9f515a40aa9d0537fce6c2b5e3374ca.png](https://i-blog.csdnimg.cn/blog_migrate/9dbabde846c95433123985ad8d773f01.png)