繪圖技巧 - 這種帶填充的學術圖表怎麼做?一行代碼搞定

前兩天收到讀者私信 ” 可不可以出一片關於底紋填充的可視化教程?“ 小編在思考完之後,確實在某些使用場景下底紋填充確實有其獨有的優勢。那麼這一篇推文,小編就給大家介紹一個可以滿足你所有底紋填充幻想的可視化繪圖技巧。主要內容如下:

R-ggpattern 包簡介

ggpattern 包和一般的 ggplot2 拓展包不同,其爲了更好的實現靈活的底紋填充功能,獨立編寫了強大的 ggplot2 的 geoms 功能,當然,其語法還是我麼熟悉的那個味道。

ggpattern 包的官網:https://github.com/coolbutuseless/ggpattern。更多本文沒有介紹到的細節,小夥伴們可到官網進行探索。

由於 ggpattern 包提供了大量的用於繪製不同圖表類型的函數,這裏我們主要介紹常用的幾種哈 (小編認爲的)。

  1. geom_bar_pattern(): 用於繪製填充底紋的柱形圖,其 mapping, data, stat 等 Arguments 和 geom_bar() 函數一樣。但 Pattern Arguments 則爲其底紋填充特製的參數,主要有:pattern、pattern_colour、pattern_fill、pattern_angle、pattern_density 等。

  2. geom_boxplot_pattern(): 用於繪製帶填充底紋的箱線圖。主要參數同上。

  3. geom_col_pattern(): 繪製帶填充底紋的柱形圖,注意和 geom_col() 和 geom_col() 之間的區別 (geom_bar() 只能映射 Y 值,geom_col() 既能映射 Y 值,也能映射 X 值)。主要參數同上。

  4. geom_density_pattern(): 繪製帶填充底紋的密度圖。主要參數同上。

  5. geom_map_pattern(): 繪製帶填充底紋的地圖。這一個繪圖函數小編認爲是較新穎且實用較多。主要參數同上。

  6. geom_sf_pattern():繪製 sf 對象的帶填充底紋的地圖。有了這個繪圖函數,大部分地圖都是可以繪製了的。主要參數同上。

R-ggpattern 包優質實例美化

這一部分,小編就結合具體實例進行可視化繪製,幫助大家更好的理解 ggpattern 繪圖函數。

geom_bar/col_pattern()

繪製帶填充底紋的柱形圖,應該是日常中需求最多的了,下面通過構造數據詳細講解下不同類型的柱形圖填充圖表。

「樣例一」:geom_col_pattern()

#生成數據
df <- data.frame(level = c("A""B""C"'D')outcome = c(2, 3, 6, 4))
p1_cus <- ggplot(df, aes(level, outcome)) +
  ggpattern::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'
  ) +
  labs(
    title = "Example of <span style='color:#D20F26'>ggpattern::geom_col_pattern()</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>geom_col_pattern()</span>",
    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +
  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")  +
  scale_pattern_spacing_discrete(range = c(0.01, 0.04)) +
  theme(plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                  size = 20, margin = margin(t = 1, b = 12)),
        plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
        plot.caption = element_markdown(face = 'bold',size = 12))

可視化結果如下:

Example of geom_col_pattern()

附上不同顏色:

library(ggsci)
mypal <- pal_jco("default")(4)

p2_cus <- ggplot(df, aes(level, outcome)) +
  geom_col_pattern(
    aes(pattern = level,pattern_fill = level),
      fill="white",colour = 'black',pattern_density = 0.35,pattern_spacing=0.02,
      pattern_key_scale_factor = 1.3) +
  labs(
    title = "Example of <span style='color:#D20F26'>ggpattern::geom_col_pattern()</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>geom_col_pattern() in different color</span>",
    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +
  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")  +
  # 設置不同顏色
  scale_pattern_fill_manual(values = mypal)+
  theme(plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                  size = 20, margin = margin(t = 1, b = 12)),
        plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
        plot.caption = element_markdown(face = 'bold',size = 12))

可視化結果如下:

Example of geom_col_pattern() in different color

「樣例二」:geom_bar_pattern()

p3_cus <- ggplot(mpg, aes(class)) +
  geom_bar_pattern(
    aes(pattern = class,pattern_angle = class),
    fill = 'white',
    colour = 'black',
    pattern_spacing = 0.02) +
  labs(
    title = "Example of <span style='color:#D20F26'>ggpattern::geom_bar_pattern()</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>geom_bar_pattern()</span>",
    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +
  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")  +
  scale_pattern_discrete(guide = guide_legend(title.position = "left",
                                              title.theme=element_text(face = 'bold',size=12),
                                              #label.theme=element_text(face = 'bold'),
                                              nrow = 1)) +
  theme(plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                  size = 20, margin = margin(t = 1, b = 12)),
        plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
        plot.caption = element_markdown(face = 'bold',size = 12),
        legend.position = "bottom")

Example of geom_bar_pattern()

coord_polar():

df <- data.frame(
  group = factor(c("Cool""But""Use""Less")levels = c("Cool""But""Use""Less")),
  value = c(10, 20, 30, 40)
)
mypal <- pal_jco("default")(4)

p4_cus <- ggplot(df, aes(x=""y = value, pattern = group, pattern_fill = group,
                     pattern_angle = group))+
  geom_bar_pattern(width= 1,stat = "identity",fill= 'white',colour = 'black',
                   pattern_aspect_ratio = 1,pattern_density = 0.4,pattern_spacing = 0.02) +
  coord_polar("y"start=0) +
    # 設置不同顏色
  scale_pattern_fill_manual(values = mypal) +
  labs(
    title = "Example of <span style='color:#D20F26'>ggpattern::geom_bar_pattern()+coord_polar()</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>geom_bar_pattern() in different color</span>",
    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +
  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")  +
  #theme_void(base_family = "Roboto Condensed") +
  theme(plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                  size = 20, margin = margin(t = 1, b = 12)),
        plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
        plot.caption = element_markdown(face = 'bold',size = 12),
        legend.position = "top",
        axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank())

Example of geom_bar_pattern()+coord_polar()

「樣例三」:geom_map_pattern()

library(maps)
library(reshape2)
crimes <- data.frame(state = tolower(rownames(USArrests)), USArrests)
crimesm <- reshape2::melt(crimes, id = 1)
states_map <- map_data("state")

map01 <- ggplot(crimes, aes(map_id = state)) +
    geom_map_pattern(
      aes(
        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$longy = states_map$lat) +
    coord_map() +
    labs(
    title = "Example of <span style='color:#D20F26'>ggpattern::geom_map_pattern()</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>geom_map_pattern()</span>",
    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +
    hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")  +
    scale_pattern_density_discrete(range = c(0.01, 0.3)) +
    scale_pattern_spacing_discrete(range = c(0.01, 0.02)) +
    theme(plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                  size = 20, margin = margin(t = 1, b = 12)),
        plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
        plot.caption = element_markdown(face = 'bold',size = 12),
        legend.position = "none")

Example of geom_map_pattern()

「樣例四」:geom_sf_pattern()

library(albersusa)
us_sf <- usa_sf("laea")

map02 <- ggplot(us_sf) +
  geom_sf_pattern(aes(pattern = name,fill= name,pattern_density=name,pattern_spacing=name),
                 fill = 'white',colour = 'black',pattern_fill = 'black',
                 pattern_colour  = 'black') +
    labs(
    title = "Example of <span style='color:#D20F26'>ggpattern::geom_sf_pattern()</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>geom_sf_pattern()</span>",
    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +
    hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")  +
    scale_pattern_density_discrete(range = c(0.01, 0.3)) +
    scale_pattern_spacing_discrete(range = c(0.01, 0.02)) +
    theme(plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                  size = 20, margin = margin(t = 1, b = 12)),
        plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
        plot.caption = element_markdown(face = 'bold',size = 12),
        legend.position = "none")

Example of geom_sf_pattern()

「小編提醒」:大家可多使用該方法繪製地圖圖表的底紋填充哦~~

當然,R-ggpattern 包的底紋填充功能遠遠不止這些,如填充圖片等小編在這裏無法一一詳細介紹,感興趣的小夥伴可自行去官網學習掌握哈~

總結

今天這篇推文,小編詳細介紹瞭如何對常見突變進行多樣式的底紋填充,特別是對於地圖可視化作品來說,這種底紋填充較常見且不易完成 (沒看過小編這篇推文之前)。希望大家可多多練習,繪製出自己的可視化作品。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/vaCVqcnhIczPKTd30h7uGg