ggpattern——ggplot2的好帮手

ggplot2强大的图形可视化能力使得R语言成为科研绘图的佼佼者,因此也衍生出了一系列辅助包,在ggplot2绘图的基础上进行补充、完善、美化。今天为大家带来的ggpattern就是一款十分实用、易上手且趣味性十足的辅助包,ggplot2的输出的每一种geom_几何对象都能在ggpattern里找到对应的geom_pattern进行填充,并且函数及参数对应度很高,用法很相似,除了内嵌的固定用法以外,用户还可以根据自己的喜好自定义,相当人性化,小伙伴们不要错过哦。

7bf3341fb32835a5cd0daab8159e2ff1.png

#安装并加载,可在cran直接获得
install.packages('ggplot2')
install.packages('ggpattern') 
library(ggplot2)
library(ggpattern)
#填充样式
df <- data.frame(level = c("a", "b", "c", 'd'), outcome = c(2.3, 1.9, 3.2, 1))
ggplot(df, aes(level, outcome)) +
  geom_col_pattern(
    aes(pattern = level, pattern_angle = level, pattern_spacing = level), 
    fill            = 'white',
    colour          = 'black', 
    pattern_density = 0.35, 
    pattern_fill    = 'black',
    pattern_colour  = 'black'
  ) +
  theme_bw() +
  labs(
    title    = "ggpattern::geom_col_pattern()",
    subtitle = 'geometry-based patterns'
  ) +
  scale_pattern_spacing_discrete(range = c(0.01, 0.05)) + 
  theme(legend.position = 'none') + 
  coord_fixed(ratio = 1)

5b2fe806eafc0fea263e055d4a821985.png

#调整颜色
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)

e1e02a9bdf7aa940fe29b05021ea1851.png

接下来展示一下常用图形的填充方法。

#geom_bar_pattern()
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))

33b752a761a6f0bd0e0398b611bc1a1d.png

#pie graph
df <- data.frame(
  group = factor(c("Cool", "But", "Use", "Less"), levels = c("Cool", "But", "Use", "Less")),
  value = c(10, 20, 30, 40)
)
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()")

2562efe1d109cf46d64519cf2965bc4e.png

#geom_bin2d_pattern()
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()")

d3791a0540a5c739b96e6da4ebab097c.png

#geom_boxplot_pattern()
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)

39d9ba944ffcc4be4bae4a45197616aa.png

#geom_col_pattern()
df <- data.frame(trt = c("a", "b", "c"), outcome = c(2.3, 1.9, 3.2))
ggplot(df, aes(trt, outcome)) +
  geom_col_pattern(
    aes(
      pattern = trt, 
      fill    = trt
    ), 
    colour                   = 'black', 
    pattern_density          = 0.5, 
    pattern_key_scale_factor = 1.11
  ) +
  theme_bw(18) +
  labs(title = "ggpattern::geom_col_pattern()") + 
  theme(legend.position = 'none') +  
  coord_fixed(ratio = 1/2)

5c2e82ec63531a47064699ece96dcb65.png

#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)
)
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)

ffb42943849f3e53b1bc00a0bca86688.png

#geom_density_pattern()
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)

40c7eda9cb46fbd6029415eccb2c5b4f.png

.

#geom_map_pattern()
crimes <- data.frame(state = tolower(rownames(USArrests)), USArrests)
states_map <- map_data("state")
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')

71bcaa90f7de00d448df61e3cdbd8a22.png

#geom_polygon_pattern()
angle <- seq(0, 2*pi, length.out = 7) + pi/6
polygon_df <- data.frame(
  angle = angle,
  x     = cos(angle),
  y     = sin(angle)
)
ggplot(polygon_df) +
  geom_polygon_pattern(
    aes(x = x, y = y), 
    fill            = 'white', 
    colour          = 'black', 
    pattern_spacing = 0.15, 
    pattern_density = 0.4, 
    pattern_fill    = 'lightblue', 
    pattern_colour  = '#002366',
    pattern_angle   = 45
  ) + 
  labs(title = "ggpattern") + 
  coord_equal() + 
  theme_bw(25) + 
  theme(axis.title = element_blank())

e1c0fe2c9e77437e928b7ccdd11bc729.png

#geom_rect_pattern()
plot_df <- data.frame(
  xmin    = c(0, 10),
  xmax    = c(8, 18),
  ymin    = c(0, 10),
  ymax    = c(5, 19),
  type    = c('a', 'b'),
  angle   = c(45, 0),
  pname   = c('circle', 'circle'),
  pcolour = c('red', 'blue'),
  pspace  = c(0.03, 0.05),
  size    = c(0.5, 1),
  stringsAsFactors = FALSE
)
ggplot(plot_df) +
  geom_rect_pattern(
    aes(
      xmin=xmin, ymin=ymin, xmax=xmax, ymax=ymax,
      pattern_angle   = I(angle),
      pattern_colour  = I(pcolour),
      pattern_spacing = I(pspace),
      pattern_size    = I(size)
    ),
    pattern         = 'circle',
    fill            = 'white',
    colour          = 'black',
    pattern_density = 0.3
  ) +
  theme_bw(18) +
  labs(title = "ggpattern::geom_rect_pattern()") + 
  theme(legend.key.size = unit(1.5, 'cm'))

c87c219cb5bd24b55338fedcc5189194.png

#geom_ribbon_pattern()
huron <- data.frame(year = 1875:1972, level = as.vector(LakeHuron))
ggplot(huron, aes(year)) +
  geom_ribbon_pattern(
    aes(
      ymin = level - 1, 
      ymax = level + 1
    ), 
    fill            = NA, 
    colour          = 'black',
    pattern         = 'circle',
    pattern_spacing = 0.03, 
    pattern_density = 0.5,
    pattern_angle   = 30,
    outline.type    = 'legacy'
  ) +
  theme_bw(18) +
  labs(title = "ggpattern::geom_ribbon_pattern()")

657610f80abd2fd7d5196850b8ee5394.png

#geom_sf_pattern()
nc <- sf::st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)
nc <- nc  %>% filter(between(CNTY_ID, 1820, 1830))
ggplot(nc) +
  geom_sf_pattern(
    aes(
      pattern = NAME, 
      fill    = NAME
    ),
    pattern_aspect_ratio = 2.8
  ) +
  theme_bw(15) + 
  theme(legend.key.size = unit(1.5, 'cm')) +
  labs(title = "ggpattern::geom_sf_pattern()")

babb1020d3e123a3e18ff22fecba177c.png

#geom_tile_pattern()
df <- data.frame(
  x = rep(c(2, 5, 7, 9, 12), 2),
  y = rep(c(1, 2), each = 5),
  z = factor(rep(1:5, each = 2)),
  w = rep(diff(c(0, 4, 6, 8, 10, 14)), 2)
)
ggplot(df, aes(x, y)) +
  geom_tile_pattern(
    aes(
      fill    = z, 
      pattern = z
    ), 
    colour = "grey50"
  ) +
  theme_bw(18) +
  labs(title = "ggpattern::geom_tile_pattern()") + 
  theme(
    legend.position = 'bottom',
    legend.key.size = unit(1.5, 'cm')
  ) + 
  coord_fixed(ratio = 4)

d397d9b82f288510ed7a6b51bb71dc2f.png

#geom_violin_pattern()
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)

1287bce7e8d9a171f6d27aa74cf0a660.png

----------------------------分界线----------------------------------

前几期我们的Small Dragon小伙伴分享了一个绘制动态图的包gganimate,本篇推文也接近尾声了,再给大家展示一下ggpattern和gganimate的结合,让你的个性化填充动起来!

library(ggpattern)
library(gganimate)
df1 <- data.frame(time = 1, offset = 0    , trt = c("a", "b", "c"), outcome = c(2.3, 1.9, 3.2), stringsAsFactors = FALSE)
df2 <- data.frame(time = 2, offset = 0.045, trt = c("a", "b", "c"), outcome = c(2.3, 1.9, 3.2), stringsAsFactors = FALSE)
df  <- rbind(df1, df2)
p <- ggplot(df, aes(trt, outcome)) +
    geom_col_pattern(
      aes(
        pattern_fill    = trt, 
        pattern_xoffset = I(offset), 
        pattern_yoffset = I(-offset)
      ), 
      colour          = 'black', 
      fill            = 'white',
      pattern_density = 0.5,
      pattern_angle   = 45
    ) +
    theme_bw() +
    labs(title = "ggpattern + gganimate") + 
    theme(legend.position = 'none') + 
    coord_fixed(ratio = 1/2) 
p <- p + transition_states(time, transition_length = 2,
                             state_length = 0, wrap = FALSE)

bab9d176c9da16afe445374bbcdc35dd.gif

除此之外,还有很多实用和有趣的函数与功能没有展示出来,小伙伴们感兴趣的话可以阅读原文献并且自己研究一下,会很受裨益。

a870a5334af1671d76e539969b77967c.jpeg

往期精品(点击图片直达文字对应教程)

6e461c23c1733c45e0bf798adcfcc724.jpeg

7bf34d79eb0af08ad7b9f691b6fe3fbe.jpeg

6bf55d00257eec60b488173f22092f58.jpeg

32b0ed53acec2041b181bb4e057d41fb.jpeg

68e0848f9e6c8c7e561e51b2ab28064e.jpeg

7eebe8ea5d0a3e1c084ba8b7fcf8a9d4.jpeg

39400ecffbb61a5d1400eef203dedf48.jpeg

fd58529528ffb0202e794a4d11953113.jpeg

01219899e84eeca921b487b84e24416a.jpeg

9fac0a7a9d2381832996bc77386acc50.jpeg

c1edb9ed7747d769e67c35db4824b305.jpeg

6a371e966e135cf545c8a70615fa8ef3.jpeg

c0c66808dae6f4bb782f5bf51fd7ba5f.png

3632f3fbe80e5d3fcd5f7150ec8c23e0.png

fd06704c9de74a1a194d680084174779.png

03ffa690d5ea8785e00aab2af0319f25.png

3ad4da9bfd5c97ca449589799f72af64.jpeg

fc29e2dbee5d8169a957f4686c7e7525.jpeg

f94730ea9830058e0150daca85ed5995.jpeg

7afb781ba821dad38ba638b05e35afe3.jpeg

431c2d868d29f9c1ddbaafd59a43ef94.png

bb1d0bc25084eafaacc4d86e2380d5da.png

8d766b7f144f05c73f12f508ebb36c14.jpeg

b5f1e7b7e6c20ef5d1da553216cb02a3.png

10428f67f57652fcdb8e831943a274a4.png

c81b75387d5e3c0f8b76e9491e582500.jpeg

6036a33d4c4489dc3406a82803f92156.png

27a6880c229845c15c1eaa613454227e.png

机器学习

后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集

3767c10adbb2c46ffe1a848bb0196cb6.jpeg

83201ff9632f2c507018c667a74bdfc1.jpeg

9348d50ce6a03074e9694ff1151ea652.png

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值