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

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

特点总结:

  • 几乎满足所有来自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)

主要函数为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

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

自定义颜色
利用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

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


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

pattern_angle代表元素旋转角度

利用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
饼图

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).
二维封箱热图

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

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
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
密度图

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
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
Violin

其它好玩的

  1. 结合gganimate包绘制动态的条形图


  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

改变pattern_type=murray

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 写在前面 ggplot2 是一个功能强大且灵活的R包 ,由Hadley Wickham 编写,其用于生成优雅的图...
    Boer223阅读 27,873评论 0 67
  • 图形属性 x y xmin xmax ymin ymax xend yend weight color:轮廓色 f...
    Liam_ml阅读 7,228评论 0 5
  • 1.数据和映射 把数据中的变量映射到图形属性上 映射完成后,要告诉ggplot2展示出什么样的几何图形,以散点图为...
    巩翔宇Ibrahimovic阅读 2,696评论 0 12
  • 《R数据科学》的再次回顾学习,以及使用tidyverse过程中的一些new tricks学习记录。 [TOC] 前...
    Dawn_WangTP阅读 1,257评论 0 11
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,473评论 16 22