ggpattern包-基于几何图案或图像的自定义填充

简介: 平时我们做柱状图或饼图都会用彩色进行填充,但是文章有时候为了节约成本采用黑白印刷时候,图形一般都会做成各种阴影线条填充模式来进行区分(如下图),R中的ggpattern包刚好可以满足了我们的需求,若有需要就来学习下吧~

平时我们做柱状图或饼图都会用彩色进行填充,但是文章有时候为了节约成本采用黑白印刷时候,图形一般都会做成各种阴影线条填充模式来进行区分(如下图),R中的ggpattern包刚好可以满足了我们的需求,若有需要就来学习下吧~该包也给出了详细的文档适合初学者跟着学习,地址:https://coolbutuseless.github.io/package/ggpattern/index.html

409958190f6b2d93dbfad8c98fd3559.png

特点总结:

  • 几乎满足所有来自ggplot2拥有填充特性的geoms (如bar、boxplot等)
  • 一套控制图案外观的aesthetics
  • 包含了用户定义模式的能力

安装

# install.packages("remotes")
remotes::install_github("coolbutuseless/ggpattern")
library(ggpattern)

这里就演示常见的7\8 种图形,详细内容自行阅读源文档~~

绘图

1. geom_col_pattern

df <- data.frame(level = c("a", "b", "c", 'd'), outcome = c(2.3, 1.9, 3.2, 1))
ggplot(df) +
    geom_col_pattern(
    aes(level, outcome, pattern_fill = level),
    pattern = 'stripe',
    fill    = 'white',## 填充色
    colour  = 'black'## 边框
  ) +
  theme_bw(18) +
  theme(legend.position = 'none') +
  labs(
    title    = "ggpattern::geom_pattern_col()",
    subtitle = "pattern = 'stripe'"
  ) +
  coord_fixed(ratio = 1/2)

8027fa5411e693e4c65a0f5f7759e43.png

主要函数为geom_col_pattern,pattern提供形状,fill填充色,colour边框颜色

不同分组映射不同形状

p <- ggplot(df, aes(level, outcome)) +
  geom_col_pattern(
    aes(pattern = level, fill = level, pattern_fill = level),
    colour                   = 'black',
    pattern_density          = 0.35,
    pattern_key_scale_factor = 1.3) +
  theme_bw() +
  labs(
    title    = "ggpattern::geom_col_pattern()",
    subtitle = 'geometry-based patterns'
  ) +
  scale_pattern_fill_manual(values = c(a='blue', b='red', c='yellow', d='darkgreen')) +
  theme(legend.position = 'none') +
  coord_fixed(ratio = 1)
p

bf8e4ca1b31f61425b04efc4eb0f770.png

这里我们多加了个参数pattern_density = 0.35, 作用改变图案密度即改变元素向邻近元素延伸的距离。它是一个分数,通常要求取值范围为[0,1]。

7b0a1b14096ec5a89f86fff070c0001.png

自定义颜色

利用scale_pattern_fill_manual函数

p <- ggplot(df, aes(level, outcome)) +
  geom_col_pattern(
    aes(pattern = level, fill = level, pattern_fill = level),
    colour                   = 'black',
    pattern_density          = 0.35,
    pattern_key_scale_factor = 1.3) +
  theme_bw() +
  labs(
    title    = "ggpattern::geom_col_pattern()",
    subtitle = 'geometry-based patterns'
  ) +
  scale_pattern_fill_manual(values = c(a='blue', b='red', c='yellow', d='darkgreen')) +
  theme(legend.position = 'none') +
  coord_fixed(ratio = 1)
p

954f35b95997c9dc39e79bdc312eef7.png

2. geom_bar_pattern()

p <- ggplot(mpg, aes(class)) +
  geom_bar_pattern(
    aes(
      pattern = class,
      pattern_angle = class
    ),
    fill            = 'white',
    colour          = 'black',
    pattern_spacing = 0.025
  ) +
  theme_bw(18) +
  labs(title = "ggpattern::geom_bar_pattern()") +
  theme(legend.position = 'none') +
  coord_fixed(ratio = 1/15) +
  scale_pattern_discrete(guide = guide_legend(nrow = 1))
p

e27bb41661f5da3231921c6bf87115c.png


其中参数pattern_spacing 代表元素之间的距离

49ee7bb9840063333f4316812867ad0.png

pattern_angle代表元素旋转角度

87521823f482120488bea687ac0bd8e.png

利用geom_bar_pattern()绘制饼图

df <- data.frame(
  group = factor(c("Cool", "But", "Use", "Less"), levels = c("Cool", "But", "Use", "Less")),
  value = c(10, 20, 30, 40)
)
p <- ggplot(df, aes(x="", y = value, pattern = group, pattern_angle = group))+
  geom_bar_pattern(
    width                = 1,
    stat                 = "identity",
    fill                 = 'white',
    colour               = 'black',
    pattern_aspect_ratio = 1,
    pattern_density      = 0.3
  ) +
  coord_polar("y", start=0) +
  theme_void(20) +
  theme(
    legend.key.size = unit(2, 'cm')
  ) +
  labs(title = "ggpattern::geom_bar_pattern() + coord_polar()")
p

485fba778afc8cea130a641978a29b0.png

饼图

3.geom_bin2d_pattern()

p <- ggplot(diamonds, aes(x, y)) +
  xlim(4, 10) + ylim(4, 10) +
  geom_bin2d_pattern(aes(pattern_spacing = ..density..), fill = 'white', bins = 6, colour = 'black', size = 1) +
  theme_bw(18) +
  theme(legend.position = 'none') +
  labs(title = "ggpattern::geom_bin2d_pattern()")
p
#> Warning: Removed 478 rows containing non-finite values (stat_bin2d).

a9e534e3e2186c1a098c25057489ce9.png

二维封箱热图

4. geom_boxplot_pattern() 箱线图

p <- ggplot(mpg, aes(class, hwy)) +
  geom_boxplot_pattern(
    aes(
      pattern      = class,
      pattern_fill = class
    ),
    pattern_spacing = 0.03
  ) +
  theme_bw(18) +
  labs(title = "ggpattern::geom_boxplot_pattern()") +
  theme(legend.position = 'none') +
  coord_fixed(1/8)
p

d6674fc430be1121e5d694742c09f33.png

5. geom_crossbar_pattern()

df <- data.frame(
  trt = factor(c(1, 1, 2, 2)),
  resp = c(1, 5, 3, 4),
  group = factor(c(1, 2, 1, 2)),
  upper = c(1.1, 5.3, 3.3, 4.2),
  lower = c(0.8, 4.6, 2.4, 3.6)
)
p <- ggplot(df, aes(trt, resp, colour = group)) +
    geom_crossbar_pattern(
      aes(
        ymin          = lower,
        ymax          = upper,
        pattern_angle = trt,
        pattern       = group
      ), width        = 0.2,
      pattern_spacing = 0.02
    ) +
    theme_bw(18) +
    labs(title = "ggpattern::geom_crossbar_pattern()") +
    theme(legend.position = 'none') +
    coord_fixed(ratio = 1/3)
p

7c9bec36da04a07064e3c5e112e4bc5.png

crossbar

6. geom_density_pattern()

p <- ggplot(mtcars) +
   geom_density_pattern(
     aes(
       x            = mpg,
       pattern_fill = as.factor(cyl),
       pattern      = as.factor(cyl)
     ),
     fill                     = 'white',
     pattern_key_scale_factor = 1.2,
     pattern_density          = 0.4
   ) +
   theme_bw(18) +
   labs(title = "ggpattern::geom_density_pattern()") +
   theme(legend.key.size = unit(2, 'cm')) +
   coord_fixed(ratio = 100)
p

19e258130f3194eeb780ea5389075ae.png

密度图

7. geom_map_pattern()

library(maps)
crimes <- data.frame(state = tolower(rownames(USArrests)), USArrests)
crimesm <- reshape2::melt(crimes, id = 1)
states_map <- map_data("state")
p <- ggplot(crimes, aes(map_id = state)) +
    geom_map_pattern(
      aes(
        # fill            = Murder,
        pattern_fill    = Murder,
        pattern_spacing = state,
        pattern_density = state,
        pattern_angle   = state,
        pattern         = state
      ),
      fill   = 'white',
      colour = 'black',
      pattern_aspect_ratio = 1.8,
      map    = states_map
    ) +
    expand_limits(x = states_map$long, y = states_map$lat) +
    coord_map() +
    theme_bw(18) +
    labs(title = "ggpattern::geom_map_pattern()") +
    scale_pattern_density_discrete(range = c(0.01, 0.3)) +
    scale_pattern_spacing_discrete(range = c(0.01, 0.03)) +
    theme(legend.position = 'none')
p

5e7a12cb9198719c506682ee666f326.png

map

8. geom_violin_pattern()

p <- ggplot(mtcars, aes(as.factor(cyl), mpg)) +
  geom_violin_pattern(aes(pattern = as.factor(cyl))) +
  theme_bw(18) +
  labs(title = "ggpattern::geom_violin_pattern()") +
  theme(
    legend.key.size  = unit(2, 'cm')
  ) +
  coord_fixed(1/15)
p

42d8af90f50b7a66bf28bea25458d93.png

Violin

其它好玩的

  1. 结合gganimate包绘制动态的条形图
    1d6f657cce9d02de75a386c033e1ad6.png
  2. 以图片形式填充你的图形,这里利用pattern= 'placeholder'模式,类型pattern_type选择kitten, 填充个几个噬元兽试试

p <- ggplot(mpg, aes(class)) +
  geom_bar_pattern(
    aes(
      pattern_angle = class
    ),
    pattern         = 'placeholder',
    pattern_type    = 'kitten',
    fill            = 'white',
    colour          = 'black',
    pattern_spacing = 0.025
  ) +
  theme_bw(18) +
  labs(
    title = "ggpattern::geom_bar_pattern()",
    subtitle = "pattern = 'placeholder', pattern_type = 'kitten'"
  ) +
  theme(legend.position = 'none') +
  coord_fixed(ratio = 1/15) +
  scale_pattern_discrete(guide = guide_legend(nrow = 1))
p

8906cb595cd37d596be0d629a4f41d8.png

改变pattern_type=murray

fea35ae89c926c8dafa3efb03385add.png

哈哈,更多好玩的图形自己摸索吧,当然也支持自定义图片呦: 提供图片给一个向量后, 结合pattern = 'image' 模式和scale_pattern_filename_discrete()函数轻松绘制,很是easy!!

相关文章
|
6月前
|
Python
python用鼠标获取图像任一点的坐标和像素值
python用鼠标获取图像任一点的坐标和像素值
|
Linux
【PyAutoGUI操作指南】05 屏幕截图与图像定位:截图+定位单个目标+定位全部目标+灰度匹配+像素匹配+获取屏幕截图中像素的RGB颜色
【PyAutoGUI操作指南】05 屏幕截图与图像定位:截图+定位单个目标+定位全部目标+灰度匹配+像素匹配+获取屏幕截图中像素的RGB颜色
1039 0
|
12天前
如何设置条件格式以填充颜色?
【10月更文挑战第21天】如何设置条件格式以填充颜色?
27 2
|
25天前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
41 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
2月前
|
前端开发 定位技术 API
文字展示、坐标点给咱们返回
该React组件实现了基于高德地图API的地图功能,通过循环遍历后台数据动态创建并添加带有标签的标记(markers)至地图上。左侧的图例盒子采用绝对定位实现,包含缩放按钮与图例说明。点击+/-按钮可分别实现地图的放大与缩小,同时限制了地图的最大最小缩放级别为18和3。
13 0
|
6月前
|
Java Apache 索引
POI操作大全(动态合并单元格,为单元格生成一个自定义的数据显示格式,自定义公式计算结果生成,读取excel,word文件在生成图片,word指定位置生成图片)
POI操作大全(动态合并单元格,为单元格生成一个自定义的数据显示格式,自定义公式计算结果生成,读取excel,word文件在生成图片,word指定位置生成图片)
905 0
|
6月前
|
算法 数据可视化
圆填充( CIRCLE PACKING)算法圆堆图圆形空间填充算法可视化
圆填充( CIRCLE PACKING)算法圆堆图圆形空间填充算法可视化
|
定位技术
任意一张图片的CGCS2000坐标配准
任意一张图片的CGCS2000坐标配准
135 0
|
编解码 前端开发 PHP
悬浮坐标解决方案:如何在图片获取xy鼠标位置和增加标注信息
悬浮坐标解决方案:如何在图片获取xy鼠标位置和增加标注信息
158 0
使用边界跟踪方法标识图像中的圆形目标
使用边界跟踪方法,根据对象的圆度对其进行分类。
94 0