R 中的交互式热图
Interactive heatmap in R
我的数据框看起来像:
rankA rankB V1 V2
1 0-1 w 1-2 t 8.636042 10.43002
2 0-1 w 3-5 t 6.495266 10.52126
3 0-1 w 6-10 t 5.480639 10.56230
4 0-1 w +10 t 4.897840 10.64759
5 2-3 w 1-2 t 7.677400 10.45409
6 2-3 w 3-5 t 5.420535 10.47965
7 2-3 w 6-10 t 4.499810 10.51640
8 2-3 w +10 t 3.496508 10.44883
我需要一个交互式热图。我说互动是因为:
- 我需要在 X 轴上绘制等级 A
- 我需要在 Y 轴上绘制等级 B
- 我需要用 V1 给方块上色
- 当鼠标指针悬停在一个方块上时,消息框必须显示 V2 值。
我刚刚看过 heatmaply 文档,但我不知道如何将 mtcars
热图复制到我的案例中(tidyverse
图书馆?)。
有什么想法吗?还有其他套餐吗?
如果您不需要热图两侧的树状图,以下是可能的选项:
选项 1。创建 ggplot 对象并使用 plotly::ggplotly
:
进行转换
library(ggplot2)
p <- ggplot(df,
aes(x = rankA, y = rankB, fill = V1, label = V2)) +
geom_tile() +
geom_label(fill = "white") +
viridis::scale_fill_viridis() # to match other packages' default palettes
plotly::ggplotly(p)
选项 2。创建 plotly 对象:
plotly::plot_ly(
data = df,
x = ~rankA, y = ~rankB, z = ~V1, text = ~paste('V2: ', V2),
hoverinfo = "text",
type = "heatmap"
)
(此版本在悬停时显示 "V2: /value of V2/"。但导出的屏幕截图未捕获它。)
如果您真的需要树状图,恐怕我还没有找到一种方法将其提供给 heatmaply 的参数。但时不我待,你可以考虑以下...
选项 3。使用 heatmaply 库创建 plotly 对象并更改底层代码
# create the heatmap object hm (on hover, it will show the rankA / rankB / V1 values)
hm <- heatmaply::heatmaply(long_data = df %>%
select(rankB, rankA, V1) %>%
rename(name = rankB, variable = rankA, value = V1))
# look through hm's structure for hover text. I found it below, but I haven't
# used plotly enough to know if it's always going to be in the same place
str(hm)
> hm$x$data[4][[1]]$text
[,1] [,2]
[1,] "value: 8.636042<br />column: 0-1 w<br />row: 1-2 t" "value: 7.677400<br />column: 2-3 w<br />row: 1-2 t"
[2,] "value: 6.495266<br />column: 0-1 w<br />row: 3-5 t" "value: 5.420535<br />column: 2-3 w<br />row: 3-5 t"
[3,] "value: 5.480639<br />column: 0-1 w<br />row: 6-10 t" "value: 4.499810<br />column: 2-3 w<br />row: 6-10 t"
[4,] "value: 4.897840<br />column: 0-1 w<br />row: +10 t" "value: 3.496508<br />column: 2-3 w<br />row: +10 t"
attr(,"apiSrc")
[1] TRUE
# replace with V2's values, making sure the rows & columns are matched correctly
df %>%
select(-V1) %>%
mutate(V2 = paste("V2:", V2)) %>%
tidyr::spread(rankA, V2) %>%
arrange(factor(rankB, levels = c("1-2 t", "3-5 t", "6-10 t", "+10 t"))) %>%
select(-rankB) %>% as.matrix() -> hm$x$data[4][[1]]$text
hm
(和以前一样,这个版本在悬停时显示 "V2: /value of V2/"。但它没有被导出的屏幕截图捕获。)
数据:
df <- read.table(header = T, stringsAsFactors = F,
text = ' rankA rankB V1 V2
1 "0-1 w" "1-2 t" 8.636042 10.43002
2 "0-1 w" "3-5 t" 6.495266 10.52126
3 "0-1 w" "6-10 t" 5.480639 10.56230
4 "0-1 w" "+10 t" 4.897840 10.64759
5 "2-3 w" "1-2 t" 7.677400 10.45409
6 "2-3 w" "3-5 t" 5.420535 10.47965
7 "2-3 w" "6-10 t" 4.499810 10.51640
8 "2-3 w" "+10 t" 3.496508 10.44883')
我的数据框看起来像:
rankA rankB V1 V2
1 0-1 w 1-2 t 8.636042 10.43002
2 0-1 w 3-5 t 6.495266 10.52126
3 0-1 w 6-10 t 5.480639 10.56230
4 0-1 w +10 t 4.897840 10.64759
5 2-3 w 1-2 t 7.677400 10.45409
6 2-3 w 3-5 t 5.420535 10.47965
7 2-3 w 6-10 t 4.499810 10.51640
8 2-3 w +10 t 3.496508 10.44883
我需要一个交互式热图。我说互动是因为:
- 我需要在 X 轴上绘制等级 A
- 我需要在 Y 轴上绘制等级 B
- 我需要用 V1 给方块上色
- 当鼠标指针悬停在一个方块上时,消息框必须显示 V2 值。
我刚刚看过 heatmaply 文档,但我不知道如何将 mtcars
热图复制到我的案例中(tidyverse
图书馆?)。
有什么想法吗?还有其他套餐吗?
如果您不需要热图两侧的树状图,以下是可能的选项:
选项 1。创建 ggplot 对象并使用 plotly::ggplotly
:
library(ggplot2)
p <- ggplot(df,
aes(x = rankA, y = rankB, fill = V1, label = V2)) +
geom_tile() +
geom_label(fill = "white") +
viridis::scale_fill_viridis() # to match other packages' default palettes
plotly::ggplotly(p)
选项 2。创建 plotly 对象:
plotly::plot_ly(
data = df,
x = ~rankA, y = ~rankB, z = ~V1, text = ~paste('V2: ', V2),
hoverinfo = "text",
type = "heatmap"
)
(此版本在悬停时显示 "V2: /value of V2/"。但导出的屏幕截图未捕获它。)
如果您真的需要树状图,恐怕我还没有找到一种方法将其提供给 heatmaply 的参数。但时不我待,你可以考虑以下...
选项 3。使用 heatmaply 库创建 plotly 对象并更改底层代码
# create the heatmap object hm (on hover, it will show the rankA / rankB / V1 values)
hm <- heatmaply::heatmaply(long_data = df %>%
select(rankB, rankA, V1) %>%
rename(name = rankB, variable = rankA, value = V1))
# look through hm's structure for hover text. I found it below, but I haven't
# used plotly enough to know if it's always going to be in the same place
str(hm)
> hm$x$data[4][[1]]$text
[,1] [,2]
[1,] "value: 8.636042<br />column: 0-1 w<br />row: 1-2 t" "value: 7.677400<br />column: 2-3 w<br />row: 1-2 t"
[2,] "value: 6.495266<br />column: 0-1 w<br />row: 3-5 t" "value: 5.420535<br />column: 2-3 w<br />row: 3-5 t"
[3,] "value: 5.480639<br />column: 0-1 w<br />row: 6-10 t" "value: 4.499810<br />column: 2-3 w<br />row: 6-10 t"
[4,] "value: 4.897840<br />column: 0-1 w<br />row: +10 t" "value: 3.496508<br />column: 2-3 w<br />row: +10 t"
attr(,"apiSrc")
[1] TRUE
# replace with V2's values, making sure the rows & columns are matched correctly
df %>%
select(-V1) %>%
mutate(V2 = paste("V2:", V2)) %>%
tidyr::spread(rankA, V2) %>%
arrange(factor(rankB, levels = c("1-2 t", "3-5 t", "6-10 t", "+10 t"))) %>%
select(-rankB) %>% as.matrix() -> hm$x$data[4][[1]]$text
hm
(和以前一样,这个版本在悬停时显示 "V2: /value of V2/"。但它没有被导出的屏幕截图捕获。)
数据:
df <- read.table(header = T, stringsAsFactors = F,
text = ' rankA rankB V1 V2
1 "0-1 w" "1-2 t" 8.636042 10.43002
2 "0-1 w" "3-5 t" 6.495266 10.52126
3 "0-1 w" "6-10 t" 5.480639 10.56230
4 "0-1 w" "+10 t" 4.897840 10.64759
5 "2-3 w" "1-2 t" 7.677400 10.45409
6 "2-3 w" "3-5 t" 5.420535 10.47965
7 "2-3 w" "6-10 t" 4.499810 10.51640
8 "2-3 w" "+10 t" 3.496508 10.44883')