##该代码对两个及两个以上单细胞样本通过merge函数进行合并,并提供了定义分组找差异基因方法
##载入Seurat包
library(dplyr)
library(Seurat)
library(ggplot2)
################################################################################################
con1.data <- Read10X(data.dir = "C:/Users/28527/Desktop/MCAO/data/Control/01")
con1 <- CreateSeuratObject(counts = con1.data, project = "Control", min.cells = 3, min.features = 200)

con2.data <- Read10X(data.dir = "C:/Users/28527/Desktop/MCAO/data/Control/02")
con2 <- CreateSeuratObject(counts = con2.data, project = "Control", min.cells = 3, min.features = 200)

con3.data <- Read10X(data.dir = "C:/Users/28527/Desktop/MCAO/data/Control/03")
con3 <- CreateSeuratObject(counts = con3.data, project = "Control", min.cells = 3, min.features = 200)


MCAO1.data <- Read10X(data.dir = "C:/Users/28527/Desktop/MCAO/data/MCAO/01")
MCAO1 <- CreateSeuratObject(counts = MCAO1.data, project = "MCAO", min.cells = 3, min.features = 200)

MCAO2.data <- Read10X(data.dir = "C:/Users/28527/Desktop/MCAO/data/MCAO/02")
MCAO2 <- CreateSeuratObject(counts = MCAO2.data, project = "MCAO", min.cells = 3, min.features = 200)

MCAO3.data <- Read10X(data.dir = "C:/Users/28527/Desktop/MCAO/data/MCAO/03")
MCAO3 <- CreateSeuratObject(counts = MCAO3.data, project = "MCAO", min.cells = 3, min.features = 200)


merged<-merge(con1,c(con2,con3,MCAO1,MCAO2,MCAO3))



##计算每个细胞的线粒体基因转录本数的百分比（%）,使用[[ ]] 操作符存放到metadata中
merged[["percent.mt"]] <- PercentageFeatureSet(merged, pattern = "^mt-")#注意大小写

##展示基因及线粒体百分比
VlnPlot(merged, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)
VlnPlot(merged, features = "percent.mt",y.max=20)#y.max=20通过调整y.max更好的展示线粒体数量分布


plot1 <- FeatureScatter(merged, feature1 = "nCount_RNA", feature2 = "percent.mt")
plot2 <- FeatureScatter(merged, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
plot1 + plot2

##过滤细胞：保留gene数大于200小于5000的细胞；目的是去掉空GEMs和1个GEMs包含2个以上细胞的数据；而保留线粒体基因的转录本数低于10%的细胞,为了过滤掉死细胞等低质量的细胞数据。
merged <- subset(merged, subset = nFeature_RNA > 200 & nFeature_RNA < 2000 & percent.mt < 10)####一般3-8%或10%

##表达量数据标准化,LogNormalize的算法：A = log( 1 + ( UMIA ÷ UMITotal ) × 10000 )
merged <- NormalizeData(merged, normalization.method = "LogNormalize", scale.factor = 10000)
#merged <- NormalizeData(merged) 或者用默认的

##鉴定表达高变基因(2000个）,用于下游分析,如PCA；
merged <- FindVariableFeatures(merged, selection.method = "vst", nfeatures = 2000)
#提取表达变化量最高的top100基因
top100 <- head(VariableFeatures(merged), 100)
top100

#使用ScaleData进行数据归一化
##对所有基因进行归一化的方法如下：
all.genes <- rownames(merged)
merged <- ScaleData(merged, features = all.genes)

##为了加快速度，用默认参数，选取标准化高变基因（2000个）,速度更快。
#merged <- ScaleData(merged)


 
##如果要消线粒体的效应，通过vars.to.regress来实现
merged <- ScaleData(merged, vars.to.regress = "percent.mt")



##线性降维（PCA）,默认用高变基因集,但也可通过features参数自己指定；
merged <- RunPCA(merged, features = VariableFeatures(object = merged))

##检查PCA分群结果, 这里只展示前5个PC,每个PC只显示10个基因；
print(merged[["pca"]], dims = 1:5, nfeatures = 10)

##展示主成分基因分值
VizDimLoadings(merged, dims = 1:2, reduction = "pca")

##绘制pca散点图###点数超过 100,000栅格化点。要禁用此行为，请设置 'raster=FALSE'
DimPlot(merged, reduction = "pca")+ NoLegend()

##画第1个或15个主成分的热图；
DimHeatmap(merged, dims = 1, cells = 500, balanced = TRUE)
DimHeatmap(merged, dims = 1:15, cells = 500, balanced = TRUE)



##确定数据集的主成分个数 
#方法1：Jackstraw置换检验算法；重复取样（原数据的1%）,重跑PCA,鉴定p-value较小的PC；计算‘null distribution’(即零假设成立时)时的基因scores。
#merged <- JackStraw(merged, num.replicate = 100)
#merged <- ScoreJackStraw(merged, dims = 1:20)
#JackStrawPlot(merged, dims = 1:15)

#方法2：肘部图（碎石图）,基于每个主成分对方差解释率的排名。
ElbowPlot(merged, ndims = 50)

##主成分个数这里选择30,建议尝试选择多个主成分个数做下游分析,对整体影响不大；在选择此参数时,建议选择偏高的数字（为了获取更多的稀有分群,“宁滥勿缺”）；有些亚群很罕见,如果没有先验知识,很难将这种大小的数据集与背景噪声区分开来。

####基于PCA空间中的欧氏距离构建KNN图，并基于任意两个细胞在其局部邻域的共享重叠(Jaccard相似性)来优化距离权重（输入上一步得到的PC维数）。
merged <- FindNeighbors(merged, dims = 1:10)
##
##接着应用模块化优化技术进行聚类,resolution参数决定下游聚类分析得到的分群数,对于3K左右的细胞,设为0.4-1.2 能得到较好的结果(官方说明)；如果数据量增大,该参数也应该适当增大。
merged <- FindClusters(merged, resolution = 0.4)

##使用Idents（）函数可查看不同细胞的分群；
head(Idents(merged), 5)

####Seurat提供了几种非线性降维的方法进行数据可视化（在低维空间把相似的细胞聚在一起）,比如UMAP和t-SNE。维度选取建议和聚类时的FindNeighbors一致。
merged <- RunTSNE(merged, dims = 1:10)
merged <- RunUMAP(merged, dims = 1:10)


#####手动设置颜色
#配置自己需要的颜色 设置好后使用cols= cns_colors参数

cns_colors <- c(
  # 原有14种颜色
  "#2fa128", "#ff8000", "#1979b5", "#e41315",  "#6a3a9b",
  "#cbb3d7","#a7cfe4", "#fb9b9a", "#b3e08b","#fdc070","#ffff9a", "#80804d",
  
  # 新增11种精心挑选的协调颜色
  "#9e7bb5",  # 柔和的紫罗兰色
  "#5cacda",  # 清新的天蓝色
  "#ff6b6b",  # 珊瑚红色
  "#48bf91",  # 翡翠绿色
  "#ff9f68",  # 温暖的杏色
  "#8c6d46",  # 咖啡棕色
  "#d45087",  # 莓果粉色
  "#6ec6ca",  # 绿松石色
  "#ffd166",  # 阳光黄色
  "#a05195",  # 深紫红色
  "#4a708b"   # 海军蓝灰色
)

##用DimPlot()函数绘制散点图,reduction = "tsne",指定绘制类型；如果不指定,默认先从搜索 umap,然后 tsne, 再然后 pca；也可以直接使用这3个函数PCAPlot()、TSNEPlot()、UMAPPlot()； cols,pt.size分别调整分组颜色和点的大小；

DimPlot(merged,reduction = "tsne",label = TRUE,pt.size = 1.5,cols= cns_colors)

##如需要计算TSNE
#merged <- RunTSNE(merged, dims = 1:12)##important step3: 10代表的就是选择的主成分个数，需要根据自己数据调整
#DimPlot(merged,reduction = "tsne",label = TRUE,pt.size = 1.5)

plot1<-DimPlot(subset(merged, subset = orig.ident=='Control'),reduction = "umap",label = TRUE,pt.size = 1.5,cols= cns_colors)
plot2<-DimPlot(subset(merged, subset = orig.ident=='MCAO'),reduction = "umap",label = TRUE,pt.size = 1.5,cols= cns_colors)

plot1 + plot2

DimPlot(merged,reduction = "tsne",label = TRUE,split.by="orig.ident",pt.size = 1.5,cols= cns_colors)
DimPlot(merged,reduction = "umap",label = TRUE,group.by="orig.ident",pt.size = 1.5,cols= cns_colors)


##比较2个样或者2个组数据中特定cluster的差异基因，先添加样本及分组信息  #RNA_snn_res.0.5换成seurat_clusters更好,不一定都是前者
merged@meta.data$sample_type <- paste(merged@meta.data$orig.ident, merged@meta.data$seurat_clusters, sep = "_")#添加包含样本和cluster合并信息的列
#merged <- AddMetaData(merged, metadata = paste(merged@meta.data$orig.ident, merged@meta.data$RNA_snn_res.0.5, sep = "_"),col.name = "sample_type") #或者用AddMetaData添加列
head(merged@meta.data)

#如需添加分组，先通过#table(merged@meta.data$orig.ident)#明确每个样本细胞数，在根据样本所属分组定义group列，如
table(merged@meta.data$orig.ident)
merged@meta.data$group <- c(rep("Control",24387),rep("MCAO",24755))
merged@meta.data$group_type <- paste(merged@meta.data$group, merged@meta.data$seurat_clusters, sep = "_")#添加包含分组和cluster合并信息的列
head(merged@meta.data)

##比较2个样或者2个组数据中特定cluster的差异基因##https://satijalab.org/seurat/articles/integration_introduction有例子
merged<-JoinLayers(merged)##DEG分析时需要利用JoinLayers将各个数据集折叠到一起

############此处为去批次
##该代码通过harmony消除异质性#########
#install.packages("harmony")#未安装需运行
library(harmony)
##在有PCA值即跑了PCA之后运行以下代码######
#plot_convergence = TRUE,显示迭代，early_stop=FALSE,禁止提前停止，max_iter=10，设置迭代次数，默认为10
merged <- RunHarmony(merged, "orig.ident",plot_convergence = TRUE,early_stop=FALSE,max_iter=20)#可以指定按组还是按样本sample_type
##运行之后在reductions下多出harmony值，后续的聚类及可视化调用harmony
merged <- FindNeighbors(merged,reduction = "harmony",dims = 1:10)
merged <- FindClusters(merged, resolution = 0.4) 
merged1 <- RunTSNE(merged,  dims = 1:10,reduction = "harmony")
#merged1 <- RunUMAP(merged,  dims = 1:10,reduction = "harmony")
##到这里就可以完成批次校正
# DimPlot(merged1,reduction = "umap",label = TRUE,group.by="orig.ident",pt.size = 1.5,cols= cns_colors)
# 
# DimPlot(merged1,reduction = "umap",label = TRUE,split.by="orig.ident",pt.size = 0.8,cols= cns_colors)

DimPlot(merged1,reduction = "tsne",label = TRUE,split.by="orig.ident",pt.size = 0.8,cols= cns_colors)


#######################################################################

# 绘制正确聚类图
# 使用最新聚类结果
p1 <- DimPlot(merged1, 
              reduction = "tsne",
              group.by = "seurat_clusters",  # 显式指定新聚类列
              split.by = "orig.ident",
              label = TRUE,
              pt.size = 1,
              label.size = 4,
              cols= cns_colors) +
  ggtitle("Corrected Clusters by Sample")
# 显示图形
p1 

##细胞周期归类
merged1<- CellCycleScoring(object = merged1, g2m.features = cc.genes$g2m.genes, s.features = cc.genes$s.genes)
head(x = merged@meta.data)
DimPlot(merged1,reduction = "umap",label = TRUE,group.by="Phase",pt.size = 1.5)

###查看并存储UMI，标准化及归一化的数据
write.table(merged1[["RNA"]]$count,"C:/Users/28527/Desktop/result-TBI/umi.xls",sep="\t",quote=F)#原始UMI
write.table(merged1[["RNA"]]$data,"C:/Users/28527/Desktop/result-TBI/data.xls",sep="\t",quote=F)#标准化的data，进行了LogNormalize
write.table(merged1[["RNA"]]$scale.data,"C:/Users/28527/Desktop/result-TBI/scale.data.xls",sep="\t",quote=F)#归一化的scale.data,有正负

###同时可通过pbmc[["pca"]]，pbmc[["umap"]]，pbmc[["tsne"]] 再加上@目的参数读取pca，umap，tsne相关的信息

##存储结果#优先调PCA，其次高变基因，最次分辨率
saveRDS(merged1, file = "C:/Users/28527/Desktop/result-TBI/merged_tutorial.rds")
save(merged1,file="C:/Users/28527/Desktop/result-TBI/res0.5.Robj")##很重要，下一步轨迹分析需要用到 


###merged[["RNA"]] <- split(merged[["RNA"]], f = merged$orig.ident)##可将数据集再次拆开
#marker<-FindMarkers(merged, group.by="sample_type",ident.1 = "MCAO_0", ident.2 = "SHAM_0", min.pct = 0.25, logfc.threshold = 0.25)#比较不同样本的cluster0差异基因
##marker<-FindMarkers(merged, group.by="group_type",ident.1 = "control_0", ident.2 = "tumor_0", min.pct = 0.25, logfc.threshold = 0.25)#比较不同分组的cluster0差异基因
#head(marker)

######################比较组间差异基因#################################################################################
marker1<-FindMarkers(merged1, group.by="orig.ident",ident.2 = "Control", ident.1 = "MCAO", min.pct = 0.25, logfc.threshold = 0.25,subset.ident=0)
head(marker1)
write.csv(marker1,"C:/Users/28527/Desktop/MCAO/result/Control-MCAO.csv ", row.names = TRUE , col.names = TRUE,sep=",")
#marker2<-FindMarkers(merged1, group.by="orig.ident",ident.2 = "Control", ident.1 = "TBI-7d", min.pct = 0.25, logfc.threshold = 0.25,subset.ident=0)
#head(marker2)
#write.csv(marker2,"C:/Users/28527/Desktop/result-TBI/Control-TBI7d.csv ", row.names = TRUE , col.names = TRUE,sep=",")
#marker3<-FindMarkers(merged1, group.by="orig.ident",ident.2 = "TBI-24h", ident.1 = "TBI-7d", min.pct = 0.25, logfc.threshold = 0.25,subset.ident=0)
#head(marker3)
#write.csv(marker3,"C:/Users/28527/Desktop/result-TBI/TBI24h-TBI7d.csv ", row.names = TRUE , col.names = TRUE,sep=",")
#####差异基因火山图###########################################################################
# 加载必要的包
library(ggplot2)
library(ggrepel)
library(patchwork)

# 使用您的 marker1 数据框
marker_a <- marker1
# 数据处理：创建火山图所需的数据框
volcano_data <- data.frame(
  gene = rownames(marker_a),
  log2FC = marker_a$avg_log2FC,
  pvalue = -log10(marker_a$p_val_adj + 1e-300)  # 防止p=0导致无穷大
)

# 定义显著性阈值
fc_threshold <- 1.0  # log2FC阈值
p_threshold <- -log10(0.05)  # 对应p_adj<0.05

# 分类基因表达状态
volcano_data$expression <- ifelse(
  volcano_data$log2FC > fc_threshold & volcano_data$pvalue > p_threshold, "Up-regulated",
  ifelse(volcano_data$log2FC < -fc_threshold & volcano_data$pvalue > p_threshold, "Down-regulated", "Not Significant")
)

# 设置标注参数
top_n <- 5  # 上下调各标注的top基因数量
selected_genes <- c("Ccl3")  # 指定要标注的基因

# 优化配色方案
colors <- c("Up-regulated" = "#ff165d",  
            "Down-regulated" = "#3ec1d3", 
            "Not Significant" = "gray85") 

# 通用绘图函数
create_volcano <- function(data, highlight_genes, title) {
  # 创建基础图
  p <- ggplot(data, aes(x = log2FC, y = pvalue)) +
    # 所有点 - 淡色
    geom_point(aes(color = expression), 
               size = 2, alpha = 0.6, shape = 16) +
    
    # 突出显示点 - 深色+边框
    geom_point(data = subset(data, gene %in% highlight_genes),
               aes(fill = expression), 
               color = "#ff9a00", size = 3.5, shape = 21, stroke = 1) +
    
    # 颜色和填充比例
    scale_color_manual(values = colors) +
    scale_fill_manual(values = colors) +
    
    # 阈值线
    geom_vline(xintercept = c(-fc_threshold, fc_threshold), 
               linetype = "dashed", color = "gray30", linewidth = 0.6) +
    geom_hline(yintercept = p_threshold, 
               linetype = "dashed", color = "gray30", linewidth = 0.6) +
    
    # 标签
    geom_text_repel(
      data = subset(data, gene %in% highlight_genes),
      aes(label = gene),
      color = "black",
      size = 4.5,
      box.padding = 0.6,
      point.padding = 0.3,
      max.overlaps = 100,
      segment.size = 0.4,
      min.segment.length = 0,
      force = 15
    ) +
    
    # 坐标轴和标题
    labs(
      x = expression(Log[2]*" Fold Change"),
      y = expression(-Log[10]*" Adjusted P-value"),
      title = title
    ) +
    
    # 主题设置
    theme_minimal(base_size = 14) +
    theme(
      plot.title = element_text(face = "bold", size = 16, hjust = 0.5),
      legend.position = "top",
      legend.title = element_blank(),
      panel.grid.major = element_line(color = "grey92", linewidth = 0.3),
      panel.grid.minor = element_blank(),
      panel.border = element_rect(fill = NA, color = "grey80", linewidth = 0.8),
      aspect.ratio = 0.8,
      plot.margin = margin(1, 1, 0.5, 1, "cm")
    ) +
    
    # 坐标轴扩展
    scale_y_continuous(expand = expansion(mult = c(0.02, 0.15)))
  
  return(p)
}

# 图1：标注top上下调基因
# 获取top上下调基因（按log2FC绝对值排序）
top_genes <- volcano_data %>%
  arrange(desc(abs(log2FC))) %>%
  filter(expression %in% c("Up-regulated", "Down-regulated")) %>%
  slice_head(n = top_n * 2)  # 上下调各top_n个

p_top <- create_volcano(
  data = volcano_data,
  highlight_genes = top_genes$gene,
  title = "Top Differentially Expressed Genes"
)

# 图2：标注指定基因
p_specified <- create_volcano(
  data = volcano_data,
  highlight_genes = selected_genes,
  title = "Specified Marker Genes"
)

# 组合两张图并显示
combined_plot <- p_top + p_specified + 
  plot_layout(ncol = 2, guides = "collect") &
  theme(legend.position = "top")

# 显示组合图
print(combined_plot)

# 保存图像（可选）
# ggsave("combined_volcano_plots.png", combined_plot, width = 16, height = 8, dpi = 300)


##############################################################################################
#识别保守marker，即在两样（两组）都存在的marker
library(multtest)
library(metap)
marker_both <- FindConservedMarkers(merged1, ident.1 = 0, grouping.var = "orig.ident", verbose = FALSE)
head(marker_both)

# #一般不做，自动注释
# ####如果需要用SingleR鉴定细胞类型，用下面代码，但注意选用合适的参考数据集,有些参考数据需要安装scRNAseq包: BiocManager::install("scRNAseq")
# if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")
# BiocManager::install("SingleR",force = TRUE)  ##安装SingleR
# BiocManager::install("celldex")  ##安装celldex
# library(SingleR) #加载SingleR
# library(celldex) #加载celldex
# refdata <- celldex::MouseRNAseqData() #选用参考数据集，需要自行调整，譬如人是HumanPrimaryCellAtlasData是鼠的话需要选MouseRNAseqData，下载这些数据集比较耗时间，建议在网络好时下载
# refdata
# merged1_for_SingleR<- merged1[["RNA"]]$count
# ##计算每个cluster对应参考数据集中的细胞类型,refdata$label.fine可以修改为refdata$label.main，影响细胞分级选择，建议用fine，细胞类型分的更细，clusters不指定的话对每个细胞单独定义
# cellpred <- SingleR(test = merged1_for_SingleR, ref = refdata, labels = refdata$label.fine, clusters = merged1@active.ident, assay.type.test = "logcounts", assay.type.ref = "logcounts")
# cellpred$labels
# plotScoreHeatmap(cellpred,cellwidth=20,cellheight=9)
# 
# ##将计算的细胞类型导出
# celltype = data.frame(ClusterID=rownames(cellpred), celltype=cellpred$labels, stringsAsFactors = F)
# write.table(celltype,"D:/celltype_singleR.xls",row.names = F,sep="\t")
# 
# ##将计算细胞类型在图中展示
# merged1@meta.data$singleR=celltype[match(merged1@active.ident,celltype$ClusterID),'celltype']
# DimPlot(merged1, reduction = "umap", group.by = "singleR",label=T, label.size=5)
# ####


##绘制Marker基因的小提琴图
VlnPlot(merged1, features = c("Tmem119", "Sall1","P2ry12" # Microglial cells小胶质细胞
                              ,"Plp1", "Olig2","Mog" # Oligodendrocytes 少突胶质细胞
                              ,"Foxj1","Rarres2", "Hdc" # Ependymal cells 室管膜细胞
                              ,"Ttr", "Kl","Enpp2" # Epithelial cells 上皮细胞
                              ,"Cldn5", "Pecam1","Slco1a4" # Endothelial cells 内皮细胞
                              ,"Pdgfra","Col1a1","Tnc" # Fibroblasts 成纤维细胞
                              ,"Sox2","Ccnd2","Prom1"# neural stem cell 神经干细胞
                              ,"Dcx","Neurod1","Ascl1","Eomes","Pax6","Tbr1","Tubb3","Stmn1","Sox11" # 神经元前体/未成熟
                              ,"Syn1","Map2","Syt1"#成熟神经元
                              ,"Vim" # 星形胶质细胞前体/未成熟 
                              ,"Aqp4","Gfap" #成熟星形胶质细胞
                              ),split.by = "orig.ident",pt.size = 0,split.plot = TRUE)

##绘制Marker基因的两组气泡图
markers.to.plot <- c("Tmem119", "Sall1","P2ry12" # Microglial cells小胶质细胞
                     ,"Plp1", "Olig2","Mog" # Oligodendrocytes 少突胶质细胞
                     ,"Foxj1","Rarres2", "Hdc" # Ependymal cells 室管膜细胞
                     ,"Ttr", "Kl","Enpp2" # Epithelial cells 上皮细胞
                     ,"Cldn5", "Pecam1","Slco1a4" # Endothelial cells 内皮细胞
                     ,"Pdgfra","Col1a1","Tnc" # Fibroblasts 成纤维细胞
                     ,"Sox2","Ccnd2","Prom1"# neural stem cell 神经干细胞
                     ,"Syn1","Map2","Syt1"#神经元
                     ,"Aqp4","Gfap" #星形胶质细胞
                     ,"Cd68", "Aif1","Cx3cr1" # Macrophages 巨噬细胞
) # ,"Dcx","Neurod1","Ascl1","Eomes","Pax6","Tbr1","Tubb3","Stmn1","Sox11" #神经元前体/未成熟
  # ,"Vim" # 星形胶质细胞前体/未成熟

DotPlot(merged1, features = markers.to.plot, cols = c("#2fa128","#e41315"), dot.scale = 8, split.by = "orig.ident")+RotatedAxis() #  "#1979b5", 

##分组绘制Marker基因的FeaturePlot图
FeaturePlot(merged1, features = c("Tmem119", "Sall1","P2ry12" # Microglial cells小胶质细胞
                                  ,"Cd68", "Aif1","Cx3cr1" # Macrophages 巨噬细胞
                                  ,"Rbfox3", "Map2","Tubb3" # Neurons 神经元 
                                  ,"Aldh1l1", "Slc1a2","Aqp4" # Astrocytes 星形胶质细胞
                                  ,"Plp1", "Olig2","Mog" # Oligodendrocytes 少突胶质细胞
                                  ,"Cd3e", "Cxcr6","Cd69" # T cells
                                  ,"Cd79a", "Cd79b","Ms4a1" # B Cell
                                  ,"Trbc2", "Klrd1","Nkg7" # Natural killer cells  NK细胞
                                  ,"Cxcr2", "S100a8","S100a9" # Granulocytes 粒细胞
                                  ,"Cd24a", "Cd209a","H2-Aa" # Dendritic cells 树突状细胞
                                  ,"Foxj1","Rarres2", "Hdc" # Ependymal cells 室管膜细胞
                                  ,"Ttr", "Kl","Enpp2" # Epithelial cells 上皮细胞
                                  ,"Cldn5", "Pecam1","Slco1a4" # Endothelial cells 内皮细胞
                                  ,"Pdgfra","Col1a1","Tnc" # Fibroblasts 成纤维细
                                  ), split.by = "orig.ident", max.cutoff = 3,cols = c("grey", "red"))

##################################################
###给定细胞类型以绘制比例图
library(ggplot2)
library(ggalluvial)
library(tidyverse)
Idents(merged1) <- merged1$seurat_clusters
new.cluster.ids <- c("Endothelial cells" #0
                     ,"Endothelial cells" #1
                     , "Microglia" #2
                     , "Endothelial cells" #3
                     , "Neural stem cells" #4
                     , "Epithelial cells" #5
                     , "Macrophages" #6
                     , "Macrophages" #7
                     , "Macrophages" #8
                     , "Ependymal cells" #9
                     , "Endothelial cells" #10
                     , "Oligodendrocytes" #11
                     , "Ependymal cells" #12
                     , "Microglia" #13
                     , "Endothelial cells" #14
                     , "Astrocytes" #15
                     )
names(new.cluster.ids) <- levels(merged1)
merged1 <- RenameIdents(merged1, new.cluster.ids)
merged1$cell_type <- Idents(merged1)

##存储细胞归类结果
saveRDS(merged1, file = "C:/Users/28527/Desktop/MCAO/result/merged1_mcao_celltype.rds")
###################################可视化降维图
#1. 基础UMAP可视化（按细胞类型着色）
# 使用默认配色（自动生成不同颜色）
DimPlot(merged1, 
        reduction = "tsne",         # 使用UMAP坐标
        group.by = "cell_type",     # 按您注释的细胞类型分组
        split.by = "orig.ident",
        label = TRUE,               # 显示聚类标签
        cols = cns_colors, 
        label.size = 4,             # 标签大小
        pt.size = 0.8) +            # 点的大小   
  ggtitle("Cell Type Annotation") + 
  theme(legend.position = "right")  # 图例位置
#2.(1) 自定义颜色 + 分面显示
# 1. 定义颜色（确保覆盖所有细胞类型）
# 方法1：使用RColorBrewer扩展
library(RColorBrewer)
new_colors <- colorRampPalette(brewer.pal(12, "Set3"))(18)
celltype_colors <- setNames(new_colors[1:length(unique(Idents(merged1)))], 
                            unique(Idents(merged1)))

# 方法2：使用ggsci期刊配色
# library(ggsci)  # 确保已安装并加载ggsci包
# celltype_colors <- pal_ucscgb()(length(unique(Idents(merged1))))
# names(celltype_colors) <- unique(Idents(merged1))

# 2. 绘制分面图（修正语法错误）
p <- DimPlot(merged1,
             reduction = "tsne",
             group.by = "cell_type",
             split.by = "orig.ident",  # 按样本分面
             cols = cns_colors,   # 自定义颜色
             ncol = 2,                # 分面列数
             pt.size = 1) +         # 调整点大小
  ggtitle("Cell Type Composition Across Samples") +
  theme_minimal(base_size = 12) +     # 调整基础字体大小
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),  # 标题居中加粗
    legend.position = "right",
    legend.text = element_text(size = 10)
  )

# 3. 调整图例（修正括号并优化显示）
p_final <- p + guides(
  color = guide_legend(
    override.aes = list(size = 4),  # 图例点大小
    ncol = 1,                      # 图例句柄列数
    title = "Cell Type"            # 图例标题
  )
)

# 4. 显示图形
print(p_final)

# # 5. 保存高清图（可选）
# ggsave("umap_by_sample_and_celltype.png", 
#        plot = p_final,
#        width = 12, 
#        height = 8,
#        dpi = 300)

#(2) 组合图（细胞类型+样本来源）
sample_colors <- c("Control" = "#2ccae9", "MCAO" = "#f66072") # 示例样本颜色

# 2. 绘制带图例的图形
p1 <- DimPlot(merged1, 
              reduction = "tsne",
              group.by = "cell_type",
              cols = cns_colors,
              label = TRUE,                # 显示聚类标签
              label.size = 3,              # 标签大小
              repel = TRUE) +              # 避免标签重叠
  ggtitle("Cell Type Annotation") +
  theme(legend.position = "right",
        plot.title = element_text(hjust = 0.5, face = "bold"))

p2 <- DimPlot(merged1,
              reduction = "tsne",
              group.by = "orig.ident",
              cols = sample_colors,
              label = FALSE) +            # 样本分组通常不需要标签
  ggtitle("Sample Distribution") +
  theme(legend.position = "right",
        plot.title = element_text(hjust = 0.5, face = "bold"))

# 3. 拼图（调整图例比例）
library(patchwork)
combined_plot <- (p1 + p2) + 
  plot_layout(widths = c(1, 1), 
              guides = "collect") &  # 合并图例
  theme(legend.box = "vertical",
        legend.spacing.y = unit(0.5, 'cm'))

# 4. 显示图形
print(combined_plot)

# # 5. 保存（可选）
# ggsave("combined_umap_annotated.png", 
#        plot = combined_plot,
#        width = 14, height = 6, dpi = 300)

#3. 流式图展示细胞类型比例（使用ggalluvial）
# 准备数据
cell_ratio <- merged1@meta.data %>%
  group_by(orig.ident, cell_type) %>%
  summarise(count = n()) %>%
  mutate(ratio = count / sum(count))

# 绘制细胞比例流式图
ggplot(cell_ratio, 
       aes(x = orig.ident, y = ratio, 
           stratum = cell_type, alluvium = cell_type,
           fill = cell_type)) +
  geom_stratum(width = 0.4) +                  # 条形部分
  geom_alluvium(width = 0.4, alpha = 0.7) +    # 流动曲线部分
  scale_fill_manual(values = cns_colors) + # 使用统一配色
  scale_y_continuous(labels = scales::percent) +
  labs(x = "Sample", y = "Percentage") +
  theme_classic() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

#####细胞聚类可视化
DimPlot(merged1,reduction = "umap",label = TRUE,split.by="orig.ident",pt.size = 1.5,cols= cns_colors)

################## SCP可视化
# 安装
#devtools::install_github("zhanghao-njmu/SCP")
library(SCP)
CellDimPlot(merged1, split.by="orig.ident", group.by = "cell_type", reduction = "UMAP" , theme_use = "theme_blank")
CellDimPlot(merged1, split.by="orig.ident", group.by = "cell_type", reduction = "UMAP")

######################scCustomize可视化
# 安装
#install.packages("scCustomize")
library(viridis)
library(Seurat)
library(scCustomize)
FeaturePlot_scCustom(seurat_object = merged1, pt.size = 0.8,features = c("Neurog1","Neurog2", "Dlx2", "Sp8","Ascl1"
                                                                         ,"Dcx","Bdnf","Ntf3","Nes"
                                                                         ,"Dnmt3a"), order = F)#展示指定基因
FeaturePlot_scCustom(seurat_object = merged1, pt.size = 0.8,features = c("Il6st", "Stat3", "Socs3"
                                                                         ,"Notch1", "Hes1", "Hes5"
                                                                         ,"Rbpj", "Bmpr1a", "Id1"
                                                                         ,"Id3", "Smad4", "Lifr"
                                                                         ), order = F)#展示指定基因

#使用Seurat原生函数分组绘制
FeaturePlot(
  merged1,
  features = c("Il6st", "Stat3", "Socs3"
               ,"Notch1", "Hes1", "Hes5"
               ,"Rbpj", "Bmpr1a", "Id1"
               ,"Id3", "Smad4", "Lifr"),
  split.by = "orig.ident",  # 分组列名
  order = FALSE,
  combine = TRUE,  # 合并为单个图
  pt.size = 0.8,
  cols = c("lightgrey", "#FF0000")  # 低表达到高表达的颜色
) 
#################################################################################

##绘制两个样本间细胞比例的堆叠柱状图
cellratio<-prop.table(table(merged1$cell_type,merged1$orig.ident),margin=2)#计算各组样本不同细胞群比例
cellratio<-as.data.frame(cellratio)
colnames(cellratio) <- c("cell_type","orig.ident","ratio")

#转换为因子，指定绘图
cellratio$cell_type <- factor(cellratio$cell_type,levels = unique(cellratio$cell_type))
# ggplot(cellratio, aes(x = orig.ident, y = ratio, fill = cell_type)) +
#   geom_bar(position = "fill", stat="identity", color = 'white', alpha = 5, width = 0.95) +
#   scale_fill_manual(values = 1:14) +
#   scale_y_continuous(expand = c(0,0)) +
#   theme_classic()

library(RColorBrewer)
ggplot(cellratio, aes(x = orig.ident, y = ratio, fill = cell_type)) +
  geom_bar(position = "fill", stat="identity", color = 'white', width = 0.95) +
  scale_fill_manual(values = colorRampPalette(brewer.pal(12, "Paired"))(length(unique(cellratio$cell_type)))) +
  scale_y_continuous(expand = c(0,0)) +
  theme_classic()

###########################总体########################################
#merged1.markers <- FindAllMarkers(merged1,group.by ="orig.ident",only.pos = TRUE)#group.by ="orig.ident"为总体分组finderallmarker
##寻找每一cluster的marker
merged1.markers <- FindAllMarkers(merged1,only.pos = TRUE)#TRUE为上调，FALSE为上下调
merged1.markers %>% group_by(cluster) %>% dplyr::filter(avg_log2FC > 1)
head(merged1.markers)
##调整差异分析的统计学检验方法
#cluster0.markers <- FindMarkers(pbmc, ident.1 = 0, logfc.threshold = 0.25, test.use = "roc", only.pos = TRUE)

##存储marker
write.table(merged1.markers,file="C:/Users/28527/Desktop/result-TBI/allmarker.txt",sep="\t")

##绘制分cluster的热图
merged1.markers %>% group_by(cluster) %>% dplyr::filter(avg_log2FC > 1) %>% slice_head(n = 10) %>% ungroup() -> top10#n = 10可以自行调整数字
DoHeatmap(merged1, features = top10$gene) + NoLegend()
DoHeatmap(subset(merged1, downsample = 50),features = top10$gene)+ NoLegend()#每个cluster取50个细胞
DoHeatmap(subset(merged1, downsample = 500),features = top10$gene,group.colors = rainbow(9))+scale_fill_gradientn(colors = c("blue", "white", "red"))

##############################################################

###############分组Findallmarkers#########
# 加载必要的包
library(Seurat)
library(dplyr)
library(purrr)

# 1. 设置分组信息（假设您的分组存储在 'group' 列中）
groups <- c("Control", "MCAO")  # 您的三个分组，需要修改

# 2. 为每个分组创建子集并运行FindAllMarkers
group_markers <- map(groups, function(group_name) {
  # 创建当前分组的子集
  subset_obj <- subset(merged1, subset = group == group_name)
  
  # 确保使用cluster作为标识
  Idents(subset_obj) <- "cell_type"  # 或您使用的cluster列名
  
  # 运行FindAllMarkers
  markers <- FindAllMarkers(
    subset_obj,
    only.pos = TRUE,          # 只返回上调基因
    logfc.threshold = 0.25,   # log2FC阈值
    min.pct = 0.1,            # 最小表达比例
    return.thresh = 0.05      # 返回调整p值小于此值的基因
  )
  
  # 添加分组信息
  markers$group <- group_name
  
  return(markers)
}) %>%
  setNames(groups)  # 用分组名称命名列表

# 3. 合并所有结果
all_markers <- bind_rows(group_markers)

# 4. 保存结果
# 创建目录
dir.create("group_cluster_markers", showWarnings = FALSE)

# 保存每个分组的结果
iwalk(group_markers, ~ write.csv(.x, 
                                 file = paste0("group_cluster_markers/", .y, "_cluster_markers.csv"),
                                 row.names = FALSE))

# 保存合并的结果
write.csv(all_markers, "C:/Users/28527/Desktop/result-TBI/all_group_cluster_markers.csv", row.names = FALSE)

# 5. 访问特定分组的结果
control_markers <- group_markers[["Control"]]#此处记得需要修改
mcao_markers <- group_markers[["MCAO"]]#此处记得需要修改


library(Seurat)
library(dplyr)
library(patchwork)

# 设置全局绘图参数
my_colors <- c("blue", "white", "red")  # 蓝-白-红渐变
group_colors <- rainbow(20)  # 使用20种颜色的彩虹色系

# 函数：获取每个cluster的top10基因，可以自定义修改top
get_top_genes <- function(markers_df, n_genes = 10) {
  markers_df %>%
    group_by(cluster) %>%
    top_n(n = n_genes, wt = avg_log2FC) %>%
    pull(gene) %>%
    unique()
}

# 获取每个组的top基因
top_control <- get_top_genes(control_markers)
top_mcao <- get_top_genes(mcao_markers)


# 函数：创建定制热图
create_custom_heatmap <- function(merged1, features, group_name) {
  DoHeatmap(
    object = subset(merged1, downsample = 500),  # 下采样500个细胞
    features = features,
    group.colors = group_colors,  # 使用彩虹色系
    group.by = "cell_type",
    size = 4,  # 调整基因名字体大小
    angle = 0,  # 水平标签
    slot = "scale.data"  # 使用缩放数据
  ) +
    scale_fill_gradientn(colors = my_colors) +  # 蓝-白-红色谱
    ggtitle(group_name) +
    theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))
}

# 创建各组的定制热图
heatmap_control <- create_custom_heatmap(merged1, top_control, "Control Group")
heatmap_mcao <- create_custom_heatmap(merged1, top_mcao, "MCAO Group")


print(heatmap_control)
print(heatmap_mcao)

###############分组Findallmarkers+热图绘制完事######################

##########################多组火山图################################
#1. 准备工作
library(Seurat)
library(ggplot2)
library(ggrepel)
library(patchwork)

# 确保metadata列存在
head(merged1@meta.data[, c("orig.ident", "cell_type", "group")]) 

# 定义分组（假设group列包含"Control"和"TBI"）
Idents(merged1) <- "cell_type"  # 按细胞类型分组
cell_types <- unique(merged1$cell_type)  # 获取所有细胞类型
#2. 批量计算差异基因（按细胞类型）
# 存储所有结果的列表
all_degs <- list()

for (ct in cell_types) {
  # 提取当前细胞类型的子集
  subset_cells <- subset(merged1, cell_type == ct)
  Idents(subset_cells) <- "group"  # 切换分组依据
  
  # 计算差异基因（Control vs TBI）
  degs <- FindMarkers(
    subset_cells,
    ident.1 = "MCAO",      # 实验组
    ident.2 = "Control",      # 对照组
    logfc.threshold = 0.25,   # 最小logFC
    min.pct = 0.1,            # 在至少10%细胞中表达
    test.use = "wilcox"       # 默认方法
  )
  
  # 添加基因名和细胞类型信息
  degs$gene <- rownames(degs)
  degs$cell_type <- ct
  all_degs[[ct]] <- degs
}

# 合并所有结果
combined_degs <- do.call(rbind, all_degs)
#3. 绘制分面火山图（所有细胞类型）
# 定义显著性阈值
combined_degs$significant <- ifelse(
  combined_degs$p_val_adj < 0.05 & abs(combined_degs$avg_log2FC) > 0.5,
  ifelse(combined_degs$avg_log2FC > 0, "Up", "Down"),
  "Not Sig"
)
# 颜色定义
volcano_colors <- c("Up" = "red", "Down" = "blue", "Not Sig" = "gray")

# 分面火山图
ggplot(combined_degs, aes(x = avg_log2FC, y = -log10(p_val_adj))) +
  geom_point(aes(color = significant), alpha = 0.6, size = 1) +
  scale_color_manual(values = volcano_colors) +
  facet_wrap(~cell_type, scales = "free", ncol = 3) +  # 按细胞类型分面
  geom_vline(xintercept = c(-0.5, 0.5), linetype = "dashed") +
  geom_hline(yintercept = -log10(0.05), linetype = "dashed") +
  labs(
    title = "DEGs between MCAO and Control across Cell Types",
    x = "Log2 Fold Change (MCAO and Control)",
    y = "-Log10(Adjusted P-value)"
  ) +
  theme_bw() +
  theme(
    strip.background = element_rect(fill = "white"),
    panel.grid.minor = element_blank()
  )

##4. 标记关键基因（可选）
# 选择每个细胞类型中top10差异基因
top_genes <- combined_degs %>%
  group_by(cell_type, significant) %>%
  filter(significant %in% c("Up", "Down")) %>%
  slice_min(p_val_adj, n = 10)  # 取每种细胞类型上下调各5个基因

# 在火山图中标记
last_plot() +  # 接续上一个ggplot对象
  geom_text_repel(
    data = top_genes,
    aes(label = gene),
    size = 2.5,
    box.padding = 0.3,
    max.overlaps = 20
  )
#手动指定目标基因标记
# 1.指定目标细胞类型（示例：Microglial cells）
head(merged1@meta.data["cell_type"])
target_celltype <- "Neural stem cells"

# 筛选该细胞类型的数据
celltype_degs <- combined_degs %>% 
  filter(cell_type == target_celltype)

# 自定义要标记的基因
# 手动指定需要标记的基因（按实际需求修改）
target_genes <- c("Tnf","Ccl2"#电子传递链漏电子
                  ,"Cyba","Hspa1a" #专职ROS生成酶
                  ,"Nfkb1","RelA"
                  ,"Nfe2l2","Hmox1","Nqo1","Gclc","Gclm"
                  )

#2. 绘制该细胞类型的火山图
library(ggplot2)
library(ggrepel)

# 基础火山图
volcano_plot <- ggplot(celltype_degs, 
                       aes(x = avg_log2FC, y = -log10(p_val_adj))) +
  geom_point(
    aes(color = significant), 
    alpha = 0.6, 
    size = 2.5  # 增大点大小
  ) +
  scale_color_manual(
    values = c("Up" = "#E64B35", "Down" = "#3182BD", "Not Sig" = "grey80"),
    name = "Regulation"
  ) +
  geom_vline(xintercept = c(-0.5, 0.5), linetype = "dashed", color = "grey50") +
  geom_hline(yintercept = -log10(0.05), linetype = "dashed", color = "grey50") +
  labs(
    title = paste("DEGs in", target_celltype, "(MCAO vs Control)"),
    x = "Log2 Fold Change (MCAO/Control)",
    y = "-Log10(Adjusted P-value)"
  ) +
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    legend.position = "right"
  )

# 添加自定义基因标签
volcano_plot + 
  geom_text_repel(
    data = filter(celltype_degs, gene %in% target_genes),
    aes(label = gene),
    size = 4,                    # 增大标签字体
    box.padding = 0.8,           # 增加标签周围空间
    max.overlaps = Inf,          # 强制显示所有目标基因
    segment.color = "grey30",     # 调整连线颜色
    min.segment.length = 0.1,    # 减少最短连线长度
    force = 2,                   # 增加标签排斥力
    nudge_x = ifelse(
      filter(celltype_degs, gene %in% target_genes)$avg_log2FC > 0, 
      0.2, -0.2  # 根据基因位置调整标签偏移方向
    )
  )
#3. 高级定制功能
#(1) 突出显示关键基因
# 在原始数据中添加highlight列
celltype_degs <- celltype_degs %>%
  mutate(
    highlight = case_when(
      gene %in% c("Tnf", "Il1b") ~ "Inflammation",
      gene %in% c("Ccl3", "Ccl4") ~ "Chemokines",
      TRUE ~ "Other"
    )
  )

# 绘制带分组的火山图
volcano_plot +
  geom_point(
    data = filter(celltype_degs, highlight != "Other"),
    aes(fill = highlight),
    shape = 21,            # 带边框的点
    size = 4.5,
    color = "black",       # 边框颜色
    show.legend = TRUE
  ) +
  scale_fill_manual(
    values = c("Inflammation" = "#ffd700", "Chemokines" = "#00A087"),
    name = "Gene Group"
  )
#(2) 分面显示上下调基因
# 添加方向列
celltype_degs$direction <- ifelse(
  celltype_degs$avg_log2FC > 0, "Up-regulated", "Down-regulated"
)

# 分面绘制
ggplot(celltype_degs, aes(x = avg_log2FC, y = -log10(p_val_adj))) +
  geom_point(aes(color = significant), alpha = 0.6) +
  facet_wrap(~direction, scales = "free_x") +  # 按方向分面
  geom_text_repel(
    data = filter(celltype_degs, gene %in% target_genes),
    aes(label = gene),
    size = 3
  )


###########多组火山图
#1. 安装必要包（若未安装）
if (!require("devtools")) install.packages("devtools")
devtools::install_github('junjunlab/scRNAtoolVis')

library(scRNAtoolVis)
library(Seurat)
library(dplyr)
library(ggplot2)

# 1. 准备差异分析结果
# ---------------------------------------------------------------
# 设置活动标识为细胞类型
Idents(merged1) <- "cell_type"

# 获取所有细胞类型
# 获取所有细胞类型（排除可能存在的NA值）
cell_types <- unique(merged1$cell_type) %>% 
  na.omit() %>% 
  as.character()
cat("需要分析的细胞类型数量:", length(cell_types), "\n")

# 存储所有差异结果的列表
all_degs <- list()

# 循环进行每个细胞类型的差异分析
for (ct in cell_types) {
  tryCatch({
    # 安全提取子集
    subset_cells <- subset(merged1, subset = cell_type == ct)
    
    # 检查分组是否包含两个水平
    if (length(unique(subset_cells$group)) < 2) {
      message("细胞类型 ", ct, " 缺少对照组或实验组，跳过分析")
      next
    }
    
    Idents(subset_cells) <- "group"
    
    # 更合理的差异基因参数
    degs <- FindMarkers(
      object = subset_cells,
      ident.1 = "MCAO",            #记得修改组名和下方图注
      ident.2 = "Control",
      logfc.threshold = 0.1,          # 降低阈值捕获更多基因
      min.pct = 0.05,                 # 降低表达比例要求
      min.diff.pct = 0.05,            # 添加组间表达率差异阈值
      test.use = "wilcox",
      only.pos = FALSE,
      verbose = FALSE                 # 减少输出
    )
    
    # 添加必要信息
    degs$gene <- rownames(degs)
    degs$cell_type <- ct
    degs$comparison <- paste0(ct, "_TBI-24h_vs_Control")
    
    all_degs[[ct]] <- degs
    
  }, error = function(e) {
    message("在细胞类型 ", ct, " 上出错: ", e$message)
  })
}

# 合并所有结果
combined_degs <- bind_rows(all_degs)

# 2. 数据格式化（适配jjVolcano）
# ---------------------------------------------------------------
# 添加必要的列
combined_degs <- combined_degs %>%
  mutate(
    logFC = avg_log2FC,   # jjVolcano要求logFC列
    pvalue = p_val_adj,   # jjVolcano要求pvalue列
    Direction = ifelse(avg_log2FC > 0, "Up", "Down")
  )

#  处理p值为0的情况（关键步骤）
# ---------------------------------------------------------------
# 将0值替换为机器可表示的最小正数（避免无穷大）
combined_degs <- combined_degs %>%
  mutate(
    pvalue = ifelse(pvalue == 0, .Machine$double.xmin, pvalue)
  )

# 3. 绘制jjVolcano多组火山图
# ---------------------------------------------------------------
# 基于现有列创建 cluster 列
combined_degs$cluster <- combined_degs$cell_type  # 或者使用 combined_degs$comparison

# 然后绘制
p <- jjVolcano(
  diffData = combined_degs,
  topGeneN = 5,
  aesCol = c('purple','orange'),
  tile.col = jjAnno::useMyCol("paired", n = 12)
)
p


#提供基因名,标记自己的基因:
mygene <- c('Ccl1','Ccl2','Ccl3','Ccl4','Ccl5',
            #CC 趋化因子亚家族配体 (CCL)
            'Ccr1','Ccr2','Ccr3','Ccr4','Ccr5','Ccr6','Ccr7','Ccr8','Ccr9','Ccr10',#CC 趋化因子亚家族受体 (CCR)
            'Hk1','Hk2','Hk3','Hk4',#HK
            'Pkm1','Pkm2'#PK
            ,'Tmem119','P2ry12','Cx3cr1','Hexb','Selplg','Cd162','Siglech' #稳态MG
            ,'Cd86','Cd32','Fcgr2b','H2-aa','H2-ab1','Nos2','Il1b','Tnf','Stat1','Irf5'#M1
            ,'Mrc1','Arg1','Ym1','Chi3l3','Il10','Tgfb1','Fizz1','Retnla' #M2
            ,'Mki67','Top2a','Pcna','Cenpf' #增值性MG
)
p1 <- jjVolcano(
  diffData = combined_degs,
  myMarkers = mygene,
  aesCol = c('purple','orange'),
  tile.col = jjAnno::useMyCol("paired", n = 12)
)
p1

###################################分组火山图完事#################################

#################################富集分析#########################################
#选定细胞亚群的富集分析 以小胶质细胞为例
#1. 准备富集分析所需数据
# 提取小胶质细胞的差异基因
# 步骤1：提取小胶质细胞子集
NSC_subset <- subset(merged1, idents = "Neural stem cells")

# 步骤2：组间差异分析
NSC_subset_markers <- FindMarkers(
  object = NSC_subset,
  ident.1 = "MCAO",    # 处理组样本
  ident.2 = "Control",      # 对照组样本
  group.by = "orig.ident",       # metadata中的分组列名
  test.use = "wilcox",      # 差异检验方法
  logfc.threshold = 0.25    # 初筛阈值（后续可再过滤）
) %>% 
  rownames_to_column("gene") %>% 
  dplyr::filter(abs(avg_log2FC) > 1 & p_val_adj < 0.05) %>% 
  arrange(desc(avg_log2FC))

# 查看Top10基因
head(NSC_subset_markers, 10)
# 将数据框写入CSV文件
write.csv(
  NSC_subset_markers,
  file = "C:/Users/28527/Desktop/MCAO/result/diff_genes_results.csv",  # 文件名
  row.names = FALSE,                # 不保存行序号
  na = ""                           # 缺失值留空
)

#######################
library(ggplot2)
library(ggrepel)

# 准备数据
celltype_degs$log10_padj <- -log10(celltype_degs$p_val_adj + 1e-300)

# 更新基因列表和分组
inflammation_genes <- c("Tnf", "Ccl2", "Nfkb1", "RelA", "NLRP3")
oxidative_stress_genes <- c("Cyba", "Hspa1a")
nfe2l2_pathway_genes <- c("Nfe2l2", "Hmox1")

# 合并所有目标基因
target_genes <- c(inflammation_genes, oxidative_stress_genes, nfe2l2_pathway_genes)

# 创建基因分组信息
celltype_degs$Group <- "Other"
celltype_degs$Group[celltype_degs$gene %in% inflammation_genes] <- "Inflammation"
celltype_degs$Group[celltype_degs$gene %in% oxidative_stress_genes] <- "Oxidative Stress"
celltype_degs$Group[celltype_degs$gene %in% nfe2l2_pathway_genes] <- "NFE2L2 Pathway"

# 将Group转换为因子，控制图例顺序
celltype_degs$Group <- factor(celltype_degs$Group,
                              levels = c("Inflammation", "Oxidative Stress", "NFE2L2 Pathway", "Other"))

# 创建标记数据子集
label_data <- subset(celltype_degs, gene %in% target_genes)

# 绘制火山图 - 显示分组和大小图例
ggplot(celltype_degs, aes(x = avg_log2FC, y = log10_padj)) +
  # 背景点 - 显示颜色和大小图例
  geom_point(aes(color = Group, size = pct.1), 
             alpha = 0.7, shape = 16) +
  
  # 标记目标基因（带标签）
  geom_label_repel(
    data = label_data,
    aes(label = gene, fill = Group),
    color = "white",
    fontface = "bold",
    box.padding = 0.35,
    point.padding = 0.3,
    segment.color = "grey40",
    min.segment.length = 0.2,
    size = 4,
    show.legend = FALSE,  # 标签不显示图例
    max.overlaps = 20
  ) +
  
  # 阈值线
  geom_vline(xintercept = c(-0.5, 0.5), linetype = "dashed", alpha = 0.4) +
  geom_hline(yintercept = -log10(0.05), linetype = "dashed", alpha = 0.4) +
  
  # 颜色比例 - 显示图例
  scale_color_manual(
    values = c(
      "Inflammation" = "#E41A1C",     # 红色
      "Oxidative Stress" = "#377EB8", # 蓝色
      "NFE2L2 Pathway" = "#4DAF4A",   # 绿色
      "Other" = "grey70"
    ),
    name = "Gene Group",  # 图例标题
    breaks = c("Inflammation", "Oxidative Stress", "NFE2L2 Pathway")  # 只显示目标组
  ) +
  
  # 填充比例 - 用于标签
  scale_fill_manual(
    values = c(
      "Inflammation" = "#E41A1C",
      "Oxidative Stress" = "#377EB8",
      "NFE2L2 Pathway" = "#4DAF4A"
    ),
    guide = "none"  # 隐藏填充图例
  ) +
  
  # 点大小比例 - 显示图例
  scale_size_continuous(
    range = c(1.8, 4.5),
    breaks = c(0.1, 0.3, 0.5, 0.7, 0.9),
    name = "Expression in Target Cells"
  ) +
  
  # 标签和主题
  labs(
    x = "Average log2(Fold Change)",
    y = "-log10(Adjusted p-value)"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    panel.grid.major = element_line(linewidth = 0.2, color = "grey90"),
    panel.grid.minor = element_blank(),
    panel.border = element_rect(fill = NA, color = "black", linewidth = 0.5),
    axis.title = element_text(face = "bold", size = 14),
    axis.text = element_text(size = 12),
    plot.margin = margin(15, 15, 15, 15),
    legend.position = "right",
    legend.box = "vertical",  # 垂直排列图例
    legend.title = element_text(size = 11, face = "bold"),
    legend.text = element_text(size = 10),
    legend.key = element_rect(fill = "white", color = NA)  # 图例键背景
  ) +
  # 确保所有目标基因都能显示
  expand_limits(y = max(celltype_degs$log10_padj, na.rm = TRUE) * 1.15) +
  # 调整图例顺序
  guides(
    color = guide_legend(order = 1, override.aes = list(size = 4)),  # 增大图例点大小
    size = guide_legend(order = 2)
  )

# 保存高质量图片
ggsave("volcano_plot_with_legends.png", width = 10, height = 8, dpi = 300)
######################

# 提取基因列表
gene_list <- NSC_subset_markers$avg_log2FC
names(gene_list) <- NSC_subset_markers$gene

#2.安装和加载必要的包
# 加载包
library(clusterProfiler)
library(org.Mm.eg.db)  # 小鼠数据库（如果是人类用org.Hs.eg.db）
library(enrichplot)
library(ggplot2)
library(ggrepel)
library(viridis)
library(cowplot)

#3. GO富集分析
# 转换基因名为Entrez ID
entrez_ids <- bitr(names(gene_list), fromType = "SYMBOL", 
                   toType = "ENTREZID", OrgDb = org.Mm.eg.db)

# 准备排序的基因列表
ordered_gene_list <- gene_list[entrez_ids$SYMBOL]
names(ordered_gene_list) <- entrez_ids$ENTREZID
ordered_gene_list <- sort(ordered_gene_list, decreasing = TRUE)

# GO富集分析
go_enrich <- enrichGO(
  gene = names(ordered_gene_list),
  OrgDb = org.Mm.eg.db,
  keyType = "ENTREZID",  #记得更改每种富集分别做一边，图注注释也要改
  #ont = "BP",  # 生物过程(Biological Process) 
  #ont = "MF", #分子功能（Molecular Function）
  ont = "CC",#细胞组分（Cellular Component）
  pvalueCutoff = 0.05,
  pAdjustMethod = "BH",
  qvalueCutoff = 0.2,
  readable = TRUE
)

# 简化GO结果（去除冗余）
go_simplified <- clusterProfiler::simplify(
  go_enrich,
  cutoff = 0.7,
  by = "p.adjust",
  select_fun = min
)
##########go富集分析可视化
# 条形图
p_go_bar <- barplot(go_simplified, 
                    showCategory = 15, 
                    title = "GO Cellular Component Enrichment",
                    font.size = 10) +
  scale_fill_gradient(low = "#D0E1F2", high = "#0571B0") +  # 渐变 
  theme(axis.text.y = element_text(size = 10))
p_go_bar
# 点图
p_go_dot <- dotplot(go_simplified, 
                    showCategory = 15,
                    title = "GO Cellular Component Enrichment") +
  scale_fill_gradient(low = "#D0E1F2", high = "#0571B0") +  # 渐变
  theme(axis.text.y = element_text(size = 10))
p_go_dot
# 网络图
p_go_net <- cnetplot(go_simplified, 
                     categorySize = "pvalue",
                     foldChange = gene_list,
                     showCategory = 5,
                     node_label = "gene") +
  ggtitle("Gene-Concept Network") +
  scale_color_gradient2(low = "blue", mid = "white", high = "red", 
                        midpoint = median(gene_list))
p_go_net

#########KEGG富集分析

# KEGG富集分析
kegg_enrich <- enrichKEGG(
  gene = names(ordered_gene_list),
  organism = "mmu",  # 小鼠（人类用"hsa"）
  keyType = "kegg",
  pvalueCutoff = 0.05,
  pAdjustMethod = "BH",
  qvalueCutoff = 0.2
)
# 添加可读的基因符号
kegg_enrich <- setReadable(kegg_enrich, OrgDb = org.Mm.eg.db, keyType = "ENTREZID")
##########KEGG可视化
# KEGG条形图
p_kegg_bar <- barplot(kegg_enrich, 
                      showCategory = 15, 
                      title = "KEGG Pathway Enrichment",
                      font.size = 10) +
  scale_fill_gradient(low = "#C7E9C0", high = "#006D2C") +  # 渐变
  theme(axis.text.y = element_text(size = 10))
p_kegg_bar
# KEGG点图
p_kegg_dot <- dotplot(kegg_enrich, 
                      showCategory = 15,
                      title = "KEGG Pathway Enrichment") +
  scale_fill_gradient(low = "#C7E9C0", high = "#006D2C") # 渐变
p_kegg_dot
# KEGG通路图（以最显著的通路为例）
# 2. 加载所需包
library(pathview)
library(gage)
library(KEGGgraph)

View(kegg_enrich@result)
write.csv(kegg_enrich,file = "kegg.csv")

if (nrow(kegg_enrich) > 0) {
  top_kegg <- kegg_enrich$ID[1] #画哪个用对应id
  p_kegg_pathview <- pathview(gene.data = ordered_gene_list,
                              pathway.id = top_kegg,
                              species = "mmu",
                              limit = list(gene = max(abs(ordered_gene_list)), 
                                           cpd = 1),
                              kegg.native = TRUE)
  
  # 注意：pathview会直接保存图像文件到工作目录
}

##############改进go/kegg#########
# 加载必要的包
library(clusterProfiler)
library(org.Mm.eg.db)
library(ggplot2)
library(dplyr)
library(stringr)
library(scales)
library(openxlsx)

# 设置颜色方案
go_colors <- c(BP = '#7f4ea8', CC = '#009eff', MF = '#ffa61d', KEGG = '#1a6840')

# 函数：创建定制化GO/KEGG图表
create_custom_enrich_plot <- function(enrich_result, ontology, color) {
  # 转换结果为数据框
  enrich_df <- as.data.frame(enrich_result)
  
  # 筛选当前本体类型
  if (ontology != "KEGG") {
    enrich_df <- enrich_df %>% 
      filter(ONTOLOGY == ontology) %>% 
      arrange(pvalue) %>% 
      head(15)
  } else {
    enrich_df <- enrich_df %>% 
      arrange(pvalue) %>% 
      head(15)
  }
  
  # 处理GeneRatio
  enrich_df$GeneRatio <- sapply(strsplit(enrich_df$GeneRatio, "/"), 
                                function(x) as.numeric(x[1]) / as.numeric(x[2]))
  
  # 计算负坐标轴范围
  negline <- max(-log10(enrich_df$pvalue)) / 4
  
  # 缩放GeneRatio到负坐标轴
  gr_range <- range(enrich_df$GeneRatio)
  enrich_df$scaled_gr <- scales::rescale(
    enrich_df$GeneRatio, 
    to = c(-negline * 3/4, -negline * 1/4),
    from = gr_range
  )
  
  # 确保描述项有序
  enrich_df$Description <- factor(enrich_df$Description, 
                                  levels = rev(unique(enrich_df$Description)))
  
  # 创建图表
  p <- ggplot(enrich_df) +
    # 添加路径线
    geom_path(aes(x = scaled_gr, y = Description, group = 1),
              color = "gray40", 
              linewidth = 0.8,
              lineend = "round") +
    
    # 添加点（代表基因数量）
    geom_point(aes(x = scaled_gr, y = Description, size = Count),
               color = color) +
    
    # 添加条形图（代表-log10(pvalue)）
    geom_bar(aes(x = -log10(pvalue), y = Description),
             stat = "identity",
             fill = paste0(color, '50'),
             width = 0.8,
             position = position_nudge(y = 0.2)) +
    
    # 添加文本标签
    geom_text(
      aes(x = 0.05, y = Description, label = str_wrap(Description, width = 40)),
      hjust = 0, vjust = 1, size = 4.5, lineheight = 0.8, 
      nudge_y = 0.35, color = "black"
    ) +
    
    # 坐标轴设置
    scale_x_continuous(
      name = 'GeneRatio and -Log10(pvalue)',
      limits = c(-negline, max(-log10(enrich_df$pvalue)) * 1.01),
      expand = c(0, 0)
    ) +
    
    # 点大小设置
    scale_size_continuous(
      name = "Gene Count",
      range = c(3, 6)) +
    
    # 主题设置
    theme_minimal() +
    theme(
      axis.text.y = element_blank(),
      axis.text.x = element_text(color = "black", size = 12),
      axis.title = element_text(color = "black", size = 12), 
      axis.title.y = element_blank(),
      axis.line.x = element_line(color = "black", linewidth = 0.8),
      axis.ticks.x = element_line(color = "black"),
      panel.border = element_rect(color = "black", fill = NA, linewidth = 1),
      panel.grid = element_blank(),
      plot.margin = margin(10, 10, 10, 10),
      legend.position = "bottom",
      legend.text = element_text(color = "black", size = 13), 
      plot.title = element_text(size = 14, face = "bold", hjust = 0.5)
    ) +
    
    # 添加标题
    ggtitle(paste0(ontology, " Enrichment"))
  
  return(p)
}

# 1. 准备基因列表 (使用您之前定义的gene_list)
# 确保gene_list是一个排序的命名向量，如：
# gene_list <- c(基因名 = log2FC, ...)
# 示例: gene_list <- setNames(degs$avg_log2FC, degs$gene)

# 2. 执行GO富集分析 (所有本体)
go_enrich_all <- enrichGO(
  gene = names(gene_list),
  OrgDb = org.Mm.eg.db,
  keyType = "SYMBOL",
  ont = "ALL",
  pvalueCutoff = 0.05,
  pAdjustMethod = "BH",
  qvalueCutoff = 0.2,
  readable = TRUE
)

# 3. 执行KEGG富集分析
# 首先转换基因名为Entrez ID
entrez_ids <- bitr(names(gene_list), fromType = "SYMBOL", 
                   toType = "ENTREZID", OrgDb = org.Mm.eg.db)
ordered_gene_list <- gene_list[entrez_ids$SYMBOL]
names(ordered_gene_list) <- entrez_ids$ENTREZID
ordered_gene_list <- sort(ordered_gene_list, decreasing = TRUE)

kegg_enrich <- enrichKEGG(
  gene = names(ordered_gene_list),
  organism = "mmu",
  keyType = "kegg",
  pvalueCutoff = 0.05,
  pAdjustMethod = "BH",
  qvalueCutoff = 0.2
)
kegg_enrich <- setReadable(kegg_enrich, OrgDb = org.Mm.eg.db, keyType = "ENTREZID")

# 4. 创建图表
p_bp <- create_custom_enrich_plot(go_enrich_all, "BP", go_colors["BP"])
p_cc <- create_custom_enrich_plot(go_enrich_all, "CC", go_colors["CC"])
p_mf <- create_custom_enrich_plot(go_enrich_all, "MF", go_colors["MF"])
p_kegg <- create_custom_enrich_plot(kegg_enrich, "KEGG", go_colors["KEGG"])

# 5. 显示并保存图表
# 显示
print(p_bp)
print(p_cc)
print(p_mf)
print(p_kegg)

# 保存为PDF
ggsave("GO_BP_enrichment.pdf", p_bp, width = 8, height = 6)
ggsave("GO_CC_enrichment.pdf", p_cc, width = 8, height = 6)
ggsave("GO_MF_enrichment.pdf", p_mf, width = 8, height = 6)
ggsave("KEGG_enrichment.pdf", p_kegg, width = 8, height = 6)

# 6. 组合图表 (可选)
library(patchwork)
combined_plot <- (p_bp + p_cc) / (p_mf + p_kegg) +
  plot_annotation(tag_levels = 'A') &
  theme(plot.tag = element_text(size = 16, face = "bold"))

ggsave("combined_enrichment_plots.pdf", combined_plot, width = 16, height = 12)



##################################



##############GSEA富集分析
################################# GSEA富集分析 #########################################
# 使用已准备好的微胶质细胞差异基因数据
# gene_list 和 ordered_gene_list 已存在

# 1. 读取自定义基因集（使用您提供的路径）
gmt_file <- "C:/Users/28527/Desktop/sc-Code/scRNA-fuji-code/GSEA/MsigDB/mouse/m5.all.v2024.1.Mm.symbols.gmt"
custom_geneset <- read.gmt(gmt_file)

# 2. GSEA计算（使用基因符号，保持与您代码一致）
egmt <- GSEA(
  geneList = gene_list,  # 使用基因符号命名的列表
  TERM2GENE = custom_geneset,
  minGSSize = 1,          # 最小基因集大小
  pvalueCutoff = 0.5,      # p值阈值
  verbose = TRUE           # 显示进度信息
)

# 3. 保存GSEA结果
write.table(egmt@result, "microglia_GSEA_results.xls", sep = "\t", quote = FALSE)

# 4. 可视化GSEA结果
if (nrow(egmt@result) > 0) {
  # 4.1 绘制前2个最显著通路的GSEA图
  p_gsea_top2 <- gseaplot2(egmt, geneSetID = c(1, 2), pvalue_table = TRUE)
  
  # 4.2 绘制最显著通路的详细GSEA图
  p_gsea_top1 <- gseaplot2(egmt, geneSetID = 1, pvalue_table = FALSE)
  
  # 4.3 保存图像
  ggsave("microglia_GSEA_top2_pathways.png", p_gsea_top2, width = 10, height = 8, dpi = 300)
  ggsave("microglia_GSEA_top_pathway.png", p_gsea_top1, width = 8, height = 6, dpi = 300)
  
  # 4.4 显示图像
  print(p_gsea_top2)
  print(p_gsea_top1)
} else {
  message("没有显著的GSEA结果")
}

pp <- gseaplot2(egmt, "GOBP_MRNA_CATABOLIC_PROCESS",
               title = "GOBP_MRNA_CATABOLIC_PROCESS",
               pvalue_table = T,color = "red")
pp

#################################富集分析#########################################

#############二次分群###############################################
############取出一部分cluster用来亚分群
# 提取指定分组的小胶质细胞亚群
sub_merged1 <- subset(
  merged1,
  idents = "Neural stem cells",  # 选择目标细胞簇
  subset = orig.ident %in% c("MCAO")  #"Control", "TBI-24h", "TBI-7d" 按分组过滤
)



DimPlot(sub_merged1, reduction = "tsne",label = TRUE, pt.size = 1.5)

##########对取出的cluster重新进行分群
sub_merged1 <- FindVariableFeatures(sub_merged1, selection.method = "vst", nfeatures = 2000)

all.genes <- rownames(sub_merged1)
sub_merged1 <- ScaleData(sub_merged1, features = all.genes)

sub_merged1 <- RunPCA(sub_merged1, features = VariableFeatures(object = sub_merged1))

ElbowPlot(sub_merged1, ndims = 50)

sub_merged1 <- FindNeighbors(sub_merged1, dims = 1:10)

sub_merged1 <- FindClusters(sub_merged1, resolution = 0.4)

#sub_merged1 <- RunTSNE(sub_merged1, dims = 1:10)

#DimPlot(sub_merged1, reduction = "tsne",label = TRUE, pt.size = 1.5,cols= cns_colors)

sub_merged1 <- RunUMAP(sub_merged1, dims = 1:10)
#####二次分群可视化
# sub_merged1<- readRDS("C:/Users/28527/Desktop/MCAO/result/mcao_NSCs_celltype.rds")

saveRDS(sub_merged1, file = "C:/Users/28527/Desktop/MCAO/result/mcao_NSCs_celltype.rds")
###################################可视化降维图
#1. 基础UMAP可视化（按细胞类型着色）
DimPlot(sub_merged1, reduction = "umap",label = TRUE, pt.size = 1.5,cols= cns_colors)

sub_merged1 <- RunTSNE(sub_merged1, dims = 1:10)
DimPlot(sub_merged1, reduction = "tsne",label = TRUE, pt.size = 1.5,cols= cns_colors)
        
################## SCP可视化
library(SCP)
CellDimPlot(sub_merged1,group.by = "seurat_clusters", reduction = "UMAP" , theme_use = "theme_blank",pt.size = 0.8,cols= cns_colors) 
CellDimPlot(sub_merged1,group.by = "seurat_clusters", reduction = "UMAP",pt.size = 0.8,cols= cns_colors)

######################scCustomize可视化
library(viridis)
library(Seurat)
library(scCustomize)
FeaturePlot_scCustom(seurat_object = sub_merged1, features = c("Neurog1","Dcx","Bdnf","Ascl1"), order = F,pt.size = 1,
                     label = TRUE,label.size = 4,label.color = "black")



FeaturePlot_scCustom(seurat_object = sub_merged1, features = c("Stat3", "Smad5", "Nfia","Sox9"), order = F,pt.size = 1,
                     label = TRUE,label.size = 4,label.color = "black")

FeaturePlot_scCustom(seurat_object = sub_merged1, features = c("Nfe2l2"), order = F,pt.size = 1,
                     label = TRUE,label.size = 4,label.color = "black")


#使用Seurat原生函数分组绘制
FeaturePlot(
  sub_merged1,
  reduction = "tsne",
  features = c("Neurog1","Dcx","Bdnf","Ascl1"),
  order = FALSE,
  pt.size = 0.8,
  label = TRUE,label.size = 4,label.color = "black",
  cols = c("lightgrey", "#FF0000")  # 低表达到高表达的颜色
) 

FeaturePlot(
  sub_merged1,
  reduction = "tsne",
  features = c("Stat3", "Smad5", "Nfia","Sox9"),
  order = FALSE,
  pt.size = 0.8,
  label = TRUE,label.size = 4,label.color = "black",
  cols = c("lightgrey", "#FF0000")  # 低表达到高表达的颜色
) 


####################################二次分群降维可视化

###########对二次分群注释
###小鼠
DotPlot(sub_merged1, features = c("TMEM119","P2ry12","Cx3cr1","Hexb","Selplg","Cd162","Siglech" #稳态MG
                                  ,"Cd86","Cd32","Fcgr2b","H2-aa","H2-ab1","Nos2","Il1b","Tnf","Stat1","Irf5"#M1
                                  ,"Mrc1","Arg1","Ym1","Chi3l3","Il10","Tgfb1","Fizz1","Retnla" #M2
),cols = c("blue", "red"))+RotatedAxis()

###人
#DotPlot(sub_merged1, features = c("TMEM119","P2RY12","CX3CR1","HEXB","SELPLG","CD162","SIGLEC1" #稳态MG (Cd162/SELPLG需验证)
#                               ,"CD86","FCGR2A","FCGR2B","HLA-DRA","HLA-DQB1","NOS2","IL1B","TNF","STAT1","IRF5" #M1 (Cd32→FCGR2A, H2-aa→HLA-DRA, H2-ab1→HLA-DQB1)
#                               ,"MRC1","ARG1","YM1","CHI3L1","IL10","TGFB1","RETNLB","RETN" #M2 (Ym1/Chi3l3→CHI3L1, Fizz1→RETNLB, Retnla→RETN)
#                               ,"MKI67","TOP2A","PCNA","CENPF" #增殖性MG
#), cols = c("blue", "red")) + RotatedAxis()

##每个二次分群cluster按照marker规定细胞类型
new.cluster.ids2 <- c("M2" #0
                      , "M2" #1
                      , "M1" #2
                      , "homeostasis-MG" #3
                      , "Homeostasis-MG" #4
                      ,"M1" #5
                      ,"Proliferative-MG" #6
                      ,"Proliferative-MG" #7
                      ,"M1" #8
)
names(new.cluster.ids2) <- levels(sub_merged1)
sub_merged1 <- RenameIdents(sub_merged1, new.cluster.ids2)
DimPlot(sub_merged1, reduction = "umap", label = TRUE, pt.size = 0.5) + NoLegend()

library(ggplot2)
plot <- DimPlot(sub_merged1, reduction = "umap", label = TRUE, label.size = 4.5) + xlab("UMAP 1") + ylab("UMAP 2") +theme(axis.title = element_text(size = 18), legend.text = element_text(size = 18)) + guides(colour = guide_legend(override.aes = list(size = 10)))
plot 
ggsave(filename = "G:/danxibao/ziliao/scRNA-code/test/pbmc3k_umap.jpg", height = 7, width = 12, plot = plot, quality = 50)

write.table(Idents(sub_merged1),"G:/danxibao/ziliao/scRNA-code/test/cell-type.xls",sep="\t",quote = F)

##存储细胞归类结果
saveRDS(sub_merged1, file = "C:/Users/28527/Desktop/scresult/2/pbmc3k_final.rds")

#############二次分群###############################################
##存储细胞归类结果

# 提取各组数据 ----
control_data <- subset(merged1, orig.ident == "Control")
tbi_24h_data <- subset(merged1, orig.ident == "TBI-24h")
tbi_7d_data <- subset(merged1, orig.ident == "TBI-7d")

saveRDS(control_data, file = "C:/Users/28527/Desktop/result-TBI/merged1_control_data_final.rds")
saveRDS(tbi_24h_data, file = "C:/Users/28527/Desktop/result-TBI/merged1_tbi_24h_data_final.rds")
saveRDS(sub_merged1, file = "C:/Users/28527/Desktop/MCAO/result/mcao_NSCs_celltype.rds")


#提取指定组的指定细胞子集
#用于scTenifoldKnk单细胞虚拟敲除
tbi_24h_data <- readRDS("C:/Users/28527/Desktop/result-TBI/merged1_tbi_24h_data_final.rds")
tbi_24h_data_Microglial_cells_1 <- subset(tbi_24h_data, cell_type == "Microglial cells 1")
saveRDS(tbi_24h_data_Microglial_cells_1, file = "C:/Users/28527/Desktop/result-TBI/tbi_24h_data_Microglial_cells_1_final.rds")


