在查阅文献的过程中,看到了几幅非常不错的出版图,今天就跟着小编一起学习下,他们是怎么使用 R 绘制出来的。
今天主要介绍 第六幅图(F) —— 四维散点图,这个图在科研绘图中也是较为常用。可以展现多个维度的数据。
前五幅图的详细代码介绍可见:基于 R 语言的科研论文绘图技巧详解(4)、基于 R 语言的科研论文绘图技巧详解(3)基于 R 语言的科研论文绘图技巧详解(2)基于 R 语言的科研论文绘图技巧详解(1) 。最后一幅图会随后继续介绍,读者在学习过程中,可以将内部学到的知识点应用到自己的图形绘制中。推文已经将主要知识点进行罗列,更有利于读者学习和查阅。
那我们来看看,作者是怎么实现这个功能的吧,本文知识点较多,大家耐心学习,建议自己实践。对应代码、数据可在 GitHub - marco-meer/scifig_plot_examples_R: Scientific publication figure plotting examples with R 中找到。
首先加载一些需要使用到的包。
library(ggplot2)
library(viridis) # 使用配色样式
接下来,为了方便起见,作者在绘图前设置好了主题,并将该函数命名为 my_theme
。
这一部分在第一篇推文给出,代码将在文末中完整代码给出。
手动修改大部分面板,具体可以参考本篇文章。或者观看我在 B 站发布的《R 语言可视化教程》,里面也有一些简单主题设置介绍。
首先使用 read.csv()
导入四维数据,前 6 行数据如下所示。
data_F = read.csv("./data_F.csv")
head(data_F)
# K n amplitude duration
1 32.586025 3.065018 21.95444 2.3242144
2 9.012644 2.358836 60.16122 1.0029049
3 10.814589 1.829281 25.99396 0.5406435
4 23.560813 1.709909 61.18815 2.7394397
5 7.626436 1.566929 54.41945 0.7152433
6 15.295503 2.276775 39.79195 0.8423647
简单绘制散点图 geom_point()
,amplitude
来设置形状大小,duration
来作为填充依据。
base_size = 12
ggplot(data=data_F,
aes(x=K,y=n,
size=amplitude,
fill=duration))+
geom_point(pch=21)
添加主题,并修改 x、y 轴刻度和标签。
注意:x 轴中转化成对数刻度 (
trans = 'log10'
)。
my_theme() +
scale_x_continuous(expand = c(0, 0),
trans = 'log10',
labels=c(1,10,100),
breaks=c(1,10,100),
limits = c(1,100)) +
scale_y_continuous(expand = c(0, 0),
breaks=c(seq(0,4,by=0.5)),
limits = c(0,4)) + +
xlab(expression(paste("dissociation constant",~~italic("K")," (M)"))) +
ylab("Hill coefficient n")
使用 annotation_logticks()
添加对数刻度。scale_size(range = c(1, 3))
修改散点的大小范围。这里还使用了 viridis 包中的配色样式 scale_fill_viridis(option="D")
。最后修改图例位置 theme(legend.position = c(0.9,0.35))
。
annotation_logticks(sides='b') + #添加对数刻度
scale_size(range = c(1, 3)) + #散点的大小范围
scale_fill_viridis(option="D") + #配色样式
theme(legend.position = c(0.9,0.35)) #修改图例位置
但是,最下面有一个点并没有显示清楚,这里作者运用了一个小技巧(上一篇也用到了),将这些点清晰的呈现出来。来看看这个代码的效果:
coord_cartesian(clip = "off")
# Panel F ----
library(ggplot2)
library(vi)
base_size = 12
my_theme <- function() {
theme(
aspect.ratio = 1,
axis.line =element_line(colour = "black"),
# shift axis text closer to axis bc ticks are facing inwards
axis.text.x = element_text(size = base_size*0.8, color = "black",
lineheight = 0.9,
margin=unit(c(0.3,0.3,0.3,0.3), "cm")),
axis.text.y = element_text(size = base_size*0.8, color = "black",
lineheight = 0.9,
margin=unit(c(0.3,0.3,0.3,0.3), "cm")),
axis.ticks = element_line(color = "black", size = 0.2),
axis.title.x = element_text(size = base_size,
color = "black",
margin = margin(t = -5)),
# t (top), r (right), b (bottom), l (left)
axis.title.y = element_text(size = base_size,
color = "black", angle = 90,
margin = margin(r = -5)),
axis.ticks.length = unit(-0.3, "lines"),
legend.background = element_rect(color = NA,
fill = NA),
legend.key = element_rect(color = "black",
fill = "white"),
legend.key.size = unit(0.5, "lines"),
legend.key.height =NULL,
legend.key.width = NULL,
legend.text = element_text(size = 0.6*base_size,
color = "black"),
legend.title = element_text(size = 0.6*base_size,
face = "bold",
hjust = 0,
color = "black"),
legend.text.align = NULL,
legend.title.align = NULL,
legend.direction = "vertical",
legend.box = NULL,
panel.background = element_rect(fill = "white",
color = NA),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
plot.title = element_text(size = base_size,
color = "black"),
)
}
data_F = read.csv("./data_F.csv")
head(data_F)
panel_F <- ggplot(data=data_F,
aes(x=K,y=n,
size=amplitude,
fill=duration))+
geom_point(pch=21) +
my_theme() +
scale_x_continuous(expand = c(0, 0),
trans = 'log10',
labels=c(1,10,100),
breaks=c(1,10,100),
limits = c(1,100)) +
scale_y_continuous(expand = c(0, 0),
breaks=c(seq(0,4,by=0.5)),
limits = c(0,4)) +
xlab(expression(paste("dissociation constant",~~italic("K")," (M)"))) +
ylab("Hill coefficient n") +
annotation_logticks(sides='b') +
scale_size(range = c(1, 3)) +
scale_fill_viridis(option="D") + # a color palette from the viridis package
theme(legend.position = c(0.9,0.35)) +
coord_cartesian(clip = "off")
panel_F
本文主要学到的知识点如下:
annotation_logticks()
添加对数刻度。scale_size()
修改散点的大小范围;scale_fill_viridis()
;theme(legend.position = )
修改图例位置。看完这篇文章,相信你的技能包又多了点东西。记得实操噢!看了不代表就会了~ 如果觉得内容有用的话,小编写的有心的话。给小编来杯咖啡吧!