热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

学习1010种热图绘制方法

转载自Epigenetics表观遗传学,略有修改和补充。题目有感于德国天才数学家莱布尼兹对二进制的阐述,和其传教士好友布维对易经等汉学的传播。有兴趣的可

转载自Epigenetics表观遗传学,略有修改和补充。

题目有感于德国天才数学家莱布尼兹对二进制的阐述,和其传教士好友布维对易经等汉学的传播。有兴趣的可以阅读莱布尼兹文章英文版:http://www.leibniz-translations.com/binary.htm (二进制和伏羲八卦)

In [3]: a = int('1010', 2)In [4]: a
Out[4]: 10                                             想学Python的可以约起In [5]: bin(10)
Out[5]: '0b1010'In [7]: bin (16)
Out[7]: '0b10000'

什么是 R 语言?R 语言,一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。我之所以学 R 语言,一方面是希望能够利用 R 语言将原始数据转化为可放入论文中的精美图形,另一方面,大数据时代已经到来,每个人都应该懂一些大数据的处理手段,R 语言可以胜任。R 语言下载地址为:https://cran.r-project.org/,通常我们使用页面更加优雅的 RStudio,下载地址为:https://www.rstudio.com/。学习R可参考之前发布的帖子 R语言学习 - 入门环境Rstudio,R语言学习 - 基础概念和矩阵操作和在R中赞扬下努力工作的你,奖励一份CheetShet。

可以把 R 语言理解为一款性能强大的软件,R 里面有很多可处理纷繁复杂任务的包(packages),包里面又有若干执行具体功能的函数(functions),而每一个函数里面又有大量可调节的参数(parameters)。R 语言是开源的,世界各地的开发者们不断地添砖加瓦,分享自己的智慧,截至到目前,R 里面可用的包达到 11987 个,这几乎让 R 语言强大到不可思议。值得注意的是,开发一个 R 包就可以发表一篇不错的文章了。

什么是热图?热图是矩阵中的数值以颜色来显示的图形化表示。热图因其丰富的色彩变化和生动饱满的信息表达被广泛应用于各种大数据分析场景。之前生信宝典出过三篇文章介绍热图的绘制、美化、简化:R语言学习 - 热图绘制 (heatmap),  R语言学习 - 热图美化,   R语言学习 - 热图简化。另外还有在线绘制工具 最简单漂亮的免费在线生信绘图工具。

R 语言里面可以用来绘制热图的主要包括:

今天将按照这个顺序依次为大家分享它们的绘图方法。

一、基础安装里的 heatmap 函数

所谓基础安装,即下载安装 R 语言后即可使用的包。

heatmap 的使用格式如下:

heatmap(x, Rowv = NULL, Colv = if(symm)"Rowv" else NULL,distfun = dist, hclustfun = hclust,reorderfun = function(d, w) reorder(d, w),add.expr, symm = FALSE, revC = identical(Colv, "Rowv"),scale = c("row", "column", "none"), na.rm = TRUE,margins = c(5, 5), ColSideColors, RowSideColors,cexRow = 0.2 + 1/log10(nr), cexCol = 0.2 + 1/log10(nc),labRow = NULL, labCol = NULL, main = NULL,xlab = NULL, ylab = NULL,keep.dendro = FALSE, verbose = getOption("verbose"), ...)

其中括号中的都是可调整的参数,初步统计了一下,至少包含 23 项参数,但是每一次绘制热图时,其实只需要部分参数即可完成绘图。参数中比较重要的参数是:

  • x, 需要绘图的矩阵

  • Rowv 决定“行层级聚类树图”是否以及如何被计算和重新排序,其默认值为空;

  • Colv 决定“列层级聚类树图”是否或如何被从排序。如果x是一个对称矩阵(行列数相同),那么 Colv=Rowv表示着列与行的处理方式相同。

  • scale = c("row", "column", "none"),按照行或列进行归一化

  • na.rm = TRUE,移除缺失值

  • 另外,以上没有提到的参数是颜色,可用参数 col=。

以下我们通过一个简单的案例来尝试一下。
Case: 将 50 名 NBA 球星的数据绘制成热图

案例来源:http://flowingdata.com/2010/01/21/how-to-make-a-heatmap-a-quick-and-easy-solution/

#首先要获得数据,直接用read.csv导入具有逗号分隔符的表格
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep&#61;",")
#R语言会保存一个nba的数据框&#xff0c;键入nba&#xff0c;可查看数据框的内容
nba
#将nba这个数据框按照PTS&#xff08;points, 分数&#xff09;由低到高排序&#xff0c;注意nba$PTS后面的逗号是必须的&#xff0c;表示按行排序
nba <- nba[order(nba$PTS),]
#目前导入的数据框默认以数值命名行&#xff0c;重新对行进行命名
row.names(nba) <- nba$Name
#导入第2~20列的数据&#xff0c;并将数据由数据框格式转变为矩阵格式
nba <- nba[,2:20]
nba_matrix <- data.matrix(nba)
#利用heatmap绘图&#xff0c;按列进行标准化&#xff0c;颜色使用cm.colors函数&#xff0c;使用100种颜色
nba_heatmap <- heatmap(nba_matrix, col &#61; cm.colors(100), scale&#61;"column")

注意&#xff1a;&#xff08;1&#xff09;#后面一行的代码都不被执行&#xff0c;因此可以用来做标注&#xff1b;&#xff08;2&#xff09;在数据整理过程中&#xff0c;如果你好奇数据整理后究竟发生了什么变化&#xff0c;只需要键入相应的数据框或矩阵名&#xff0c;比如“nba”或“nba_matrix”&#xff0c;就可以查看变化&#xff1b;&#xff08;3&#xff09;热图绘制时一般输入的是矩阵&#xff0c;而 R 默认的输入格式是数据框&#xff0c;因此需要转化。矩阵和数据框的差异请参照R语言的相关教程。

对于一个热图而言&#xff0c;有三个参数至关重要&#xff1a;1. 用来绘图的矩阵是必须的&#xff1b;2. 热图最令人称赞的就是它绚丽的颜色了&#xff0c;因此颜色参数不可或缺&#xff1b;3. 为了让颜色的区分度更好&#xff0c;需要对数据按照一定的方式进行归一化 &#xff08;选择什么预处理方式需要慎重&#xff0c;具体看上面的热图美化&#xff09;。小伙伴们可以自行尝试不进行归一化的糟糕效果。

图 1. heatmap 绘制热图

我们发现&#xff0c;在绘图的同时也绘制了层级聚类图&#xff0c;对于 NBA 这一数据&#xff0c;层级聚类图是没有太大意义的&#xff0c;而且颜色其实并不是我们平时所见的红色和黄色。现在我们进行调整

nba_heatmap <- heatmap(nba_matrix, Rowv&#61;NA, Colv&#61;NA, col &#61; heat.colors(100), scale&#61;"column")

我们进行了三点调整&#xff1a;1. 将行层级聚类图 Rowv 设置为 NA&#xff0c;即不显示&#xff1b;2. 将列层级聚类图设置为NA&#xff0c;即不显示&#xff1b;3. cm.colors 修改为 heat.colors&#xff0c;即调整了颜色的模式。

图 2. 调整参数后用 heatmap 函数绘图

二、pheatmap 包里的 pheatmap 函数

pheatmap 实际上是 Pretty Heatmaps 的缩写&#xff0c;新的命名充满了对原始 heatmap 的嫌弃。要使用非基础安装里面的包&#xff0c;就需要安装并加载这个包&#xff0c;代码如下&#xff1a;

install.packages(“pheatmap”)  #安装pheatmap包
library(pheatmap)  #加载pheatmap包

要查看一个包或者一个包里面函数的详细介绍&#xff0c;代码为&#xff1a;

?pheatmap  #查看pheatmap包里面的详细介绍
?pheatmap::pheatmap  #查看pheatmap包里pheatmap函数的具体参数

与 heatmap 类似的是&#xff0c;pheatmap 也可以同时绘制热图和系统树图&#xff0c;同样需要矩阵格式的原始输入&#xff0c;需要用 scale 进行标准化&#xff0c;需要颜色&#xff1b;但不同的是&#xff0c;是否需要行或列的系统树图的表达方式不同&#xff0c;前者是Rowv&#61;NULL &#xff0c;而后者是cluster_rows &#61; TRUE。利用上面的 NBA 数据&#xff0c;我们只是在绘制热图的那一步利用 pheatmap 函数&#xff0c;输入以下代码&#xff1a;

nba_heatmap <- pheatmap(nba_matrix,cluster_rows &#61; TRUE, cluster_cols &#61; TRUE, col &#61; heat.colors(100), scale&#61;"column")

图 3. 用 pheatmap 绘制热图

果然&#xff0c;pheatmap 一出手就不同凡响&#xff0c;信息要比 heatmap 更多。根据这幅图&#xff0c;我们再倒退回去看 pheatmap 函数中的一些关键参数。

  • 热图中的色块以小格子呈现&#xff0c;与小格子相关的默认参数有&#xff1a;border_color &#61; "grey60", cellwidth &#61; NA, cellheight &#61; NA&#xff1b;如果我们不想让每个格子都具有灰色的边框&#xff0c;只需要设置 border_color &#61; NA。

  • heatmap 函数做的热图非常大的问题在于我们虽然看到了颜色的差异&#xff0c;但是每一种颜色代表的具体数值又是多少呢&#xff1f;我们不得而知。但是 pheatmap 完美地解决了这一问题&#xff0c;看图 3 的右上角&#xff0c;我们可以看到一个颜色和相对数值的对应关系。与这一呈现相关的参数是&#xff1a;legend &#61; TRUE, 默认设置是保留 legend。

  • 如果想获取pheatmap的结果&#xff0c;可以str(nba_heatmap)&#xff0c;然后抽丝剥茧的取出每一部分内容。

三、heatmap.plus 包里面的 heatmap.plus 函数

heatmap.plus 与 base 安装里面的 heatmap 很像&#xff0c;只有两个参数 RowSideColors 和 ColSideColors 不一样&#xff0c;在 heatmap 中 两者的输入格式是向量&#xff0c;而在 heatmap.plus 中输入格式是矩阵。关于 R 语言中数据的格式请参照相关书籍。

要理解 RowSideColors 和 ColSideColors 的含义&#xff0c;尝试以下代码&#xff1a;

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep&#61;",")
nba <- nba[order(nba$PTS),]
row.names(nba) <- nba$Name
nba <- nba[,2:20]
nba_matrix <- data.matrix(nba)
rc <- rainbow(nrow(nba_matrix), start &#61; 0, end &#61; .3)
cc <- rainbow(ncol(nba_matrix), start &#61; 0, end &#61; .3)
nba_heatmap <- heatmap(nba_matrix, Rowv&#61;NA, Colv&#61;NA,col &#61; heat.colors(100),RowSideColors &#61; rc,ColSideColors &#61; cc,scale&#61;"column")

图5. 用 heatmap 绘制带有测边的热图

这里 RowSideColors &#61; rc&#xff0c;ColSideColors &#61; cc&#xff0c;而 rc <- rainbow(nrow(nba_matrix)&#xff0c;start &#61; 0, end &#61; .3)&#xff0c;cc <- rainbow(ncol(nba_matrix), start &#61; 0, end &#61; .3)。

侧边就是一个颜色梯度条&#xff0c;这里用到 rainbow 函数&#xff0c;其使用格式是 rainbow(n, s &#61; 1, v &#61; 1, start &#61; 0, end &#61; max(1, n - 1)/n, alpha &#61; 1)&#xff0c;这里 n&#61; nrow(nba_matrix), 而 s 和 v 分别代表饱和度&#xff08;Saturation&#xff09;和纯度&#xff08;Value&#xff09;&#xff0c;start 和 end 分别为色度&#xff08;Hue&#xff09;的起始点。

但是这段代码对 heatmap.plus 是不行的&#xff0c;首先需要将 rc 和 cc 转变为矩阵&#xff0c;试着运行下面这段代码&#xff1a;

rc <- rainbow(nrow(nba_matrix), start &#61; 0, end &#61; .3)
cc <- rainbow(ncol(nba_matrix), start &#61; 0, end &#61; .3)
rc <- matrix(as.character(rc),nrow &#61; 50,ncol &#61; 19)
cc <- matrix(as.character(cc),nrow &#61; 19,ncol &#61; 50)
nba_heatmap <- heatmap.plus(nba_matrix,Rowv&#61;NA, Colv&#61;NA,col &#61; heat.colors(100),RowSideColors &#61; rc, ColSideColors &#61; cc,scale&#61;"column")

图 6. 用 heatmap.plus 绘制带有测边的热图

pheatmap绘制带有侧边的更合适&#xff0c;具体见 R语言学习 - 热图简化&#xff0c; 最简单漂亮的免费在线生信绘图工具。

四、gplots 包里面的 heatmap.2 包

按照惯例&#xff0c;我们还是试一试下面的代码&#xff1a;

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep&#61;",")
nba <- nba[order(nba$PTS),]
row.names(nba) <- nba$Name
nba <- nba[,2:20]
nba_matrix <- data.matrix(nba)
heatmap.2(nba_matrix, Rowv&#61;NA, Colv&#61;NA, col &#61; heat.colors(100), scale&#61;"column")

得到如下图&#xff1a;

图 7. 用 heatmap.2 绘制的热图

我们发现&#xff0c;图中多了很多绿色的线&#xff0c;这是什么呢&#xff1f;查看说明才知道这是 "trace" line&#xff0c;与之相关的代码为&#xff1a;trace&#61;c("column","row","both","none"), tracecol&#61;"cyan"&#xff0c;hline&#61;median(breaks)&#xff0c;vline&#61;median(breaks)&#xff0c;linecol&#61;tracecol。hline 和 vline 分别表示水平和数值的虚线是否需要画出&#xff0c;其默认值均为中位数的转折点。

五、d3heatmap 包中的 d3heatmap 函数

d3heatmap 里面一共包含三个函数&#xff1a;d3heatmap、d3heatmapOutput、renderD3heatmap&#xff0c;后两者是在 shiny 中使用的包裹函数。&#xff08;shiny 是 RStudio 开发的一款用于构建交互式网页 app 的 R 包&#xff0c;shiny 的构建有点复杂&#xff0c;这里暂且略过&#xff0c;因此只讲解 d3heatmap&#xff09;

按照惯例&#xff0c;我们还是试一试下面的代码&#xff1a;

d3heatmap(nba_matrix, Rowv&#61;NA, Colv&#61;NA,col &#61; heat.colors(100), scale&#61;"column")

你会得到以下这幅图&#xff0c;这幅图看起来普普通通&#xff0c;但是神奇之处是当你鼠标落到任一色块时&#xff0c;可以显示当前色块的数值。

图 8. d3heatmap 绘制的交互式热图

六、heatmaply 包里面的 heatmaply 函数

heatmaply 也是交互式的。尝试以下代码&#xff1a;

install.packages("heatmaply")
library(heatmaply)
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep&#61;",")
nba <- nba[order(nba$PTS),]
row.names(nba) <- nba$Name
nba <- nba[,2:20]
nba_matrix <- data.matrix(nba)
heatmaply(nba_matrix, col &#61; heat.colors(100),fontsize_row&#61;7, fontsize_col&#61;7, scale&#61;"column",margins &#61; c(50,120,NA,0))

图 9. 用 heatmaply 绘制的热图

这里新出现的 fontsize_row、fontsize_col 和 margins 参数分别表示行标签字体大小、列标签字体大小以及边界&#xff08;下、左、上、右&#xff09;。

七、iheatmapr 包里的 iheatmap 函数

iheatmap 绘制的也是交互式的热图&#xff0c;这意味着你用鼠标掠过热图上的色块时&#xff0c;会显示该点的数值。同时&#xff0c;在右上方可以看到一系列可以调整的小图标&#xff0c;这些都是可以调节的参数。

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep&#61;",")
nba <- nba[order(nba$PTS),]
row.names(nba) <- nba$Name
nba <- nba[,2:20]
nba_matrix <- data.matrix(nba)
iheatmap(nba_matrix,colors &#61; heat.colors(100), cluster_rows &#61;"kmeans",cluster_cols &#61;"hclust",row_k&#61;10,scale&#61;"cols")

注意这里的书写方式&#xff0c;已经改为 “colors&#61;heat.colors(100)” 和 scale&#61;”cols”

图 10. 用 iheatmap  绘制的热图 &#xff08;一看就是plotly的效果&#xff0c;ggplot2的图也可以直接plotly&#xff09;

八、ComplexHeatmap 绘制热图

首先需要特别强调的是&#xff0c;ComplexHeatmap 是 Bioconductor 里面的一个 R 包&#xff0c;安装的方式与一般 CRAN 上的包的安装方式不同&#xff0c;安装和加载代码如下&#xff1a;

source("https://bioconductor.org/biocLite.R")
biocLite("ComplexHeatmap")
library(ComplexHeatmap)

ComplexHeatmap 包里面用于绘图的函数也叫做 Heatmap&#xff0c;注意这里的 是大写。

具体的参数可用 ?ComplexHeatmap::Heatmap 进行查询&#xff0c;试一下以下这段代码&#xff1a;

Heatmap(nba_matrix, cluster_rows &#61; TRUE,cluster_columns &#61; TRUE,col &#61; heat.colors(100))

图 11. 用 Heatmap 绘制的热图

这样也是可以得到类似于基础安装里面的 heatmap 的。

  • 关于用 ComplexHeatmap 绘制热图&#xff0c;可以看这一个链接&#xff1a;

    http://bioconductor.org/packages/release/bioc/vignettes/ComplexHeatmap/inst/doc/s2.single_heatmap.html

  • 如果阅读英文有困难&#xff0c;可以看这里&#xff1a;http://www.bioinfo-scrounger.com/archives/122

另外&#xff0c;看到 Y 叔&#xff08;生信领域有名的 Y 叔&#xff09;关于热图的总结&#xff0c;利用 Y 叔写的 simplot 函数&#xff0c;可用于可视化相似性矩阵。试着对 nba_matrix 做了一下相似性分析&#xff0c;由于数据有 50 行&#xff0c;因此只能把标签和字体尺寸调到非常小&#xff0c;才勉强可以看见。

#安装DOSE
source("https://bioconductor.org/biocLite.R")
biocLite("DOSE")
library(DOSE)
simplot(nba_matrix,labs.size &#61; 1,font.size &#61; 6)

图 12. 用 simplot  进行相似性分析

九、Lattice包里面的 levelplot 函数

Lattice 包是基于 grid 创建的&#xff0c;有自己独特的绘图风格。其中 lattice 包里面的 levelplot 函数可以用来绘制热图。

library("lattice")
library(latticeExtra)
#准备nba_matrix矩阵
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep&#61;",")
nba <- nba[order(nba$PTS),]
row.names(nba) <- nba$Name
nba <- nba[,2:20]
nba_matrix <- data.matrix(nba)
#对参数进行设置
hc&#61;hclust(dist(nba_matrix)) #按行聚类
dd.row&#61;as.dendrogram(hc)     #保存行聚类树形
row.ord&#61;order.dendrogram(dd.row) #保存行聚类顺序
hc&#61;hclust(dist(t(nba_matrix))) #按列聚类
dd.col&#61;as.dendrogram(hc) #保存列聚类树形
col.rod&#61;order.dendrogram(dd.col) #保存列聚类顺序
temp1&#61;nba_matrix[row.ord,] #只对行聚类&#xff08;是否对行、列聚类&#xff09;
levelplot(t(temp1),aspect&#61;"fill",colorkey&#61;list(space&#61;"left",width&#61;1.5),xlab&#61;"",ylab&#61;"",legend&#61;list(right&#61;list(fun&#61;dendrogramGrob,args&#61;list(x&#61;dd.row,rod&#61;row.ord,side&#61;&#39;right&#39;,size&#61;5)),scales&#61;list(x&#61;list(rot&#61;90))))

图 13. 用 levelplot 绘制的热图

十、ggplot2 包里面的 ggplot 函数绘制热图

最后&#xff0c;不得不提到十分强大的 ggplot2。ggplot2 中&#xff0c;图是采用串联&#xff08;&#43;&#xff09;号创建的&#xff0c;每个函数修改属于自己的部分。下面参考 R-blogger 上的代码&#xff0c;原网页为&#xff1a;https://www.r-bloggers.com/ggplot2-quick-heatmap-plotting/

尝试以下代码&#xff1a;

library(ggplot2)  
library(plyr)
require(reshape2)
require(scales)
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
nba$Name <- with(nba, reorder(Name, PTS))
nba.m <- melt(nba)  #对数据进行融合
nba.m <- ddply(nba.m, .(variable), transform, rescale &#61; rescale(value))
ggplot(nba.m, aes(variable, Name)) &#43; geom_tile(aes(fill &#61; rescale), colour &#61; "white") &#43; scale_fill_gradient(low &#61; "white", high &#61; "steelblue")

图 14. 用 ggplot 绘制的热图

总结&#xff1a;这篇文章带领我们快速浏览了 R 语言里面的 10 种热图的绘制方式&#xff0c;并且提供了代码。首先介绍了 4 种绘制非交互式热图的包&#xff0c;其次介绍了 4 种绘制交互式热图的包&#xff0c;最后介绍了 lattice 和 ggplot2 绘图系统中绘制热图的方法。但由于笔者的水平十分有限&#xff0c;本次的讲解比较浅显&#xff0c;但显而易见的是&#xff0c;每一种函数提供的热图的绘制参数很多&#xff0c;耐心钻研&#xff0c;一定可以绘制出绚丽的热图。

封面图来源于Wikipedia: https://en.wikipedia.org/wiki/Binary_number 

如果看完代码还不会的&#xff0c;可以参加我们的视频课 http://bioinfo.ke.qq.com&#xff1b;或点击原文使用线上版&#xff0c;各种绘图。

精品回顾

画图三字经 生信视频 生信系列教程 心得体会 癌症数据库 

高通量分析 Linux Python 在线画图

好多朋友还没有养成看完转发、点赞的习惯&#xff0c;应该有的&#xff01;&#xff01;



推荐阅读
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 本文总结了Java初学者需要掌握的六大核心知识点,帮助你更好地理解和应用Java编程。无论你是刚刚入门还是希望巩固基础,这些知识点都是必不可少的。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 文章目录Golang定时器Timer和Tickertime.Timertime.NewTimer()实例time.AfterFunctime.Tickertime.NewTicke ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 如何将Python与Excel高效结合:常用操作技巧解析
    本文深入探讨了如何将Python与Excel高效结合,涵盖了一系列实用的操作技巧。文章内容详尽,步骤清晰,注重细节处理,旨在帮助读者掌握Python与Excel之间的无缝对接方法,提升数据处理效率。 ... [详细]
  • 深入解析:Synchronized 关键字在 Java 中对 int 和 Integer 对象的作用与影响
    深入探讨了 `Synchronized` 关键字在 Java 中对 `int` 和 `Integer` 对象的影响。尽管初看此题似乎简单,但其实质在于理解对象的概念。根据《Java编程思想》第二章的观点,一切皆为对象。本文详细分析了 `Synchronized` 关键字在不同数据类型上的作用机制,特别是对基本数据类型 `int` 和包装类 `Integer` 的区别处理,帮助读者深入理解 Java 中的同步机制及其在多线程环境中的应用。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • SSAS入门指南:基础知识与核心概念解析
    ### SSAS入门指南:基础知识与核心概念解析Analysis Services 是一种专为决策支持和商业智能(BI)解决方案设计的数据引擎。该引擎能够为报告和客户端应用提供高效的分析数据,并支持在多维数据模型中构建高性能的分析应用。通过其强大的数据处理能力和灵活的数据建模功能,Analysis Services 成为了现代 BI 系统的重要组成部分。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
author-avatar
哥的微笑帅_655
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有