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

news2024/9/26 1:28:19

这个推文也在电脑里待了快一年了,拖延症患者,今天终于把它发出来了。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.coloradmin.cn/o/367173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

火山引擎推出一站式小程序监控方案

背景 小程序作为轻量级的应用发展迅速&#xff0c;国内已有多家小程序厂商相继推出。为了洞察用户真实体验及程序自身运行状况&#xff0c;监控已成为开发套件中必不可少的一环。随着业务愈来愈复杂&#xff0c;各厂商小程序管理后台免费提供的监控能力逐渐满足不了大部分业务…

软考中级之数据库系统(重点)

涉及考点:数据库模式,ER模型,关系代数与元祖演算,规范化理论,并发控制,分布式数据库系统,数据仓库和数据挖掘 数据库模式 三级模式-二级映射 常考选择题 三级模式,两种映射的这种涉及属于层次架构体的设计,这种设计为我们在应用数据库的时候提供了很多便利,同时提高了整个体…

功能性材料深入超级赛道,赋能多行业迭代升级

中国国际胶粘剂及密封剂展览会深耕胶粘剂、密封剂和胶粘带行业26年&#xff0c;是行业认可的、优质的贸易与技术交流平台。展会连接了十几个行业的买家和卖家&#xff0c;包括汽车、电子、新能源、轨道交通、工业等重要领域&#xff0c;为客户提供封装、粘合、散热、装配制造等…

拿下宁王、迪王的湖南裕能,还能“狂飙”多远?

文|智能相对论作者|Kinki近日&#xff0c;磷酸铁锂正极材料龙头湖南裕能正式登陆A股&#xff0c;上市当天市值超过了400亿元&#xff0c;投资者中一签可赚1.49万元&#xff0c;可谓近年低迷的资本市场中一支“大肉签”。不过在 “开门红”之后&#xff0c;湖南裕能的股价便一路…

leetcode16. 最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4], target 1 输出&#xff1a;2 …

linux服务器上Docker中安装jenkins

前言 Jenkins是开源CI&CD软件领导者&#xff0c; 提供超过1000个插件来支持构建、部署、自动化&#xff0c; 满足任何项目的需要。 本文主要提供通过docker安装jenkins镜像&#xff0c;并配置nginx反向代理页面配置和使用。通过jenkins完成项目的自动部署。 我在安装之前…

ThinkPHP ^6图片操作进阶

图片裁剪、缩略、水印不再是TP框架系统内置的功能&#xff0c;需要安装。 目录 安装 图片处理 1.创建图片对象 2.获取图片属性 3.裁剪图像 4.生成缩略图 6.保存图像 7.水印 安装 使用composer在项目根目录打开命令行执行&#xff1a; composer require topthink/think…

Simulink 电机控制:单电阻三相电流重构算法仿真总结

目录 理论基础 仿真实现 硬件实现 总结 理论基础 参考Microchip AN1299 《PMSM 无传感器 FOC的单分流三相电流重构算法》&#xff0c;详细的理论可以参考这个文档&#xff0c;这里只简单总结一下。单电阻采样的核心就是要在一个周期内实现两相电流的采样并通过基尔霍夫定…

【UE4 制作自己的载具】3-载具蓝图实现(基本)

效果步骤新建一个蓝图&#xff0c;继承“WheeledVehicle&#xff08;轮式载具&#xff09;”命名为“Vehicle_BP”&#xff0c;双击打开该蓝图选中“Mesh&#xff08;继承&#xff09;”&#xff0c;然后在细节中&#xff0c;骨架网格体选择“Vehicle”添加一个弹簧臂和摄像机组…

Windows下mysql8.0.32安装配置方法图文教程

Windows下mysql8.0.31安装配置方法图文教程 1、下载可以到官网的地址下载即可 https://dev.mysql.com/downloads/file/?id516465 2、解压缩并重命名mysql-8.0.32-winx64为mysql 3、创建my.ini配置文件&#xff0c;创建data文件夹。 4、打开记事本另存为my.ini并且使用ANSI编…

23年了,GOPATH和go.mod 还在冲突!

现在 新配了 go环境 设置了GOROOT&#xff0c;GOPATH &#xff0c;发现引用别的包会出问题。一直会报 package XX not in GOROOT &#xff08;xxxx&#xff09;我的目录&#xff1a;我的开发目录&#xff1a; /home/fate/go_projects/老样子&#xff0c;下面有 /home/fate/go_…

元宇宙与ChatGPT结合 一场颠覆式场景革命或将到来?

元宇宙和ChatGPT都是当前数字化领域中非常热门的技术和应用&#xff0c;两者之间也存在一定的关系&#xff0c;结合起来&#xff0c;可以为企业提供更加智能化、个性化的服务和支持&#xff0c;同时也可以拓展企业的市场和品牌影响力&#xff0c;提高企业的效率和创新能力。 元…

公司新来一00后说我不会自动化测试,3个问题直接给他问趴下...

今天我们公司刚入职一小伙&#xff0c;听说是00后&#xff0c;今天在办公室交流了一下&#xff0c;他问我会不会自动化测试&#xff0c;我直呼好家伙&#xff0c;直接问了他3个开展自动化测试问题....一问3不知.....还有待加强呀我们在制定自动化测试实施策略时&#xff0c;首先…

java servlet详解

一、Servlet实现方式 1、实现Servlet接口&#xff0c;接口中的方法必须全部实现。此种方式支持最大程度的自定义。 2、继承GenericServlet&#xff0c;service方法必须重写&#xff0c;其他方可根据需求&#xff0c;选择性重写。 使用此种方式&#xff0c;表示只在接收和响应…

作为通信人,你知道国内有哪些通信领域的博物馆吗?

众所周知&#xff0c;博物馆是收藏、展示和研究历史文物的地方。参观博物馆&#xff0c;既可以回顾历史往事&#xff0c;也可以学习知识。 那么&#xff0c;作为通信人&#xff0c;你知道国内有哪些通信领域的博物馆吗&#xff1f; 今天&#xff0c;就让小编给大家介绍介绍。█…

微鳄365,可私有化部署的企业管理软件,让数据更安全让管理更方便

编者按&#xff1a;本文分析了企业数字化转型中常遇到的一些困难&#xff0c;并进一步指出微鳄365一体化解决方案&#xff0c;可以帮助企业克服这些困难。关键词&#xff1a;免安装&#xff0c;免维护&#xff0c;成本低&#xff0c;数据安全&#xff0c;共享协作&#xff0c;个…

利用STM32的LR寄存器调试HardFault错误

R14 or LR(Link Register) HardFault调试的思路 先在出错误的地方打断点&#xff0c;让程序的状态固定下来&#xff1b;由于HardFault属于异常&#xff0c;所以出现HardFault后&#xff0c;LR的值一定是0xFFFFFFFx&#xff0c;这样就可以根据其值&#xff0c;判断程序进入这个…

C++学习记录——십일 string类模拟实现

这篇对于string类的实现会一步步来&#xff0c;从错误到正确&#xff0c;尽量展现可能会忽略掉的细节. 文章目录1、初始化列表2、拷贝构造函数和赋值函数3、循环输出&#xff0c;迭代器4、插入删除等5、流插入流提取6、其它接口1、初始化列表 先写下来这些代码 String.h #pra…

KDJB-802微机继电保护测试仪

一、产品概述 KDJB-802微机继电保护测试仪是在参照电力部颁发的《微机型继电保护试验装置技术条件(讨论稿)》的基础上&#xff0c;广泛听取用户意见&#xff0c;总结目前国内同类产品优缺点&#xff0c;充分使用现代新的的微电子技术和器件实现的一种新型小型化微机继电保护测…