R统计绘图-NMDS、环境因子拟合(线性和非线性)、多元统计(adonis2和ANOSIM)及绘图(双因素自定义图例)

news/2024/5/20 22:20:53/文章来源:https://blog.csdn.net/qq_39859424/article/details/129188872

这个推文也在电脑里待了快一年了,拖延症患者,今天终于把它发出来了。NMDS分析过程已经R统计-PCA/PCoA/db-RDA/NMDS/CA/CCA/DCA等排序分析教程中写过了。最近又重新看了《Numerical Ecology with R》一书,巩固一下知识,正好重新整理了一下发出来。

目录:

一、数据准备

二、NMDS分析

2.1 vegan::metaMDS()

2.2 NMDS分析-labdsv::bestnmds()

三、绘制NMDS散点图

四、多元统计分析

五、拟合环境变量

5.1 线性拟合-envfit()

5.2 曲面拟合-ordisurf()或surf()

六、参考资料

一、数据准备

此数据为虚构,可用于练习,请不要作他用。

# 1.1 设置工作路径
#knitr::opts_knit$set(root.dir="D:\\EnvStat\\PCA")# 使用Rmarkdown进行程序运行
Sys.setlocale('LC_ALL','C') # Rmarkdown全局设置
#options(stringsAsFactors=F)# R中环境变量设置,防止字符型变量转换为因子
setwd("D:\\EnvStat\\PCA")library(vegan)
library(ggplot2)# 物种组成数据
## 原始计数
otu <- read.csv("otu.csv",header = TRUE ,row.names=1,sep = ",",stringsAsFactors = TRUE)
tail(otu)
dim(otu)## 相对丰度
spe <- data.frame(otu[1:3],sweep(otu[-c(1:3)],1,rowSums(otu[-c(1:3)]),"/"))
tail(spe)# 环境因子数据
env <- read.csv("env.csv",header = TRUE ,row.names=1,sep = ",",stringsAsFactors = TRUE)
tail(env)
dim(env)

图1|otu及分组信息表,otu.csv。行为样品名称,列为otuID和分组信息。

图2|环境因子及分组信息表,env.csv。行为样品名称,列为环境因子和分组信息。

二、 NMDS分析

在PCA、PCoA、CA和NMDS非约束排序方法中,只有NMDS不是基于特征向量的排序方法,不会最大化排序轴所代表的变量方差(可旋转轴,达到PCA的效果,PC1代表最大方差)。NMDS使用相异矩阵,沿预定数量的轴表示观测数据,同时保留观测间的排序关系。vegan::decostand()提供了一系列群落生态学的数据标准化方法。选择"standardize",可使变量的均值为0.方差为1。如果数据中存在较多的0,一般用hellinger。这里选择"total"计算otu相对丰度值,用于进行NMDS分析。有推文[NMDS分析](NMDS分析 - 知乎)提到“NMDS分析对0值不太敏感,即使有较多的0,也可以得到较为稳健的结果”。如果拿不准要选择那种转换方法和距离指数,就在满足分析假设的前提下,把所有分析都做一遍,选择分析效果更好的方法就行,不要让自己陷入纠结,浪费时间。

2.1 vegan::metaMDS()

# 2.1.1 NMDS分析
#??decostand # 查看数据标准化方法介绍。
#??vegdist # 查看可选的距离指数。
set.seed(12345)
pre1 <- cmdscale(vegdist(spe[-c(1:3)]), k = 2) # 也可使用metaMDS()的运行结果作为起始。
pre1 # 作为NMDS随机起始set.seed(12345)
NMDS1 <- metaMDS(decostand(otu[-c(1:3)],method = "total"),# 等于spe[-c(1:3)]# 调用vegdist()计算dissimilarity indices。designdist()还可以指定以相异指数。distance = "bray", engine = "monoMDS",# vegan还可以调用MASS的"isoMDS"进行NMDS分析。trymax = 200,# 设置最大迭代次数,默认20。当出现2个收敛的解或达到最大迭代次数,NMDS分析停止。wascores = TRUE, #wascores()计算变量得分,但数据中存在负值,则无法计算变量得分。k=2, # 样本数需要大于2*k+1。previous.best = pre1) 
NMDS1# 2.1.2 输出结构介绍
#str(NMDS1)
NMDS1$iters # 迭代不到200,结果就收敛了,所以设置的trymax是足够的。
NMDS1$stress # 胁迫系数。
head(NMDS1$points)# 样本得分
head(NMDS1$species) # 若数据中存在负值,则无法计算出物种得分,所以最好选择数据转换后在[0,1]范围内的标准化方法。
## 若标准化后环境因子数据中存在负值,无法计算变量得分。
## 使用sppscores()可使用data原始数据计算变量得分,
## 也可使用不产生负值的标准化方法,如,Max等。
#sppscores(NMDS1) <- spe[-c(1:3)]
#NMDS1$species

# 2.1.3 Shepard diagram:goodness-of-fit,样本/观测点原始距离与NMDS排序结果比较。
pdf("stressplot.pdf",height = 6,width = 12)
gof <- goodness(NMDS1) # 值越大,观测在排序空间的位置与原始位置差距越大
par(mfrow=c(1,2))
stressplot(NMDS1,pch=16,p.col="black",l.col="red",main="Shepard plot") #  R2 = 1-S*S
plot(NMDS1, display="site",type="t",main = "Goodness of fit")
points(NMDS1, display="site",col="red",cex=gof*100) # 气泡越大,观测在排序空间的位置与原始位置差距越大。
dev.off()

图3|Shepard diagram。样本/观测点原始距离与NMDS排序结果比较。胁迫系数表示原始差异的经NMDS排序后产生的变化,变化越小,表示NMDS排序效果越好,越能准确反应样本的原始空间位置或梯度。Non-metric fit R^2=1-stress^2。拟合优度图(右侧)中气泡越大,观测在排序空间的位置与原始位置差距越大。

# 2.1.4  数据提取
## 提取样本坐标数据
points1=NMDS1$points
head(points1)## 提取物种坐标数据
Species1=NMDS1$species
head(Species1)## 提取胁迫系数:表示原始差异的变异
stress1=round(NMDS1$stress,4) # 保留4位小数点
stress1 # 0.1517

图4|样本得分,points1。

图5|物种得分,species1。

2.2 NMDS分析-labdsv::bestnmds()

bestnmds是使用isoMDS()进行NMDS分析,自动使用cmdscale()进行PCoA分析,作为初始随机起始值。

# 2.2.1 NMDS分析
library(labdsv)
dist <- vegdist(spe[-c(1:3)],method = "bray")
set.seed(12345)
NMDS2 <- labdsv::bestnmds(dist,k=2,itr=50,# 使用PCoA的结果作为初始随机起始值。maxit=200,trace=FALSE)
NMDS2

isoMDS()的胁迫系数以百分比形式显示,monoMDS则以分数形式展示。

# 2.2.2  提取分析结果
## 样本坐标
points2 <- matrix(NMDS2$points, nrow = 36, ncol = 2,dimnames = list(rownames(spe),c("MDS1","MDS2")))
head(points2)## 物种得分果-不自动计算物种得分
vare.points <- postMDS(points2, dist) #看函数是对数据进行了PCA旋转,具体的可以自己看函数代码,postMDS.R。
head(vare.points)
species2 <- wascores(vare.points, spe[-c(1:3)], expand=FALSE)
head(species2)###  可以直接使用NMDS2结果计算
species2.2 <- wascores(points2, spe[-c(1:3)], expand=FALSE) 
head(species2.2)
#eigengrad(vare.points, spe[-c(1:3)])## 绘图-两者数值范围不同,但相对位置差不多,上下,左右颠倒了位置。
pdf("bestnmds.species.pdf",height = 6,width = 12,family = "Times")
par(mfrow=c(1,2))
plot(species2)
text(species2,rownames(species2),cex=0.5)
plot(species2.2)
text(species2.2,rownames(species2.2),cex=0.5)
dev.off()## 提取胁迫系数:表示原始差异的变异
stress2=round(NMDS2$stress,2) # 保留2位小数点
stress2 # 15.21%,即0.1521

图6|bestnmds样本得分,points2

图7|bestnmds物种得分,species2

图8|不同方法计算物种得分的差异。两者数值范围不同,但相对位置差不多,上下或左右颠倒了位置。

三、 绘制NMDS散点图

图就是简单的散点图,会着重介绍一下,如何自定义图例。将两个分类因子的图例合并。

# 3.1 样本分组信息与样本坐标信息合并
mydata1=cbind(points1,spe[match(rownames(points1),rownames(spe)),1:3])
mydata1 mydata2=cbind(points2,spe[match(rownames(points2),rownames(spe)),1:3])
mydata2

# 3.2 自定义图例-用不同颜色展示grazing,depth用颜色深浅(alpha)表示。
library(ggsci)
library("scales")## 3.2.1 颜色选择
mypal = c(pal_d3(palette="category10",alpha = 0.2)(4),pal_d3(palette="category10",alpha = 0.6)(4),pal_d3(palette="category10",alpha = 1)(4))
show_col(mypal) # 查看颜色
mypal## 3.2.2 绘图
p1 <- ggplot(data=mydata1,aes(MDS1,MDS2))+geom_point(data=mydata1,aes(color=Condition),size=4.5,shape=16)+ # size可以修改点大小。scale_x_continuous(limits = c(-0.8,0.8),breaks = seq(-0.8,0.8,0.2))+scale_y_continuous(limits = c(-0.8,0.8),breaks = seq(-0.8,0.8,0.2))+ # scale*设置坐标区间。annotate("text",x=0.7,y=0.7,size=5.75,colour = "black",# x,y设置stress值的放置位置。label="paste('Stress=',0.15)",parse = TRUE)+scale_color_manual(values = mypal,breaks = c( # 自定义分类变量顺序,与颜色顺序对应。"CK-A","LG-A","MG-A","HG-A","CK-B","LG-B","MG-B","HG-B","CK-C","LG-C","MG-C","HG-C"),labels = c("CK","LG","MG","HG",rep("",8)),guide = guide_legend(title=paste("0-10 cm","10-20 cm","20-30 cm",sep = "\n\n\n"),direction = "horizontal",title.position = "left",title.hjust = 0,  # 标题水平偏移title.vjust = 0, # 标题垂直偏移label.position  = "top", # 设置标签放置位置#label.hjust =0,  # 设置图例标签左对齐keyheight = 1, # 图例高度keywidth  = 2, # 图例宽度ncol=4,byrow = TRUE))+theme_bw()+labs(x="NMDS1",y="NMDS2")+theme(# 调整图细节:轴标题,刻度字体大小等。panel.background = element_blank(),panel.grid = element_blank(),axis.title = element_text(size=18,color = "black"),axis.text = element_text(size=16,color = "black"),legend.text = element_text(size=16,color="black"),legend.title = element_text(size=16,colour = "black"),legend.position= "right") 
p1 ## 3.2.3 输出pdf格式图片到本地
pdf("p1.pdf",height  = 6,width = 10,family = "Times")
print(p1)#输出图的depth需自己对齐一下。
dev.off()

图9|设置的渐变颜色,mypal

图10|NMDS样本散点图,p1.pdf

颜色超过三种,用渐变色区分分类因子,就不太直观了。所以下面使用不同颜色区分grazing,不同形状区分depth。

# 3.3 自定义图例-颜色区分grazing,形状区分depth。
## 3.3.1 颜色
library(ggthemes) # 更多主题
cols <- mypal[9:12]
show_col(cols)## 3.3.2 绘图
p2 <- ggplot(data=mydata1,aes(MDS1,MDS2))+geom_point(data=mydata1,aes(color=Condition,shape=depth),size=4.5,alpha=0.7)+#stat_ellipse(aes(group=grazing,color=grazing),level = 0.95,linetype=2)+ # 此句可添加置信圈,此函数不能为只有三个点的组添加置信圈。只有三个点的可使用ggforce包添加置信圈。scale_color_manual(values = rep(cols,times=4),breaks = c( # 自定义分类变量顺序,与颜色顺序对应。"CK-A","LG-A","MG-A","HG-A","CK-B","LG-B","MG-B","HG-B","CK-C","LG-C","MG-C","HG-C"),labels = c("CK","LG","MG","HG",rep("",8)))+ scale_shape_manual(values = c(16,17,15),guide="none")+ # ?points查看数字对应点形状theme_base()+labs(x="NMDS1","NMDS2")+annotate("text",x=0.7,y=0.7,size=7,colour = "black",# x,y设置stress值的放置位置。label="paste('Stress=',0.15)",parse = TRUE)+guides(color =guide_legend(override.aes = list(shape =rep(c(16,17,15),each=4)),title=paste("0-10 cm","10-20 cm","20-30 cm",sep = "\n\n\n"),title.hjust = 1.5,title.vjust = 1,label.position  = "left",label.hjust =0,keyheight = 2,keywidth  = 1.8,ncol=3,byrow = FALSE))+ # 设置图例,参数意义可查看函数帮助信息。theme(axis.title = element_text(size=16,color = "black"),axis.text = element_text(size=14,color = "black"),legend.text = element_text(size=14,color="black"),legend.title = element_text(size=14,colour = "black",angle = 90),)  
p2## 3.3.3 输出图到本地
pdf("p2.pdf",height  = 6,width = 10,family = "Times")
print(p2)#输出图的depth需自己对齐一下。
dev.off()

图11|NMDS样本散点图,p2.pdf。

四、多元统计分析

帮助文档中提示分析组间多元变量的差异,ANOSIM与NMDS一般搭配使用。但此数据有两个分类变量(存在嵌套),选择adonis可以分析两个分类的交互效应。

# 4.1 Permutational Multivariate Analysis of Variance Using Distance Matrices
set.seed(12345)
t1 <- adonis2(spe[-c(1:3)] ~ grazing*depth, data = spe,permutations = 999, method = "bray",by = "terms") # 输出所有terms的检验结果,会受因子顺序影响。##注意区分grazing+depth,grazing*depth和grazing:depth。
t2 <- adonis2(spe[-c(1:3)] ~ grazing+depth, data = spe,permutations = 999, method = "bray",by = "margin") # 输出边际效应
t3 <- adonis2(spe[-c(1:3)] ~ grazing*depth, data = spe,permutations = 999, method = "bray",by = NULL) # 整个模型的检验结果
t1
t2
t3

图12|adonis2多元统计结果,t1。

图13|adonis2多元统计结果,t2。

图14|adonis2多元统计结果,t3。

# 4.2 限制分层置换
set.seed(12345)
t4 <- adonis2(spe[-c(1:3)] ~ grazing, data = spe, permutations =999, strata = spe$depth) # 限制depth置换,检验grazing效应t5 <- adonis2(spe[-c(1:3)] ~ depth, data = spe, permutations = 999, strata = spe$grazing) # 限制grazing置换,检验depth效应
t4
t5

图15|adonis2多元统计结果,t4。

图16|adonis2多元统计结果,t5。

# 4.3 ANOSIM群落结构差异分析-bray index
set.seed(12345)
grazing.anosim <- anosim(spe[-c(1:3)],spe$grazing,permutations = 999,distance = "bray")depth.anosim <- anosim(spe[-c(1:3)],spe$depth,permutations = 999,distance = "bray")
grazing.anosim
depth.anosim

图17|ANOSIM多元统计结果,grazing.anosim。

图18|ANOSIM多元统计结果,depth.anosim。

更多结果解读及绘图,参考R统计-微生物群落结构差异分析及结果解读。

五、拟合环境变量

5.1 线性拟合-envfit()

线性拟合只能拟合物种与环境因子的线性关系。

# 5.1.1 相关性系数
env.cor <- cor(env[-c(1:3)])
env.cor # 选择相关性较低和感兴趣的2个变量作为示例。

图19|环境因子相关系数,env.cor。

# 5.1.2 envfit()线性拟合环境因子
##选择相关性较低和感兴趣的2个变量作为示例。
set.seed(12345)
NMDS1.env <- envfit(NMDS1 ~ TN+TK, env)
NMDS1.env
name <- names(which(apply(spe[-c(1:3)],2,mean) > 0.01)) # otu太多,只展示平均相对丰度大于0.01的otu。

图20|NMDS1环境因子拟合结果,NMDS1.env。

# 5.1.3 绘图
pdf("envfit.pdf",width = 6,height = 8,family = "Times")
plot(NMDS1,display = "sites", xlim = c(-0.8,1), ylim=c(-1,0.8),main = "NMDS species relative abundance",
sub = "Fitted linear: TN + TK")
abline(h=0,lty=2);abline(v=0,lty=2)
text(NMDS1$points,rownames(spe),cex=(1-goodness(NMDS1)),col = "black") #添加样本标签,字体越大,排序结果代表性越好。
text(NMDS1$species[name,],name,cex=0.5,col="red")
plot(NMDS1.env,lwd=1) # 3 arrows
dev.off()

图21|NMDS1环境因子线性拟合图,envfit.pdf。

5.2 曲面拟合-ordisurf()或surf()

环境因子曲面拟合可以在非线性基础上,展示环境因子与排序结果的关联。ordisurf()和surf()使用的是广义相加模型(GAM)。

# 5.2.1 vegan::ordisurf()拟合环境因子到NMDS1排序图中
pdf("ordisurf.pdf",width = 6,height = 8,family = "Times")
set.seed(12345)
plot(NMDS1,display = "sites", type = "n",#xlim = c(-0.8,1), ylim=c(-1,0.8),main = "NMDS species relative abundance",
sub = "Fitted curve: TN(DarkKhaki) + TK(Tomato)")
abline(h=0,lty=2);abline(v=0,lty=2)
points(NMDS1,display = "sites",lwd = 1,col = rep(cols,each=3),# 按grazing设置点颜色。pch = rep(c(16,17,15),each=12))# 按depth设置点形状。
#text(NMDS1$points,rownames(spe),cex= 0.8,col = "black")# 不展示样本标签
text(NMDS1$species[name,],name,cex=0.5,col="black") 
plot(NMDS1.env,lwd=1,col = c("blue")) # 3 arrows
ordisurf(NMDS1~TN, env,add=TRUE,col="#BDB76B",family = "gaussian") # 更多参数设置?ordisurf查看
ordisurf(NMDS1~TK, env,add=TRUE,col="#FF6347", family = "gaussian")
legend(x = 0.1,y=-1,legend = unique(spe$Condition),col = cols,pch = rep(c(16,17,15),each=4),xjust = 0,yjust = 0,# 以左下为基准对齐ncol = 3)
dev.off()## vegan包中还有很多强大的函数,可以看帮助文件进行学习。
tabasco(spe[-c(1:3)],NMDS1) # 将物种按照NMDS结果进行排序并绘制热图。

图22|NMDS1环境因子曲面(GAM)拟合图,ordisurf.pdf。由图可以看出TK与NMDS排序关系是非线性的,而TN是线性的(曲面由平行直线组成)。曲面上标记的是环境因子的数值。

## 5.2.2 labdsv::surf()拟合环境因子到NMDS2排序图中
pdf("surf.pdf",width = 6,height = 8,family = "Times")
set.seed(12345)
plot(NMDS2,col="white")
points(NMDS2$points,lwd = 1,col = rep(cols,each=3),# 按grazing设置点颜色。pch = rep(c(16,17,15),each=12))# 按depth设置点形状。
#text(NMDS2$points,rownames(spe))
text(species2[name,],name,cex=0.5,col="black") 
surf(NMDS2,env$TN,col="#BDB76B",thinplate=FALSE)
surf(NMDS2,env$TK,col="#FF6347",thinplate=FALSE)
legend(x = -15,y=-20,legend = unique(spe$Condition),col = cols,pch = rep(c(16,17,15),each=4),xjust = 0,yjust = 0,# 以左下为基准对齐ncol = 3)
dev.off()

图23|NMDS2环境因子曲面(GAM)拟合图,surf.pdf。番茄色为TK,深卡其布色为TN。此拟合结果显示TK和TN与NMDS2都非线性关系。

两个函数计算出的样本得分、物种得分和环境因子拟合结果差异有一些大。NMDS由于是随机启动的,容易产生次优解。所以NMDS最好进行多次运行。因为涉及随机过程,为保证结果的可重复性,最好运行时设置随机种子。个人觉得还是基于特征分解的PCoA的分析结果更稳定,不受随机的影响,且结果更易解释,《Numerical Ecology with R》中也更推荐PCoA。书中提到PCoA等的排序结果,可以作为NMDS的输入,用于将超过2-3D的数据空间,在2-3D的维度展示出来。

数据表和代码可从QQ交流群文件夹中下载,或EcoEvoPhylo公众号后台发送“NMDS详解1”获取。

原文链接:R统计绘图-NMDS、环境因子拟合(线性和非线性)、多元统计(adonis2和ANOSIM)及绘图(双因素自定义图例) (qq.com)

参考资料

手动添加图例:请问ggplot2如何给自己的图增加图例? - 知乎图例设置:https://blog.csdn.net/tanzuozhev/article/details/51108040[NMDS分析](NMDS分析 - 知乎)[生信学习-高通量分析-NMDS分析: 非度量多维尺度分析](https://blog.csdn.net/weixin_53819139/article/details/114133818)R统计-微生物群落结构差异分析及结果解读

R统计-PCA/PCoA/db-RDA/NMDS/CA/CCA/DCA等排序分析教程Borcard, Daniel, François Gillet and Pierre Legendre. Numerical Ecology with R. Use R! Cham: Springer International Publishing, 2018. https://doi.org/10.1007/978-3-319-71404-2.

推荐阅读

R绘图-物种、环境因子相关性网络图(简单图、提取子图、修改图布局参数、物种-环境因子分别成环径向网络图)

R统计绘图-分子生态相关性网络分析(拓扑属性计算,ggraph绘图)
R统计绘图-变量分组相关性网络图(igraph)

机器学习-分类随机森林分析(randomForest模型构建、参数调优、特征变量筛选、模型评估和基础理论等)

R统计绘图-随机森林分类分析及物种丰度差异检验组合图

机器学习-多元分类/回归决策树模型(tree包)

R统计绘图-环境因子相关性+mantel检验组合图(linkET包介绍1)

R统计绘图-NMDS、环境因子拟合(线性和非线性)、多元统计(adonis2和ANOSIM)及绘图(双因素自定义图例)

R统计绘图-RDA分析、Mantel检验及绘图

R绘图-RDA排序分析R统计绘图-VPA(方差分解分析)

R统计绘图-PCA详解1(princomp/principal/rcomp/rda等)

R统计-PCA/PCoA/db-RDA/NMDS/CA/CCA/DCA等排序分析教程

R统计绘图-PCA分析绘图及结果解读(误差线,多边形,双Y轴图、球形检验、KMO和变量筛选等)

R统计-微生物群落结构差异分析及结果解读

R统计绘图-PCA分析及绘制双坐标轴双序图

R中进行单因素方差分析并绘图

R统计-多变量单因素参数、非参数检验及多重比较

R绘图-相关性分析及绘图

R绘图-相关性系数图

R统计绘图-环境因子相关性热图

R统计绘图-corrplot绘制热图及颜色、字体等细节修改

R统计绘图-corrplot热图绘制细节调整2(更改变量可视化顺序、非相关性热图绘制、添加矩形框等)

R数据可视化之美-节点链接图

R统计绘图-rgbif包下载GBIF数据及绘制分布图

R统计绘图 | 物种组成堆叠柱形图(绝对/相对丰度)

R统计绘图 | 物种组成冲积图(绝对/相对丰度,ggalluvial)

R统计绘图 | 物种组成堆叠面积图(绝对/相对丰度,ggalluvial)

R统计-单因素ANOVA/Kruskal-Wallis置换检验

R统计-正态性分布检验[Translation]

R统计-数据正态分布转换[Translation]

R统计-方差齐性检验[Translation]

R统计-Mauchly球形检验[Translation]

R统计绘图-单、双、三因素重复测量方差分析[Translation]

R统计绘图-混合方差分析[Translation]

R统计绘图-协方差分析[Translation]

R统计绘图-One-Way MANOVA

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_73390.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nacos源码启动

一、下载源码 为保证速度&#xff0c;国内推荐使用gitee&#xff1a;https://gitee.com/mirrors/Nacos.git 二、导入IDE中 参考之前文章配置国内Maven私服&#xff0c;快速更新工程。 三、启动过程&#xff0c;各种问题 找到启动入口&#xff1a; 先直接启动测试下&#xff…

oscp渗透测试认证该从哪里学起

当我决定要考OSCP时就马上打开浏览器&#xff0c;试图一下弄清楚课程内容和通过考试的方法&#xff0c;我不断的将指南和资源添加到书签中。渐渐的书签里存了许多资料&#xff0c;以至于我不知道从哪里开始学&#xff0c;学习命令吗&#xff1f;我学习编码吗&#xff1f;我使用…

北京/东莞/广州/深圳2023年上半年软考(中/高级)报名>>>

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成…

扩展学习之时间戳趣谈

目录 一、介绍 二、转换工具 三、获取Unix时间戳的指令 四、普通时间转Unix时间戳 五、扩展 一、介绍 时间戳&#xff1a;一份数据在特定时间点存在的可验证的数据。 Unix时间戳&#xff08;英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp&#xff09;&…

valgrind 移植到arm64 平台上总结

valgrind 介绍valgrind是查找内存泄漏的神器&#xff0c;你可以自动的检测许多内存管理和线程的bug&#xff0c;避免花费太多的时间在bug寻找上&#xff0c;使得你的程序更加稳固。 下载地址&#xff1a;https://valgrind.org/downloads/ 本人下载的是valgrind-3.19.0valgrind编…

.Net与程序集

一个简单的C#程序回想一下我们第一个.net 程序 hello world&#xff0c;它具有那些步骤呢&#xff1f;打开visual studio创建一个C# console的项目build运行程序这时候就有一个命令行窗口弹出来&#xff0c;上面打印着hello world。我们打开文件夹的bin目录&#xff0c;会发现里…

百度前端一面高频react面试题指南

React 高阶组件、Render props、hooks 有什么区别&#xff0c;为什么要不断迭代 这三者是目前react解决代码复用的主要方式&#xff1a; 高阶组件&#xff08;HOC&#xff09;是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分&#xff0c;它是一…

(考研湖科大教书匠计算机网络)第六章应用层-第七节:万维网WWW

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;万维网概述二&#xff1a;万维网应用&#xff08;1&#xff09;URI和URLA&#xff1a;URI和URL关系B&#xff1a;URL格式&#xff08;2&#xff09…

selenium自动化测试用例需要关注的几点

自动化测试设计简介注&#xff1a;参看文章地址 我们在本章提供的信息&#xff0c;对自动化测试领域的新人和经验丰富的老手都是有用的。本篇中描述最常见的自动化测试类型&#xff0c; 还描述了可以增强您的自动化测试套件可维护性和扩展性的“设计模式”。还没有使用这些技术…

数学小课堂:数学的用途(黄金分割)

文章目录 引言I 黄金分割1.1 几何图形的相似性1.2 自然界的物理学特征(螺旋线)1.3 利用数学指导音乐II 使用几何学技术将绘画变得逼真2.1 单点透视法2.2 视觉的数学原理(透视的视觉效果)引言 黄金分割比例大约是1:0.618,也就是1.618。符合黄金比例的雕塑或建筑就看上去很顺…

软件项目管理知识回顾---软件项目风险管理

软件项目风险管理 7.风险管理 7.1风险管理 1.风险管理&#xff1a;贯穿在项目开发中的一系列的管理过程。 2.风险管理过程&#xff1a;风险识别&#xff0c;风险计划&#xff0c;风险解决和风险监控 3.PMP风险管理过程 风险管理计划风险识别风险定量分析风险定性分析风险监控7.…

上海亚商投顾:沪指窄幅震荡 ChatGPT概念股全线下挫

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数早盘小幅冲高&#xff0c;随后又震荡走低&#xff0c;午后一度集体翻绿&#xff0c;临近尾盘有所回升。Chat…

力扣79.单词搜索

文章目录力扣79.单词搜索题目描述方法一&#xff1a;回溯深搜力扣79.单词搜索 题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#x…

Dokcer 数据卷

基本的概念数据卷就是宿主机上的一个文件或目录当容器目录和数据卷&#xff08;宿主机&#xff09;目录绑定&#xff0c;双方修改会立即同步操作一个数据卷可以被多个容器同时挂载数据卷作用&#xff1a;容器数据的持久化 外部机器和容器间接通信 容器之间数据交换使用 -v命令。…

Leetcode14. 最长公共前缀

一、题目描述&#xff1a; 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1&#xff1a; 输入&#xff1a;strs [“flower”,“flow”,“flight”] 输出&#xff1a;“fl” 示例 2&#xff1a; 输入&#xff1a;…

OpenFeign核心源码简读

目录 1、FeignClient注册逻辑 1.1、入口EnableFeignClients 1.2、FeignClientsRegistrar 1.2.1、registerBeanDefinitions 1.2.2、registerFeignClients 1.2.3、registerFeignClient 1.3、FeignClientFactoryBean 1.3.1、getObject -> getTarget 1.3.2、loadBalanc…

Linux学习(3)基本操作与在线帮助文档

目录 文本模式下命令的下达 基础命令的操作 重要的几个热键[Tab], [ctrl]-c, [ctrl]-d [Tab]按键 [Ctrl]-c 按键 [Ctrl]-d 按键 错误信息的察看 Linux系统的在线求助man page与info page man page 搜寻特定命令/文件的man page说明文件 info page 以下内容转载自…

[Flink]部署模式(看pdf上的放上面)

运行一个wordcountval dataStream: DataStream[String] environment.socketTextStream("hadoop1", 7777) //流式数据不能进行groupBy,流式数据要来一条处理一次.0表示第一个元素,1表示第二个元素 //keyBy(0)根据第一个元素进行分组 val out: DataStream[(String, In…

五月天演唱会门票开售,retry了一小时也没re进去!到底是什么高科技在作祟?!

等待了三年&#xff0c;大型线下演唱会终于回归了&#xff01;前段时间&#xff0c;文化和旅游部市场管理司发布通知称&#xff0c;自2023年2月16日起&#xff0c;各地文化和旅游行政部门恢复对涉港澳台营业性演出的受理和审批。据中国演出行业协会在业内调研了解&#xff0c;周…

Java常用框架(三)

三、SpringBoot 1.Spring及其优缺点&#xff1f; 1.1 概念 重量级企业开发框架EJB的替代品&#xff0c;通过依赖注入、面向切面编程&#xff0c;使用简单Java对象POJO为企业Java开发提供了相对简单的方法。 1.2 优缺点 1.2.1 优点 组件代码轻量级 1.2.1 缺点 配置重量级…