pheatmap, gplots heatmap.2和ggplot2 geom_tile实现数据聚类和热图plot

本文详细介绍使用R语言中的pheatmap、ggplot2及gplots包绘制热图的方法。包括数据预处理、矩阵构建、不同包下的热图绘制流程及参数设置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要步骤

pheatmap
  • 数据处理成矩阵形式,给行名列名
  • 用pheatmap画热图(pheatmap函数内部用hclustfun 进行聚类)
ggplot2
  • 数据处理成矩阵形式,给行名列名
  • hclust聚类,改变矩阵行列顺序为聚类后的顺序
  • melt数据,处理成ggplot2能够直接处理的数据结构,并加上列名
  • ggplot_tile进行画图
gplots
  • 数据处理成矩阵形式,给行名列名
  • 调制颜色并用heatmap.2画热图(heatmap.2函数内部用hclustfun 进行聚类)

R语言代码

library(pheatmap)
library(data.table)
CN_DT <- fread("/home/ywliao/project/Gengyan/ONCOCNV_result/ONCOCNV_all_result.txt",sep="\t")
dt <- CN_DT[cfDNATime=="cfDNA1"]
wdt <- dcast(dt,Gene~Sample,value.var = "CN",fun.aggregate = mean)
data <- as.matrix(wdt[,2:length(wdt),with=F])  #数据矩阵
rownames(data) <- unlist(wdt[,1]) 

pheatmap(data)
library(ggplot2) 
library(data.table)
CN_DT <- fread("/home/ywliao/project/Gengyan/ONCOCNV_result/ONCOCNV_all_result.txt",sep="\t")
dt <- CN_DT[cfDNATime=="cfDNA1"]
wdt <- dcast(dt,Gene~Sample,value.var = "CN",fun.aggregate = mean)
data <- as.matrix(wdt[,2:length(wdt),with=F])  #数据矩阵
rownames(data) <- unlist(wdt[,1]) 

hc<-hclust(dist(data),method = "average") #对行进行聚类
rowInd<-hc$order #将聚类后行的顺序存为rowInd
hc<-hclust(dist(t(data)),method = "average")  #对矩阵进行转置,对原本的列进行聚类
colInd<-hc$order  #将聚类后列的顺序存为colInd
data<-data[rowInd,colInd] #将数据按照聚类结果重排行和列
dp=melt(data)    #对数据进行融合,适应ggplot的数据结构,以进行热图的绘制
colnames(dp) <- c("Gene","Sample","Value")
p <- ggplot(dp, aes(Sample,Gene)) + geom_tile(aes(fill = as.factor(Value)))+theme(axis.text.x=element_text(angle = 90))+ guides(fill = guide_legend(title = "Copy Number")) + scale_fill_brewer(palette = 3)
p

1093203-20170621194326070-1175872185.png
1093203-20170622074744695-949614961.png

library(gplots)
library(data.table)
CN_DT <- fread("/home/ywliao/project/Gengyan/ONCOCNV_result/ONCOCNV_all_result.txt",sep="\t")
dt <- CN_DT[cfDNATime=="cfDNA1"]
wdt <- dcast(dt,Gene~Sample,value.var = "CN",fun.aggregate = mean)
dp <- as.matrix(wdt[,2:length(wdt),with=F])  #数据矩阵

labrow <- unlist(wdt[,1,with=F]) #行名
colorsChoice<- colorRampPalette(c("green","black","red"))  #调制颜色

heatmap.2(dp,labRow = labrow,col=colorsChoice(5),breaks = c(1,1.5,2,2.5,3,4),density.info="histogram",
          hclustfun = function(c)hclust(c,method="average"),keysize = 1.5, cexRow=0.5,trace = "none");

1093203-20170621194335835-1855297498.png

转载于:https://www.cnblogs.com/ywliao/p/7061418.html

####设置随机数种子 使结果可重复#### set.seed(12345) library(Seurat) library(tidyverse) library(magrittr) library(RColorBrewer) library(reshape2) library(Biobase) library(ggsci) library(ggpubr) library(data.table) library(monocle) library(Matrix) library(writexl) 读取.rds文件 setwd(“D:/document/1_scRNA/4_monocle/1_ec”) scRNA_harmony <- readRDS(“D:/document/1_scRNA/4_monocle/maker气泡/scRNA_harmony.rds”) #分类 new.cluster.ids <- c(“0”= “EC”, “1”= “MC”, “2”= “VC”, “3”= “MC”, “4”= “EC”, “5”= “PC”, “6”= “UN”, “7”= “MC”, “8”= “VC”, “9”= “PC”, “10”= “MC”, “11”= “PC”, “12”= “VC”, “13”= “TRI”, “14”= “VC”) 将新的细胞类型标签存储到 meta.data 中 scRNA_harmony@meta.data$celltype <- new.cluster.ids[as.character(Idents(scRNA_harmony))] 绘制 UMAP ,使用新的细胞类型标签 DimPlot(scRNA_harmony, reduction = “umap”, group.by = “celltype”, label = TRUE, label.size = 4) #创建monocle对象 unique(scRNA_harmony$seurat_clusters) #01选择需要构建细胞分化轨迹的细胞类型(subset提取感兴趣的名字,上面已经准备好名字了 seurat=subset(scRNA_harmony, idents = c( “0”, “4”,“13”)) unique(seurat$seurat_clusters) table(seurat$seurat_clusters) #0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #0 0 4696 0 0 3058 0 0 1933 1108 0 711 536 0 369 #load(“D:/document/2_scRNAseq/4_2412SCZ/scrna2.RData”) #SCT是标准化后的数据,RNA是原始数据 #load(“D:/document/2_scRNAseq/1_SC/BMC_KW_monocle_over.RData”) #02构建monocle独有的celldata对象 expr_matrix=seurat@assays$SCT@counts#使用counts表达值(第一个准备文件:基因count矩阵) ####转换为稀疏矩阵#### 如果 expr_matrix 是稠密矩阵(dense matrix),转换为稀疏矩阵 if (!is(expr_matrix, “sparseMatrix”)) { expr_matrix <- as(expr_matrix, “dgCMatrix”) } sample_sheet <- seurat@meta.data#将实验信息赋值新变量(第二个准备文件:细胞表型信息-metadata) #gene_annotation=data.frame(gene_short_name=rownames(seurat))构建一个含有基因名字的数据框 因为默认从RNA中提取细胞信息,所以需要从 SCT assay 中提取基因名 gene_annotation <- data.frame(gene_short_name = rownames(seurat@assays$SCT)) rownames(gene_annotation) <- rownames(seurat@assays$SCT)#(第三个文件:基因名为行名的基因名数据框) pd <- new(“AnnotatedDataFrame”,data= sample_sheet)#将实验信息变量转化为monocel可以接收的对象 fd <- new(“AnnotatedDataFrame”,data=gene_annotation)#将基因注释变量转化为monocle可以接收的对象 cds <- newCellDataSet(expr_matrix, phenoData = pd, featureData = fd,expressionFamily=negbinomial.size())#创建一个monocle的对象 #cds cellData对象,monocle独有 #03相当于归一化Size factors帮助标准化基因在细胞间的差异,"dispersion"值帮助后面的差异表达分析执行。 cds <- estimateSizeFactors(cds) cds <- estimateDispersions(cds) #04数据降维,特征基因的选择 #过滤低表达基因;差异分析获得top1000排序基因(可视化用来排序的基因) ##注意 – differentialGeneTest这一步有些久 cds <- detectGenes(cds,min_expr=0.1)#统计,过滤低表达基因(表达量过滤低表达基因) expressed_genes <- row.names(subset(fData(cds),num_cells_expressed >=10))#(数量过滤低表达基因) diff_celltype <- differentialGeneTest(cds[expressed_genes,], fullModelFormulaStr = “~celltype”,cores=4)#差异分析,cores是处理器核数,电脑带的动可用8或者更大 head(diff_celltype) library (writexl) write_xlsx(diff_celltype, “1_degForCellOrdering.xlsx”) ####1.RData#### save.image(“1.RData”) load(“1.RData”) #选这个 diff_celltype <- diff_celltype[order(diff_celltype$qval),]#将差异基因按照q值进行升序排列 ordering_genes <- row.names(diff_celltype[1:1000,])#选择top1000个显著基因用做后续排序,这里可修改 #ordering_genes <- row.names(diff_celltype[diff_celltype$qval <0.01,]) cds <- setOrderingFilter(cds,ordering_genes = ordering_genes)#设置排序基因 plot_ordering_genes(cds)#可视化用来排序的基因(有着更高的表达离散) ggsave(filename=‘1_monocle2_ordering_gene.pdf’) ####选择高变基因#### #此次选择monocle选择的高变基因 #选择二、使用monocle选择的高变基因 disp_table <- dispersionTable(cds) disp.genes <- subset(disp_table, mean_expression >= 0.1 & dispersion_empirical >= 1 * dispersion_fit)$gene_id cds <- setOrderingFilter(cds, disp.genes) plot_ordering_genes(cds)#以上是选择monocle选择的高变基因进行轨迹构建,上述为高变基因计算方法,monocle在选择做轨迹的基因上共提供四种方法 ##使用clusters差异表达基因 library(readxl) diff.genes <- read_excel(‘D:/document/1_scRNA/scRNA_harmony.markers.xlsx’) diff.genes <- subset(diff.genes,p_val_adj<0.01)$gene cds <- setOrderingFilter(cds, diff.genes) p1 <- plot_ordering_genes(cds) p1 ##使用seurat选择的高变基因 var.genes <- VariableFeatures(scRNA_harmony) cds <- setOrderingFilter(cds, var.genes) p2 <- plot_ordering_genes(cds) p2 ##使用monocle选择的高变基因 disp_table <- dispersionTable(cds) disp.genes <- subset(disp_table, mean_expression >= 0.1 & dispersion_empirical >= 1 * dispersion_fit)$gene_id cds <- setOrderingFilter(cds, disp.genes) p3 <- plot_ordering_genes(cds) p3 ##结果对比 p1|p2|p3 library(cowplot) combined_plot <- plot_grid(p1, p2, p3, ncol = 3) ggsave(“2_combined_plot.pdf”, combined_plot, width = 15, height = 5) #数据量过大,降维选择稀疏矩阵,但似乎本来就是稀疏矩阵 cds <- reduceDimension(cds, method=‘DDRTree’)#降维 cds <- orderCells(cds)#排序 ##如果这里报错,先保存数据 #保存所有对象到my_workspace.RData save.image(file = “01_orderCells_cds.RData”) load(file = “01_orderCells_cds.RData”) #降级 igraph 包到一个 Monocle 兼容的版本 #原来的包无法覆盖时可手动删除D:\software\R-4.4.0\library\igraph #install.packages(“remotes”) #remotes::install_version(“igraph”, version = “2.0.2”) ##install.packages(“C:/Users/19086/Desktop/maker气泡/igraph_2.0.3.tar.gz”, repos = NULL, type = “source”) #可视化鉴定的State p1=plot_cell_trajectory(cds, color_by=“State”)+ theme(text=element_text(size= 18)) #设置字体大小为 18 p1 ggsave(p1,filename =‘2_monocle2_state_trajectory_p1.pdf’, width =12, height = 9) #可视化细胞类型 p2=plot_cell_trajectory(cds, color_by=“seurat_clusters”)+ theme(text= element_text(size=18)) #设置字体大小为 18 p2 ggsave(p2, filename = ‘3_monocle2_celltype_trajectory_p2.pdf’, width =12, height = 9) #保存排序所需要的拟时间值细胞state值 #按发育时间分类画轨迹,可以state的对应上 p3=plot_cell_trajectory(cds, color_by =“Pseudotime”)+ theme(text= element_text(size=18))#设置字体大小为 18 p3 ggsave(p3,filename =‘4_monocle2_Pseudotime_p3.pdf’, width =12, height = 9) #因为monocle包并不会自动设置分化起点,若发现有悖于生物学常识,则需要手动设置分化起点 #指定细胞分化轨迹的起始点,即设置root cell。 #自定义了一个名为GM_state的函数,函数主要计算包含特定类型细胞最多的state,并返回state练 #即特定细胞类型最多的state为指定起点 GM_state <- function(cds){ if (length(unique(pData(cds)$State)) > 1){ T0_counts <- table(pData(cds)$State, pData(cds)$seurat_clusters)[, “0”] return(as.numeric(names(T0_counts) [which(T0_counts == max(T0_counts))])) } else {return (1)}} #指定起点后,绘制细胞伪时间轨迹分支 p4=plot_cell_trajectory(cds,color_by=“Pseudotime”)#按pseudotime(伪时间)来可视化细 p4 ggsave(p4, filename = ‘5_monocle2_Pseudotime_p4.pdf’, width =12, height = 9) plot_cell_trajectory(cds,color_by=“state”)+facet_wrap(“~State”,nrow=1) #可以用ggsci配色,也可以使用scale_color_manual()自己设置颜色 library(ggsci) p5=plot_cell_trajectory(cds, color_by = “sample”) + scale_color_npg() p6=plot_cell_trajectory(cds, color_by = “State”) + scale_color_nejm() colour = c( “#E64B35”, # 红色 “#4DBBD5”, # 蓝色 “#00A087”, # 绿色 “#3C5488”, # 深蓝色 “#F39B7F”, # 橙色 “#8491B4”, # 灰色 “#91D1C2”, # 浅绿色 “#DC0000”, # 深红色 “#7E6148”, # 棕色 “#B09C85”, # 浅棕色 “#FF7F0E”, # 橙色 “#1F77B4”, # 蓝色 “#2CA02C”, # 绿色 “#D62728”, # 红色 “#9467BD”, # 紫色 “#8C564B” # 棕色 ) p7=plot_cell_trajectory(cds, color_by = “seurat_clusters”) + scale_color_manual(values = colour) p5 p6 p7 ggsave(“5_seurat_clusters.png”, plot = p5, width = 8, height = 6, dpi = 300) ggsave(“6_state.png”, plot = p6, width = 8, height = 6, dpi = 300) ggsave(“7_seurat_clusters.png”, plot = p7, width = 8, height = 6, dpi = 300) p8 <- plot_cell_trajectory(cds, x = 1, y = 2, color_by = “seurat_clusters”) + theme(legend.position=‘none’,panel.border = element_blank()) + #去掉第一个的legend scale_color_manual(values = colour) p9 <- plot_complex_cell_trajectory(cds, x = 1, y = 2, color_by = “seurat_clusters”)+ scale_color_manual(values = colour) + theme(legend.title = element_blank()) p8 p9 ggsave(“8_State1_tree.png”, plot = p8, width = 8, height = 6, dpi = 300) ggsave(“9_state2_tree.png”, plot = p9, width = 8, height = 6, dpi = 300) library(ggpubr) df <- pData(cds) pData(cds)取出的是cds对象中cds@phenoData@data的内容 View(df) p <- ggplot(df, aes(Pseudotime, colour = sample, fill = sample)) + geom_density(bw = 0.5, size = 1, alpha = 0.5) + theme_classic2() p ggsave(“10_density_plot_sample.png”, plot = p, width = 10, height = 6, dpi = 300) #指定起点后,绘制细胞伪时间轨迹分支 p10=plot_cell_trajectory(cds, color_by=“Pseudotime”)#按pseudotime(伪时间)来可视化细胞分化轨迹 p10 ggsave(p10, filename = ‘10_monocle2_Pseudotime.pdf’, width = 12, height = 9) plot_cell_trajectory(cds, color_by =“State”)+ facet_wrap(~seurat_clusters,nrow=2)#facet_wrap函数可以把每个state单独highlight ggsave(filename = ‘11_monocle2_divid_seurat_clusters.pdf’) #按celltype分类画轨迹,并按分支点分类,每个celltype的细胞分别标出 p11=plot_cell_trajectory(cds, color_by = “group”)+ facet_wrap(~sample, nrow =5) + theme(text =element_text(size=25)) # 18 p11 ggsave(p11, file=‘12_monocle2_seurat_clusters分开_group.pdf’, width = 12, height = 18) save.image(“out1.RData”) library (writexl) #鉴定伪时间相关的基因,即分化过程(state)相关的差异基因,“expressed_genes [1: 1000], ”中把[1:1000]删了就是所有基因 diff_test_res=differentialGeneTest(cds[expressed_genes, ], fullModelFormulaStr = “~sm.ns(Pseudotime)”,cores=2)#鉴定伪时间相关的基因,即分化过程相关 cores = num_cores 使用可用核心数 write_xlsx(diff_test_res, “01_diff_test_res.xlsx”) 注意可以将top5g改成任何自身感兴趣的基因,进行可视化 top100g=rownames(diff_test_res[order(diff_test_res$qval),])[1:100] # top 100个显著基因 plot_genes_in_pseudotime(cds[top100g,], color_by=“orig.ident”,ncol=1)+ # top 5个显著基因,可视化,pseudotime为横坐标 #orig.ident/celltype/seurat_clusters theme(text = element_text(size= 15))#设置字体大小为 15 ggsave(filename = ‘13_monocle_top5_significant_gene.pdf’) top100g_df <- data.frame(Gene = top100g) write_xlsx(top100g_df, “02_monocle_deg_top100.xlsx”) library(viridis) #伪时间基因排序 diff_test_res = diff_test_res[order(diff_test_res$qval),] diff_test_res = diff_test_res[1:20,] 绘制并保存为 PDF plot_pseudotime_heatmap(cds[rownames(diff_test_res),], # 挑选的20个计算了分化差异的基因 num_clusters = 4, # 指定聚类数 cores = 2, # 指定线程数 show_rownames = T) # 显示行名 ggsave(filename = ‘14_monocle2_gene_pheatmap.pdf’) # 保存为 PDF 使用自定义颜色绘制并保存为 TIFF plot_pseudotime_heatmap(cds[rownames(diff_test_res),], num_clusters = 4, cores = 1, show_rownames = T, hmcols = colorRampPalette(viridis(4))(1000)) # 使用 viridis 配色 ggsave(filename = ‘15_monocle2_5_gene_pheatmap.tiff’, # 保存为 TIFF device = “tiff”, # 指定设备为 TIFF dpi = 300, # 设置分辨率 width = 8, # 设置宽度 height = 6) # 设置高度 save.image(“out3_monocle_diff.RData”) load(“out3_monocle_diff.RData”) ####分支#### #分支比较后,分支依赖基因的鉴定(重现) #基因簇按照自身需求,设置;形上侧显示两个分支(朝不同方向分化),“expressed_genes [1: 1000], ”中把[1:1000]删了就是所有基因;branch_point有几个分支节点就填几 使用所有表达的基因,移除[1:1000]的限制 BEAM_res <- BEAM(cds[expressed_genes,], branch_point=2, cores=4, progenitor_method=“duplicate”)#分支依赖基因鉴定 BEAM_res = BEAM_res [order(diff_test_res$qval),] #BEAM_res = BEAM_res [1:200,] #?BEAM #鉴定分支依赖的基因 plot_genes_branched_heatmap(cds [rownames(BEAM_res), ], branch_point= 2, num_clusters= 3, cores=1, use_gene_short_name= T, show_rownames= T)#绘制分支 使用所有表达的基因,移除[1:1000]的限制 BEAM1_res <- BEAM(cds[expressed_genes,], branch_point=1, cores=4, progenitor_method=“duplicate”)#分支依赖基因鉴定 BEAM1_res = BEAM_res [order(diff_test_res$qval),] #BEAM_res = BEAM_res [1:200,] #?BEAM #鉴定分支依赖的基因 plot_genes_branched_heatmap(cds [rownames(BEAM1_res), ], branch_point= 1, num_clusters= 3, cores=1, use_gene_short_name= T, show_rownames= T)#绘制分支 ggsave(“branched2_heatmap.jpg”, p20, width = 8, height = 6) save.image(“out.RData”) load(“D:/document/1_scRNA/4_monocle/1_ec/out.RData”) 怎么看不同state中我想关注的许多基因在不同group中的表达情况
最新发布
06-06
library(tidyverse) #tidyverse包是一个包含了dplyr、ggplot2、tibble等包的集合包,在library(tidyverse)时就可以看到一并被加载的包以及其他包有冲突的函数。比起base R的函数使用理念,使用tidyverse包进行数据处理数据可视化会更加简洁、清晰易懂、富有逻辑性。 #的输入是一个数值型矩阵 test = matrix(rnorm(200), 20, 10) #创建一个随机数矩阵 test test[1:10, seq(1, 10, 2)] = test[1:10, seq(1, 10, 2)] + 3 #将矩阵test的1-10行,第1、3、5、7、9列的元素都增加3 test test[11:20, seq(2, 10, 2)] = test[11:20, seq(2, 10, 2)] + 2 test[15:20, seq(2, 10, 2)] = test[15:20, seq(2, 10, 2)] + 4 colnames(test) = paste("Test", 1:10, sep = "") #命名列名Test1——Test10 rownames(test) = paste("Gene", 1:20, sep = "") #命名行名Gene1——Gene20 test yclust <- hclust(dist(test)) #计算基于矩阵test行的距离关系进行的层次聚类的结果 yclust #hclust函数是R语言中用于实现层次聚类的函数。它属于stats包,可以根据距离矩阵进行层次聚类分析。层次聚类是一种基于簇间相似度在不同层次上分析数据的方法,形成树形的聚类结构。 xclust <- hclust(dist(t(test))) #计算基于矩阵test列的距离关系进行的层次聚类的结果 xclust install.packages("ggdendro",lib = "F:/R") library("ggdendro",lib = "F:/R") #谱系(Dendrogram)是一种用于展示层次结构的形表示方法。在R语言中,可以使用ggdendro包来绘制美观且高度可定制的谱系。 library(magrittr) # 管道操作 library(tibble) # rownames_to_column library(tidyr) # pivot_longer install.packages("ggplot2",lib="F:/R") library("ggplot2",lib="F:/R") #ggplot2是一款强大的形可视化R包,其作方式易于理解,且生成的形精美,定制化程度也很高,应该是R里面最流行的可视化工具。 p = test%>% #转化矩阵为数据框 as.data.frame() %>% #将行名添加为一列 rownames_to_column() %>% #将数据从宽格式转换为长格式,其中每一行包含一个样本对应的基因表达值 pivot_longer(cols = 2:ncol(.), #pivot_longer是R语言tidyr包中的一个核心函数,用于将数据从“宽格式”转换为“长格式”(也称为“熔化”数据)。宽格式数据的特点是观测值分布在多个列中(例如时间点或不同样本),而长格式数据将每个观测值整理成单独的行,便于后续分析可视化。 names_to = "sample", #cols = 2:ncol(.)表示从第二列开始到最后一列(ncol(.)获取当前数据框的总列数;names_to = 'sample'表示创建一个名为sample的新列,其中包含原列名(如“Sample1”、“Sample2”等) values_to = "exp") %>% #values_to = 'exp'表示创建一个名为exp的新列,其中包含原列的值。 #以下开始使用ggplot2进行绘 #首先ggplot()函数初始化一个绘对象,aes()指定了x轴y轴的变量 ggplot(aes(x = sample,y = rowname))+ #geom_tile()函数绘制瓷砖,fill = exp指定了根据基因表达值来填充颜色 geom_tile(aes(fill = exp))+ #设定填充颜色的渐变,包括中点颜色、低值颜色高值颜色。 scale_fill_gradient2(midpoint = 2.5, low = '#2fa1dd', mid="white", high = '#f87669') + #将基于聚类结果yclust绘制的行的树形添加到中。 scale_y_dendrogram(hclust=yclust) + #scale_y_dendrogram 属于ggdendro包,专用于树状的y轴标度调整 #将基于聚类结果xclust绘制的列的树形添加到中。 scale_x_dendrogram(hclust=xclust,position = 'top') + #在ggplot2扩展包ggdendro中,scale_x_dendrogram()函数用于将hclust聚类结果转换为的树状坐标轴,特别适用于结合绘制聚类结果。 #设设定形的主题,包括隐藏网格线、更改背景颜色等 theme(panel.grid = element_blank(), #隐藏网格线 axis.line = element_blank(), #隐藏坐标轴线 axis.ticks = element_blank(), #隐藏坐标轴刻度线 axis.title = element_blank(), #隐藏坐标轴标题 panel.background = element_rect(fill = NA), #去除面板的背景颜色 legend.background = element_rect(fill = NA), #去除例的背景颜色 plot.background = element_rect(fill = NA),) #去除绘区域的背景颜色 p
06-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值