今天用最近看的一篇Nature Communications的数据试试ggplot2绘图,时间和能力有限,学了一半哈哈。
ggplot2包是R的一个作图用的最精彩的扩展包,它实现了“图形的语法”,将一个作图任务分解为若干个子任务,只要完成各个子任务就可以完成作图。在作常用的图形时,只需要两个步骤:首先将图形所展现的数据输入到ggplot()函数中,然后调用某个geom_xxx()函数,指定图形类型,如散点图、曲线图、盒形图等。
本文数据集有Nutnet不同站点不同年份的一些数据(选取一小小小小部分),包括站点site_code、处理时间year-trt、空间异步性、γ稳定性。
读取数据
getwd()
setwd("C:/Users/14327/Desktop/公众号")
data <- read.csv('data2.csv')
attach(data)
作散点图
首先调用绘图基本函数ggplot()函数,指定数据集,将spatial asynchrony映射到x轴,将gamma stability映射到y轴.
ggplot(data, aes(log_spatial_asynch_prod, log_gamma_stab_prod))+
geom_point()
继续叠加拟合曲线图
拟合曲线方法GAM(广义相加模型)
ggplot(data, aes(log_spatial_asynch_prod, log_gamma_stab_prod))+
geom_point()+geom_smooth(method='gam')
我们也可以试试用线性(lm)拟合,只需要把gam改为lm即可,结果如下:
在geom_point()和geom_smooth()加点简单元素
ggplot(data, aes(log_spatial_asynch_prod, log_gamma_stab_prod))+
geom_point(color="chartreuse4",alpha=0.5) +
geom_smooth(method='lm',color="cadetblue1", se =True, size =2, alpha =0.3,linetype=1)
脚本中size指定了线的以毫米为单位的粗细, se = T显示置信区间(False则不显示)。用alpha =设置了透明度,取0和1之间的值,数值越小越透明。在有许多个点时适当设置透明度可以比较好地显示出重叠的点,重叠点越多点的颜色越深。虽然这里设置了固定的透明度,也可以在aes()中将透明度alpha映射到某个变量,使得该变量值大小用点的透明度表示。
图形加上适当的标题
ggplot(data, aes(log_spatial_asynch_prod, log_gamma_stab_prod))+
geom_point(color="chartreuse4",alpha=0.5) +
geom_smooth(method='lm',color="cadetblue1", se =T, size =2, alpha =0.3,linetype=1)+
labs(
x ="空间异步性",
y ="gamma稳定性",
title ="异步性与稳定性",
subtitle ="数据点为每个样地每年",
caption ="数据来源: Nutnet" )
哈哈哈说实话挺丑的,以后再慢慢琢磨着改一下
颜色、符号、线型等映射
用不同颜色表示不同站点,就是将site_code变量映射到color:
ggplot(data, aes(log_spatial_asynch_prod, log_gamma_stab_prod,color=site_code))+
geom_point() +
geom_smooth(color="cadetblue1", se =FALSE, size =2, alpha =0.3,linetype=1)
脚本中仅指定了将站点映射到颜色维,并不具体指定所用的颜色。
接着作各个站点拟合的散点图:
ggplot(data, aes(log_spatial_asynch_prod, log_gamma_stab_prod,color=site_code,fill = site_code))
+geom_point() +geom_smooth(method="lm")
哎这里我参考的网站上用的是局部多项式曲线拟合的散点图(method=‘loess’),我试了一下画不出来,可能是因为我选取的数据太少少少少?明天再继续试试吧,我用method=‘lm’可以出来结果,如下
今天看到了一个up主用R画了一只玫瑰,想复现一下,结果到最后一步报错了,无奈明天解决吧,先上图嘻嘻。
参考资料:https://www.sohu.com/a/397306897_120233365,https://eric.netlify.app/2017/11/24/using-a-multivariate-normal-to-draw-a-flower-in-ggplot2/