ggplot2 | 不规则面状图形

上篇推文介绍了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变量(即yminymax),不规则图形是两条曲线所夹的图形。

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

yminymax参数的值调换,不会影响所绘制的图形:

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

同样地,也可以设置一个y变量,两个x变量(即xminxmax):

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

geom_area()

该函数的映射变量中xy各一个,不规则图形是曲线与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
  • 上图中,红色区域是正弦函数与x轴所围成的图形;蓝色区域为余弦函数与x轴所围成的图形;紫色区域为前二者重叠区域。

geom_polygon()

该函数的映射变量中xy各一个,不规则区域为曲线首尾相连所围成的图形。

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
  • 由于在区间内,正弦函数的首、尾点均在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

需要注意的是,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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值