作者:14835688_d4705c_859 | 来源:互联网 | 2023-05-18 11:45
ImfollowingthisexampleonhowtocreateaclusteredheatmapwithdendrogramswithRsplotly.He
I'm following this example on how to create a clustered heatmap with dendrograms with R
's plotly
. Here's the example:
我正在按照这个例子说明如何使用R的图形创建具有树状图的聚类热图。这是一个例子:
library(ggplot2)
library(ggdendro)
library(plotly)
#dendogram data
x <- as.matrix(scale(mtcars))
dd.col <- as.dendrogram(hclust(dist(x)))
dd.row <- as.dendrogram(hclust(dist(t(x))))
dx <- dendro_data(dd.row)
dy <- dendro_data(dd.col)
# helper function for creating dendograms
ggdend <- function(df) {
ggplot() +
geom_segment(data = df, aes(x=x, y=y, xend=xend, yend=yend)) +
labs(x = "", y = "") + theme_minimal() +
theme(axis.text = element_blank(), axis.ticks = element_blank(),
panel.grid = element_blank())
}
# x/y dendograms
px <- ggdend(dx$segments)
py <- ggdend(dy$segments) + coord_flip()
# heatmap
col.ord <- order.dendrogram(dd.col)
row.ord <- order.dendrogram(dd.row)
xx <- scale(mtcars)[col.ord, row.ord]
xx_names <- attr(xx, "dimnames")
df <- as.data.frame(xx)
colnames(df) <- xx_names[[2]]
df$car <- xx_names[[1]]
df$car <- with(df, factor(car, levels=car, ordered=TRUE))
mdf <- reshape2::melt(df, id.vars="car")
p <- ggplot(mdf, aes(x = variable, y = car)) + geom_tile(aes(fill = value))
mat <- matrix(unlist(dplyr::select(df,-car)),nrow=nrow(df))
colnames(mat) <- colnames(df)[1:ncol(df)-1]
rownames(mat) <- rownames(df)
# hide axis ticks and grid lines
eaxis <- list(
showticklabels = FALSE,
showgrid = FALSE,
zeroline = FALSE
)
p_empty <- plot_ly(filename="r-docs/dendrogram") %>%
# note that margin applies to entire plot, so we can
# add it here to make tick labels more readable
layout(margin = list(l = 200),
xaxis = eaxis,
yaxis = eaxis)
subplot(px, p_empty, p, py, nrows = 2, margin = 0.01)
which gives:
I changed the code a bit so that in my case the heatmap is generated with plotly
rather than ggplot
since it runs faster on my real big data, hence I do:
我改变了一些代码,所以在我的情况下,热图是用plotly而不是ggplot生成的,因为它在我的真实大数据上运行得更快,因此我做:
heatmap.plotly <- plot_ly() %>% add_heatmap(z=~mat,x=factor(colnames(mat),lev=colnames(mat)),y=factor(rownames(mat),lev=rownames(mat)))
And then:
subplot(px, p_empty, heatmap.plotly, py, nrows = 2, margin = 0.01)
which gives:
My questions are:
我的问题是:
How do I get the row and column labels of the heatmap not get cut off as they do in both plots?
如何使热图的行标签和列标签不会像在两个图中那样被切断?
The label of the colorer is changed to "mat" in the second figure. Any idea how to prevent that?
在第二张图中,colorer的标签更改为“mat”。知道怎么预防吗?
How do I change the margins between the heatmap and the dendrograms?
如何更改热图和树形图之间的边距?
2 个解决方案
4
How do I get the row and column labels of the heatmap not get cut off > as they do in both plots?
如何使热图的行标签和列标签不被切断>就像在两个图中一样?
Try setting the margin
s after the plot was generated
在生成绘图后尝试设置边距
sply <- subplot(px, p_empty, heatmap.plotly, py, nrows = 2)
sply <- layout(sply,
margin = list(l = 150,
r = 0,
b = 50,
t = 0
)
)
The label of the colorer is changed to "mat" in the second figure. Any idea how to prevent that?
在第二张图中,colorer的标签更改为“mat”。知道怎么预防吗?
No idea how to prevent it but you can overwrite the label.
不知道如何防止它,但你可以覆盖标签。
sply$x$data[[3]]$colorbar$title <- 'mat'
How do I change the margins between the heatmap and the dendrograms?
如何更改热图和树形图之间的边距?
You can specify the domain
for each axis of each subplot. yaxis
corresponds to the plot in the left upper corner, yaxis2
to the plot in right next to it, etc.
您可以为每个子图的每个轴指定域。 yaxis对应于左上角的图,yaxis2对应于它旁边的图,等等。
Increasing the distance works better than decreasing it.
增加距离比减少距离更有效。
sply <- layout(sply,
yaxis = list(domain=c(0.47, 1)),
xaxis = list(domain=c(0, 0.5)),
xaxis3 = list(domain=c(0, 0.5)),
xaxis4 = list(domain=c(0.5, 1)),
)
pl <- subplot(px, p_empty, p, py, nrows = 2)
heatmap.plotly <- plot_ly() %>% add_heatmap(z=~mat,x=factor(colnames(mat),lev=colnames(mat)),y=factor(rownames(mat),lev=rownames(mat)))
sply <- subplot(px, p_empty, heatmap.plotly, py, nrows = 2)
sply$x$data[[3]]$colorbar$title <- 'mat'
sply <- layout(sply,
yaxis = list(domain=c(0.47, 1)),
xaxis = list(domain=c(0, 0.5)),
xaxis3 = list(domain=c(0, 0.5)),
xaxis4 = list(domain=c(0.5, 1)),
margin = list(l = 150,
r = 0,
b = 50,
t = 0
)
)
sply