跟着Nature Communications学画图:R语言ggplot2画带有底纹的柱形图

2021-11-23 15:32:06 浏览数 (1)

论文是

Bioactivity descriptors for uncharacterized chemical compounds

本地存储文件名 s41467-021-24150-4.pdf

公众号后台有读者留言问到了这个论文里的一些图的实现办法,但是我没有找到作图用到的原始数据。复现起来还是比较麻烦的。浏览全文的时候发现了其中一个带有底纹的柱形图。这个还是比较有用的。因为有的期刊可能会要求配色只能用黑白灰。区分不同的分组加上底纹可能会比较好看。之前出推文介绍过patternplot这个R包画带有底纹的柱形图,但是他的代码和ggplot2的格式区别还挺大的。最近又发现了一个R包ggpattern,画带有底纹的柱形图或者给柱形图添加图片都非常方便。今天的推文简单介绍一下这个图

ggpattern帮助文档

  • https://coolbutuseless.github.io/package/ggpattern/

首先是安装ggpattern

代码语言:javascript复制
remotes::install_github("coolbutuseless/ggpattern")

查看帮助文档

代码语言:javascript复制
help(package="ggpattern")

做柱形图填充用到的函数是geom_col_pattern(),填充的内容有4个,分别是 'stripe' (default), 'crosshatch', 'point', 'circle'

做一个简单的柱形图看下效果

代码语言:javascript复制
df<-data.frame(x=LETTERS[1:4],
               y=5)

library(ggplot2)
library(ggpattern)

ggplot() 
  geom_col_pattern(data=df,
                   aes(x=x,y=y,pattern=x),
                   #pattern="none",
                   pattern_fill="gray",
                   pattern_color="black",
                   fill="white") 
  scale_pattern_manual(values = c("stripe","crosshatch",
                                  "circle","none"))

这里

  • pattern_size 对应的是内部填充的边框
  • pattern_density 对应的是内部填充的粗细
  • pattern_spacing 对应的设置内部填充的多少

帮助文档里写道填充也可以用point,但是我用的时候遇到了报错,暂时不知道什么原因

比如

代码语言:javascript复制
ggplot() 
  geom_col_pattern(data=df,
                   aes(x=x,y=y),
                   pattern="point",
                   pattern_fill="gray",
                   pattern_color="black",
                   fill="white")

报错是

代码语言:javascript复制
Error: Don't know the function for pattern point
Run `rlang::last_error()` to see where the error occurred.

按照提示运行rlang::last_error(),返回内容

代码语言:javascript复制
<error/rlang_error>
Don't know the function for pattern point
Backtrace:
  1. (function (x, ...) ...
 22. grid:::drawGTree(x)
 24. gridpattern:::makeContent.pattern(x)
 25. gridpattern:::get_pattern_fn(x$pattern)
 26. `%||%`(...)
Run `rlang::last_trace()` to see the full context.

目前还看不懂报错原因

接下来模仿一下论文中的Figure1b

首先是随便构造一份数据,部分如下

读取数据集,然后把x列和y列粘贴到一起

代码语言:javascript复制
library(readxl)
library(tidyverse)

df<-read_excel("NC_figure1B.xlsx")
df %>% 
  mutate(new_col=paste(y,x,sep="")) -> df1

作图代码

代码语言:javascript复制
library(ggplot2)
library(ggpattern)
df1$new_col<-factor(df1$new_col,
                    levels = rev(df1$new_col))

ggplot() 
  geom_col_pattern(data=df1,aes(y=new_col,x=Molecules),
                   pattern="stripe",
                   pattern_fill="grey",
                   #pattern_color="blue",
                   pattern_density=0.2,
                   pattern_size=0,
                   fill="white",
                   color="black",
                   pattern_spacing=0.02,
                   width=0.5) 
  scale_x_continuous(expand = c(0,0),
                     limits = c(0,6.1),
                     breaks = c(3,4,5,6),
                     labels = c(expression(10^3),
                                expression(10^4),
                                expression(10^5),
                                expression(10^6))) 
  theme_bw() 
  labs(y=NULL) 
  ggsave(filename = "1b.pdf",
         width=3,
         height = 8,
         family="serif")

0 人点赞