当前位置: 首页 > news >正文

R语言绘制精美图形 | 火山图 | 学习笔记

一边学习,一边总结,一边分享!

教程图形

前言

最近的事情较多,教程更新实在是跟不上,主要原因是自己没有太多时间来学习和整理相关的内容。一般在下半年基本都是非常忙,所有一个人的精力和时间有限,只能顾一方面。所以,长时间不更新是很正常的,若在看本教程的你,若有愿意分享的教程,可以投稿,我们也欢迎投稿。

今天,来分享一下近两天自己的学习笔记。火山图,此图也是实用性很强,80%的同学应该可以用得到,今天分享的只是学习笔记的一部分,后面会逐渐完善。既然是学习笔记,那么我们也有参考的教程,我们也会再文末附上参考的教程,大家也可以直接到对应教程中学习。

原文访问链接:
https://mp.weixin.qq.com/s/mQ9TaQu3b3waNHtu8gfQtw

设置路劲

setwd("E:\\小杜的生信筆記\\2023\\20231117-火山图")
rm(list = ls())

加载相关包

library(ggplot2)
library(RColorBrewer)
library(ggrepel)
library(RUnit)
library(ggforce)
library(tidyverse)
library(ggpubr)
library(ggprism)
library(paletteer)

1、加载及处理数据

加载数据

df <- read.csv("all.limmaOut.csv",header = T,row.names = 1)
head(df)

1.2 数据分类

使用runif对添加数据logCMP,用于后续的分析

df$logCMP <- stats::runif(12035, 0, 16)

对数据进行UpDown分类
分类标准:

  1. P值小于0.05
  2. |logFC| >= 1
    筛选标准可以进行自己的需求进行设置
##'@判断基因up or downdf$Group <- factor(ifelse(df$P.Value < 0.05 & abs(df$logFC) >= 1,ifelse(df$logFC >= 1, 'Up','Down'),'NotSignifi'))
df[1:10,1:8]table(df$Group)


添加基因名,用于后续的火山图显示基因名使用

df$gene <- row.names(df)

1.3 设置主题

可根据自己需求进行设置,或是统一在这里设置即可。

##'@主题
mytheme <- theme(panel.background = element_rect(fill = NA),plot.margin = margin(t=10,r=10,b=5,l=5,unit = "mm"),# axis.ticks.y = element_blank(),axis.ticks.x = element_line(colour = "grey40",size = 0.5),axis.line = element_line(colour = "grey40",size = 0.5),axis.text.x = element_text(size = 10),axis.title.x = element_text(size = 12),panel.grid.major.y = element_line(colour = NA,size = 0.5),panel.grid.major.x = element_blank())

2 绘制基础差异基因火山图

2.1 绘制基础图形

####'@绘制基础图形
ggplot(df, aes(x = logFC, y = -log10(P.Value), colour = Group))+geom_point(size =4, shape = 20, stroke = 0.5)+#控制最人气泡和最小气泡,调节气泡相对大小scale_size(limits = c(2,16))+##设置颜色#scale_fill_manual(values = c("#fe0000","#13fc00","#bdbdbd"))+scale_color_manual(values=c('steelblue','gray','brown'))+ylab('-log10 (Pvalue)')+xlab('log2 (FoldChange)')+## 增加横竖线条geom_vline(xintercept = c(-1,1),lty = 2, col = "black", lwd = 0.5)+geom_hline(yintercept = -log10(0.05), lty = 2, col = "black", lwd = 0.5)

难点代码解读

1.增加横竖线条

geom_vline()添加垂直辅助线,xintercept表示辅助线的位置,lty表示线的类型(虚-实),col表示线的颜色,lwd表示线的粗细

geom_hline()添加水平辅助线,yintercept表示辅助线的位置,lty表示线的类型(虚-实),col表示线的颜色,lwd表示线的粗细

2.2 设置火山图散点的大小

在上面的图形中,火山图中所有的使用size = logCMP进行修改

ggplot(df, aes(x = logFC, y = -log10(P.Value), size = logCMP,colour = Group))+geom_point(shape = 20, stroke = 0.5)+#控制最人气泡和最小气泡,调节气泡相对大小scale_size(limits = c(2,16))+##设置颜色#scale_fill_manual(values = c("#fe0000","#13fc00","#bdbdbd"))+scale_color_manual(values=c('steelblue','gray','brown'))+ylab('-log10 (Pvalue)')+xlab('log2 (FoldChange)')+## 增加横竖线条geom_vline(xintercept = c(-1,1),lty = 2, col = "black", lwd = 0.5)+geom_hline(yintercept = -log10(0.05), lty = 2, col = "black", lwd = 0.5)

2.2 调整火山图的X轴坐标

调整X轴的取值范围
有时候,我们在绘制火山图时,会出现X或Y轴坐标较大的现象,对火山图整体美观性较差,那么适当限制基因调整图形美观.

###'@查看差异基因最大值是多少
###'@此步根据自己的火山图进行设置是否有需要设置
max(abs(df$logFC)) 

使用xlim()函数进行修改

ggplot(df, aes(x = logFC, y = -log10(P.Value), size = logCMP,colour = Group))+geom_point(shape = 20, stroke = 0.5)+#控制最人气泡和最小气泡,调节气泡相对大小scale_size(limits = c(2,16))+##设置颜色#scale_fill_manual(values = c("#fe0000","#13fc00","#bdbdbd"))+scale_color_manual(values=c('steelblue','gray','brown'))+ylab('-log10 (Pvalue)')+xlab('log2 (FoldChange)')+## 增加横竖线条geom_vline(xintercept = c(-1,1),lty = 2, col = "black", lwd = 0.5)+geom_hline(yintercept = -log10(0.05), lty = 2, col = "black", lwd = 0.5)+##设置X轴的取值范围xlim(c(-1.5,1.5))

2.3 修改图中图例

使用ggplot()绘图最方便就是修改图形或调整图形很方便,但是很多时间都需要我们自己不断的练习,加深自己印象。
使用label()修改图中标题和图例

ggplot(df, aes(x = logFC, y = -log10(P.Value), size = logCMP,colour = Group))+geom_point( shape = 20, stroke = 0.5)+#控制最人气泡和最小气泡,调节气泡相对大小scale_size(limits = c(2,16))+##设置颜色#scale_fill_manual(values = c("#fe0000","#13fc00","#bdbdbd"))+scale_color_manual(values=c('steelblue','gray','brown'))+# ylab('-log10 (Pvalue)')+# xlab('log2 (FoldChange)')+labs(x = 'log2 (FoldChange)',y = '-log10 (Pvalue)',## 图例fill = "",size = "")+
# ## 增加横竖线条geom_vline(xintercept = c(-1,1),lty = 2, col = "black", lwd = 0.5)+geom_hline(yintercept = -log10(0.05), lty = 2, col = "black", lwd = 0.5)+## 设置主题theme_classic(base_line_size = 0.8  ## 设置坐标轴的粗细)+## 设置图例大小guides(fill = guide_legend(override.aes = list(size = 8)))

2.4 添加基因名

使用一下命令添加标记基因名字

#'@添加关注的点的基因名geom_text_repel(data = df[df$P.Value < 0.05 & abs(df$logFC) > 1,],aes(label = gene),size = 4.5,color = "black",segment.color = "black", show.legend = FALSE)
ggplot(df, aes(x = logFC, y = -log10(P.Value), size = logCMP,colour = Group))+geom_point( shape = 20, stroke = 0.5)+#控制最人气泡和最小气泡,调节气泡相对大小scale_size(limits = c(2,16))+##设置颜色#scale_fill_manual(values = c("#fe0000","#13fc00","#bdbdbd"))+scale_color_manual(values=c('steelblue','gray','brown'))+ylab('-log10 (Pvalue)')+xlab('log2 (FoldChange)')+
#'@添加关注的点的基因名geom_text_repel(data = df[df$P.Value < 0.05 & abs(df$logFC) > 1,],aes(label = gene),size = 4.5,color = "black",segment.color = "black", show.legend = FALSE)+# ## 增加横竖线条geom_vline(xintercept = c(-1,1),lty = 2, col = "black", lwd = 0.5)+geom_hline(yintercept = -log10(0.05), lty = 2, col = "black", lwd = 0.5)+## 设置主题theme_classic(base_line_size = 0.8  ## 设置坐标轴的粗细)+## 设置图例大小guides(fill = guide_legend(override.aes = list(size = 8)))

2.5 图形美化

ggplot(df, aes(x = logFC, y = -log10(P.Value), size = logCMP,colour = Group))+geom_point( shape = 20, stroke = 0.5)+#控制最人气泡和最小气泡,调节气泡相对大小scale_size(limits = c(2,16))+##设置颜色#scale_fill_manual(values = c("#fe0000","#13fc00","#bdbdbd"))+scale_color_manual(values=c('steelblue','gray','brown'))+ylab('-log10 (Pvalue)')+xlab('log2 (FoldChange)')+
#'@添加关注的点的基因名geom_text_repel(data = df[df$P.Value < 0.05 & abs(df$logFC) > 1,],aes(label = gene),size = 3.5,color = "black",segment.color = "black", show.legend = FALSE)+# ## 增加横竖线条geom_vline(xintercept = c(-1,1),lty = 2, col = "black", lwd = 0.5)+geom_hline(yintercept = -log10(0.05), lty = 2, col = "black", lwd = 0.5)+## 设置主题theme_classic(base_line_size = 0.8  ## 设置坐标轴的粗细)+## 设置图例大小guides(fill = guide_legend(override.aes = list(size = 5)))+mytheme##设置主题# theme(axis.title.x = element_text(color = "black", #                                   size = 10,#                                   face = "bold"),#       axis.title.y = element_text(color = "black",#                                   size = 10),#       ##'@设置图例#       legend.text = element_text(color = "red",#                                  size = 8,#                                  face = "bold"))

解读

  theme(axis.title.x = element_text(color = "black",size = 10,face = "bold"),axis.title.y = element_text(color = "black",size = 10),##'@设置图例legend.text = element_text(color = "red",size = 8,face = "bold"))
  1. X轴、Y轴字体调整axis.title.x/axis.title.y
    colorsizebold表示;颜色、大小、加粗
  2. 图例legend.text

3 渐变火山图绘制

该教程在前面的文章中已经发出,感兴趣的可以自己查看。教程链接差异表达基因火山图绘制

3.1 数据处理

head(df)

把各列数据整理成画图所需的格式

### Score列、或是DESep输出数据
fc <- df$AveExpr
head(fc)
names(fc) <- rownames(dat)  ## 匹配数据### -log10P列p <- dat$`-log10P`
names(p) <- names(dat)

3.2 自定义颜色

mycol <- c("#B2DF8A","#FB9A99","#33A02C","#E31A1C","#B15928","#6A3D9A","#CAB2D6","#A6CEE3","#1F78B4","#FDBF6F","#999999","#FF7F00")
cols.names <- unique(df$Group)
cols.code <- mycol[1:length(cols.names)]
names(cols.code) <- cols.names
col <- paste(cols.code[as.character(df$Group)],"BB", sep="")
i <-  df$Group %in% c("Up","Not","Down")###'@-log10P列
p <- -log10(df$P.Value)
names(p) <- names(df)###'@size列
size = df$logCMP
names(size) <- rownames(df)###'@pval列
pp <- df$P.Value
names(pp) <- rownames(df)

3.3 绘图

plot(df, p, log = 'y',col = paste(cols.code[as.character(df$logCMP)], "BB", sep = ""),pch = 16,# ylab = bquote(~Log[10]~"P value"), # xlab = "Enrich score",# 用小泡泡画不感兴趣的pathwaycex = ifelse(i, size,1))


# 添加横线
abline(h=1/0.05, lty=2, lwd=1)
abline(h=1/max(pp[which(p.adjust(pp, "bonf") < 0.001)]), lty=3, lwd=1) #标黑圈和文字的阈值# 添加竖线
abline(v=-0.5, col="blue", lty=2, lwd=1)
abline(v=0.5, col="red", lty=2, lwd=1


w <- which(p.adjust(pp,"bonf") < 0.001) #bonferroni correction
points(fc[w], p[w], pch=1, cex=ifelse(i[w], dat[w,"size"],1))
## Add an alpha value to a colour
add.alpha <- function(col, alpha=1){if(missing(col))stop("Please provide a vector of colours.")apply(sapply(col, col2rgb)/255, 2, function(x) rgb(x[1], x[2], x[3], alpha=alpha))  
}
## 标记最显著的基因
cols.alpha <- add.alpha(cols.code[dat[w,]$group], alpha=0.6)
text(fc[w], p[w], names(fc[w]), pos=4, #1, 2, 3 and 4, respectively indicate positions below, to the left of, above and to the right of the specified coordinates.col=cols.alpha)


# 添加size的图例
par(xpd = TRUE) #all plotting is clipped to the figure region
f <- c(0.01,0.05,0.1,0.25)
s <- sqrt(f*50)
legend("topright",inset=c(-0.2,0), #把图例画到图外legend=f, pch=16, pt.cex=s, bty='n', col=paste("#88888888"))# 添加pathway颜色的图例
legend("bottomright", inset=c(-0.25,0), #把图例画到图外pch=16, col=cols.code, legend=cols.names, bty="n")

4. 筛选Top5的差异基因进行标记

4.1 筛选的down和up前5个(或N个)基因进行标记

##down
down <- filter(df, Group == "Down") %>% distinct(gene, .keep_all = T) %>%top_n(5, -log10(P.Value))##up top 5
up <- filter(df, Group == "Up") %>% distinct(gene, .keep_all = T) %>%top_n(5, -log10(P.Value))

4.2绘图

ggplot(df, aes(x = logFC, y = -log10(P.Value), size = logCMP,colour = Group))+geom_point( shape = 20, stroke = 0.5)+#控制最人气泡和最小气泡,调节气泡相对大小scale_size(limits = c(2,16))+##设置颜色#scale_fill_manual(values = c("#fe0000","#13fc00","#bdbdbd"))+scale_color_manual(values=c('steelblue','gray','brown'))+#scale_colour_manual(name = "", values = alpha(c("#EB4232","#d8d8d8","#2DB2EB"), 0.7)) +##'@X轴和Y轴限制# scale_x_continuous(limits = c(-12, 12),breaks = seq(-12, 12, by = 4)) + # scale_y_continuous(expand = expansion(add = c(0, 0)),limits = c(0, 180),breaks = seq(0, 180, by = 20)) + ylab('-log10 (Pvalue)')+xlab('log2 (FoldChange)')+
#'@添加关注的点的基因名
#'@添加down top genegeom_text_repel(data = up,aes(x = logFC, y = -log10(P.Value), label = gene),seed = 123,color = 'black',show.legend = FALSE, min.segment.length = 0,#始终为标签添加指引线段;若不想添加线段,则改为Infsegment.linetype = 1, #线段类型,1为实线,2-6为不同类型虚线force = 2,#重叠标签间的排斥力force_pull = 2,#标签和数据点间的吸引力size = 4,box.padding = unit(2, "lines"),point.padding = unit(1, "lines"),#点到线的距离max.overlaps = Inf)+##'@添加up top genegeom_text_repel(data = down,aes(x = logFC, y = -log10(P.Value), label = gene),seed = 123,color = 'black',show.legend = FALSE, min.segment.length = 0,#始终为标签添加指引线段;若不想添加线段,则改为Infsegment.linetype = 1, #线段类型,1为实线,2-6为不同类型虚线force = 6,#重叠标签间的排斥力force_pull = 1,#标签和数据点间的吸引力size = 4,box.padding = unit(2, "lines"),point.padding = unit(1, "lines"),#点到线的距离max.overlaps = Inf)+# ## 增加横竖线条geom_vline(xintercept = c(-1,1),lty = 2, col = "black", lwd = 0.5)+geom_hline(yintercept = -log10(0.05), lty = 2, col = "black", lwd = 0.5)+## 设置主题theme_classic(base_line_size = 0.8  ## 设置坐标轴的粗细)+## 设置图例大小guides(fill = guide_legend(override.aes = list(size = 5)))+mytheme

4.3 对齐标签

需要重新进行调整坐标信息,此坐标位置,可以根据自己需求进行调整

nudge_x_up = 2.5 - up$logFC
nudge_x_down = -2.5 - down$logFC

通过添加nudge_x信息即可实现此功能

ggplot(df, aes(x = logFC, y = -log10(P.Value), size = logCMP,colour = Group))+geom_point( shape = 20, stroke = 0.5)+#控制最人气泡和最小气泡,调节气泡相对大小scale_size(limits = c(2,16))+##设置颜色#scale_fill_manual(values = c("#fe0000","#13fc00","#bdbdbd"))+scale_color_manual(values=c('steelblue','gray','brown'))+#scale_colour_manual(name = "", values = alpha(c("#EB4232","#d8d8d8","#2DB2EB"), 0.7)) +##'@X轴和Y轴限制# scale_x_continuous(limits = c(-12, 12),breaks = seq(-12, 12, by = 4)) + # scale_y_continuous(expand = expansion(add = c(0, 0)),limits = c(0, 180),breaks = seq(0, 180, by = 20)) + ylab('-log10 (Pvalue)')+xlab('log2 (FoldChange)')+
#'@添加关注的点的基因名
#'@添加down top genegeom_text_repel(data = up,aes(x = logFC, y = -log10(P.Value), label = gene),seed = 123,color = 'black',show.legend = FALSE, min.segment.length = 0,#始终为标签添加指引线段;若不想添加线段,则改为Infsegment.linetype = 1, #线段类型,1为实线,2-6为不同类型虚线segment.color = 'black', #线段颜色segment.alpha = 0.5, #线段不透明度nudge_x = nudge_x_up, #标签x轴起始位置调整direction = "y", #按y轴调整标签位置方向,若想水平对齐则为xhjust = 0, #对齐标签:0右对齐,1左对齐,0.5居中force = 2,#重叠标签间的排斥力force_pull = 2,#标签和数据点间的吸引力size = 4,box.padding = unit(0.1, "lines"),point.padding = unit(0.1, "lines"),max.overlaps = Inf)+##'@添加up top genegeom_text_repel(data = down,aes(x = logFC, y = -log10(P.Value), label = gene),seed = 123,color = 'black',show.legend = FALSE, min.segment.length = 0,#始终为标签添加指引线段;若不想添加线段,则改为Infsegment.linetype = 1, #线段类型,1为实线,2-6为不同类型虚线segment.color = 'black', #线段颜色segment.alpha = 0.5, #线段不透明度nudge_x = nudge_x_down, #标签x轴起始位置调整direction = "y", #按y轴调整标签位置方向,若想水平对齐则为xhjust = 1, #对齐标签:0右对齐,1左对齐,0.5居中force = 2,#重叠标签间的排斥力force_pull = 2,#标签和数据点间的吸引力size = 4,box.padding = unit(0.1, "lines"),point.padding = unit(0.1, "lines"),max.overlaps = Inf)+# ## 增加横竖线条geom_vline(xintercept = c(-1,1),lty = 2, col = "black", lwd = 0.5)+geom_hline(yintercept = -log10(0.05), lty = 2, col = "black", lwd = 0.5)+## 设置主题theme_classic(base_line_size = 0.8  ## 设置坐标轴的粗细)+## 设置图例大小guides(fill = guide_legend(override.aes = list(size = 5)))

4.4 添加箭头

top5 <- filter(df, Group != "Stable") %>% distinct(gene, .keep_all = T) %>% top_n(5, -log10(P.Value))
ggplot(df, aes(x = logFC, y = -log10(P.Value), size = logCMP,colour = Group))+geom_point( shape = 20, stroke = 0.5)+#控制最人气泡和最小气泡,调节气泡相对大小scale_size(limits = c(2,16))+##设置颜色#scale_fill_manual(values = c("#fe0000","#13fc00","#bdbdbd"))+scale_color_manual(values=c('steelblue','gray','brown'))+#scale_colour_manual(name = "", values = alpha(c("#EB4232","#d8d8d8","#2DB2EB"), 0.7)) +##'@X轴和Y轴限制# scale_x_continuous(limits = c(-12, 12),breaks = seq(-12, 12, by = 4)) + # scale_y_continuous(expand = expansion(add = c(0, 0)),limits = c(0, 180),breaks = seq(0, 180, by = 20)) + ylab('-log10 (Pvalue)')+xlab('log2 (FoldChange)')+##'@添加箭头geom_text_repel(data = top5,aes(x = logFC, y = -log10(P.Value), label = gene),seed = 2345,color = 'black',show.legend = FALSE, min.segment.length = 1,#始终为标签添加指引线段;若不想添加线段,则改为Infarrow = arrow(length = unit(0.02, "npc"),type = "open", ends = "last"),force = 10,force_pull = 1,size = 4,box.padding = 2,point.padding = 1,max.overlaps = Inf)

5 渐变火山图

5.1 加载所需的包

#devtools::install_github("BioSenior/ggvolcano")
library(ggVolcano)
library(RColorBrewer)

5.2 绘图

df[1:10,1:9]

gradual_volcano(df, x = "logFC", y = "P.Value",label = "gene", label_number = 5, ## 显示top5的基因名output = FALSE)


修改显示颜色

gradual_volcano(df, x = "logFC", y = "P.Value",label = "gene", fills = brewer.pal(5, "RdYlBu"),colors = brewer.pal(8, "RdYlBu"),label_number = 5, ## 显示top5的基因名output = FALSE)


使用RColorBrewer进行修改颜色

gradual_volcano(df, x = "logFC", y = "P.Value",label = "gene", label_number = 5, ## 显示top5的基因名output = FALSE)+ggsci::scale_color_gsea()+ggsci::scale_fill_gsea()

5.3 GO通路火山图

或你有相关GO注释文件,你可以提供给相关的数据,进行绘制。

在这里,我们不在演示,若你需要,可以根据原文的方法进行绘制图形。

ata("term_data")
#  Gene.names   term
#1       TDP1 myelin
#2    YDR387C myelin
#3      MAM33 myelin
#4       BAR1 myelin
#5       IQG1 myelin
#6       AIM3 myelinp1 <- term_volcano(deg_data, term_data,x = "log2FoldChange", y = "padj",label = "row", label_number = 10, output = FALSE)
#修改散点颜色和描边
library(RColorBrewer)
deg_point_fill <- brewer.pal(5, "RdYlBu")
names(deg_point_fill) <- unique(term_data$term)
p2 <- term_volcano(data, term_data,x = "log2FoldChange", y = "padj",normal_point_color = "#75aadb",deg_point_fill = deg_point_fill,deg_point_color = "grey",legend_background_fill = "#deeffc",label = "row", label_number = 10, output = FALSE)

本教程参考链接:<学习者可以直接访问原文链接>

  1. https://mp.weixin.qq.com/s/wkUxY_zzYnCDwAPD0btHow
  2. https://mp.weixin.qq.com/s/R6yb-sFKRkzGuACs61TbsQ
  3. https://mp.weixin.qq.com/s/TWI-Tt741Gqe9ERzZr23yg
  4. https://mp.weixin.qq.com/s/yVahDcmuUU7cPikTt4ahNg

往期文章:

1. 复现SCI文章系列专栏

2. 《生信知识库订阅须知》,同步更新,易于搜索与管理。

3. 最全WGCNA教程(替换数据即可出全部结果与图形)

  • WGCNA分析 | 全流程分析代码 | 代码一

  • WGCNA分析 | 全流程分析代码 | 代码二

  • WGCNA分析 | 全流程代码分享 | 代码三

  • WGCNA分析 | 全流程分析代码 | 代码四

  • WGCNA分析 | 全流程分析代码 | 代码五(最新版本)


4. 精美图形绘制教程

  • 精美图形绘制教程

5. 转录组分析教程

转录组上游分析教程[零基础]

小杜的生信筆記 ,主要发表或收录生物信息学的教程,以及基于R的分析和可视化(包括数据分析,图形绘制等);分享感兴趣的文献和学习资料!!

相关文章:

R语言绘制精美图形 | 火山图 | 学习笔记

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 教程图形 前言 最近的事情较多&#xff0c;教程更新实在是跟不上&#xff0c;主要原因是自己没有太多时间来学习和整理相关的内容。一般在下半年基本都是非常忙&#xff0c;所有一个人的精力和时间有限&#x…...

远程创建分支本地VScode看不到分支

在代码存放处右击&#xff0c;点击Git Bash Here 输入git fetch–从远程仓库中获取最新的分支代码和提交历史 就OK啦&#xff0c;现在分支可以正常查看了...

python后台框架简介

python后台框架 Python是一种流行的编程语言&#xff0c;它有许多优点&#xff0c;如简洁、易读、灵活和功能强大。Python也是一种常用的后端开发语言&#xff0c;它可以用来构建各种类型的网站和应用程序。Python有许多后端框架&#xff0c;可以帮助开发者快速地开发和部署后…...

spring boot validation使用

spring-boot-starter-validation 是 Spring Boot 中用于支持数据验证的模块。它建立在 Java Validation API&#xff08;JSR-380&#xff09;之上&#xff0c;提供了一种方便的方式来验证应用程序中的数据。以下是使用 spring-boot-starter-validation 的基本方法&#xff1a; …...

Hadoop3.3.4分布式安装

安装前提&#xff1a;已经配置好java环境&#xff0c;所有机器之间ssh的免密登录。 注意&#xff1a;下文中的flinkv1、flinkv2、flinkv3是三台服务器的别名 1.集群部署规划 注意&#xff1a;NameNode和SecondaryNameNode不要安装在同一台服务器 注意&#xff1a;ResourceMan…...

SQL ALTER TABLE 语句||SQL AUTO INCREMENT 字段

SQL ALTER TABLE 语句 ALTER TABLE 语句 ALTER TABLE 语句用于在现有表中添加、删除或修改列。 SQL ALTER TABLE 语法 若要向表中添加列&#xff0c;请使用以下语法&#xff1a; ALTER TABLE table_name ADD column_name datatype 若要删除表中的列&am…...

【源码系列】短剧系统开发国际版短剧系统软件平台介绍

系统介绍 短剧是一种快节奏、紧凑、有趣的戏剧形式&#xff0c;通过短时间的精彩表演&#xff0c;向观众传递故事的情感和思考。它以其独特的形式和魅力&#xff0c;吸引着观众的关注&#xff0c;成为了当代戏剧娱乐中不可或缺的一部分。短剧每一集都是一个小故事&#xff0c;…...

JavaWeb[总结]

文章目录 一、Tomcat1. BS 与 CS 开发介绍1.1 BS 开发1.2 CS 开发 2. 浏览器访问 web 服务过程详解(面试题)2.1 回到前面的 JavaWeb 开发技术栈图2.2 浏览器访问 web 服务器文件的 UML时序图(过程) &#xff01; 二、动态 WEB 开发核心-Servlet1. 为什么会出现 Servlet2. 什么是…...

如何解决小程序异步请求问题

小程序异步请求问题指的是在小程序中进行异步请求时可能会出现的问题&#xff0c;比如请求失败、请求超时等。以下是一些解决方案&#xff1a; 检查网络连接&#xff1a;首先需要确保网络连接正常&#xff0c;只有网络连接正常时才能正常进行异步请求。 检查请求参数&#xff…...

NSSCTF第12页(3)

[NSSCTF 2nd]php签到 首先&#xff0c;代码定义了一个名为 waf 的函数&#xff0c;用于执行一个简单的文件扩展名检查来防止上传恶意文件。 $black_list 是一个存储不允许的文件扩展名的数组&#xff0c;如 “ph”、“htaccess” 和 “ini”。 pathinfo($filename, PATHINF…...

基于ssm+vue交通事故档案系统

摘要 摘要是对文章、论文或其他文本的主要观点、结论和关键信息的简洁概括。由于你没有提供具体的文章或主题&#xff0c;我将为你创建一个通用的摘要。 本文介绍了一种基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;和Vue.js的交通事故档案管理系统的设计与实现…...

DNS1(Bind软件)

名词解释 1、DNS&#xff08;Domain Name System&#xff09; DNS即域名系统&#xff0c;它是一个分层的分布式数据库&#xff0c;存储着IP地址与主机名的映射 2、域和域名 域为一个标签&#xff0c;而有多个标签域构成的称为域名。例如hostname.example.com&#xff0c;其…...

PDF自动打印

​ 最近接到用户提过来的需求&#xff0c;需要一个能够自动打印图纸的功能&#xff0c;经过几天的研究整出来个初版了的&#xff0c;分享出来给大家&#xff0c;希望能有帮助。 需求描述: ​ 生产车间现场每天都有大量的图纸需要打印&#xff0c;一个一个打印太慢了&#xff0…...

【C#】类型转换-显式转换:括号强转、Parse法、Convert法、其他类型转string

目录 一、括号强转 1.有符号整型 2.无符号整型 3.浮点之间 4.无符号和有符号 5.浮点和整型 6.char和数值类型 7.bool和string是不能够通过 括号强转的 二、Parse法 1.有符号 2.无符号 3.浮点型 4.特殊类型 三、Convert法 1.转字符串 2.转浮点型 3.特殊类型转换…...

【智能家居】4、智能家居框架设计和代码文件工程建立

目录 一、智能家居项目框架 二、智能家居工厂模式示意 三、代码文件工程建立 SourceInsight创建新工程步骤 一、智能家居项目框架 二、智能家居工厂模式示意 三、代码文件工程建立 创建一个名为si的文件夹用于保存SourceInsight生成的文件信息&#xff0c;然后在SourceInsig…...

【GAN】数据增强基础知识

最近要用到&#xff0c;但是一点基础都没有&#xff0c;故开个文章记录一下笔记 目录 GAN DCGAN WGAN EEGGAN GAN 参考 生成对抗网络&#xff08;GAN&#xff09; - 知乎 (zhihu.com) 文章 [1406.2661] Generative Adversarial Networks (arxiv.org) 代码 GitHub - …...

Skywalking流程分析_3(服务的准备、启动、关闭)

前文将SkyWalkingAgent.premain中的&#xff1a; SnifferConfigInitializer.initializeCoreConfig(agentArgs)pluginFinder new PluginFinder(new PluginBootstrap().loadPlugins())这两个方法分析完毕&#xff0c;下面继续分析premain方法其余部分 创建byteBuddy final By…...

mysql中的各种日志文件redo log、undo log和binlog

mysql中的各种日志文件redo log、undo log和binlog mysql中的各种日志文件redo log、undo log和binlog1.MySQL日志文件类型2.redo log日志2.1 作用2.2工作原理&#xff1a;2.3详解 3.undo log日志4.binlog日志5.总结 mysql中的各种日志文件redo log、undo log和binlog 1.MySQL…...

【电视剧-长相思】经典语录

小编看了这么长时间的电视剧&#xff0c;突然感觉摘抄经典语录最有成就感&#xff0c;嘿嘿&#xff0c;下面是我在《长相思》&#xff08;第一季&#xff09;中感觉好的一些语录&#xff0c;语录是乱序排列哈 玟小六&#xff1a;我怕寂寞&#xff0c;寻不到长久的相依&#xff…...

串口通信原理及应用

Content 1. 前言介绍2. 连接方式3. 数据帧格式4. 代码编写 1. 前言介绍 串口通信是一种设备间非常常用的串行接口&#xff0c;以比特位的形式发送或接收数据&#xff0c;由于成本很低&#xff0c;容易使用&#xff0c;工程师经常使用这种方式来调试 MCU。 串口通信应用广泛&a…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...