在 Plotly 热力图中指定颜色

3

我目前有一个带有分类轴的 Plotly 热力图。

该热力图将图表中的个体与自己绘制,每对个体都被分配了一个整数值(即 z 值,这是在热力图上绘制的内容,它是一种衡量该对个体之间距离的方式)。目前,热力图上的颜色是自动分配的。

不幸的是,我无法确定如何为这样的热力图指定颜色方案。是否可以指定用于每个 z 值的颜色?例如,我能否将 1 设为蓝色,2 设为红色,3 设为绿色等等?

heat-map


2
欢迎来到SO。请将鼠标悬停在R标签上 - 它要求提供a)最小化和b)可重现的示例,通过复制,粘贴,运行可以重新创建您的问题。请提供一个。谢谢。 - lukeA
啊,我没看到 - 我在这里还是很新的。 - Arun
我刚看到这篇帖子,你没有提供一个最小可重现的示例是我没有点赞的原因。我认为回答你问题的人也是这么想的。 - 5th
3个回答

3
我曾经遇到过完全相同的问题,通过一些小技巧,我成功地解决了这个问题。这个问题似乎是最相关的,可以发布答案。目前,Plotly不允许您显式地这样做,也就是指定分类(离散)热图值的确切颜色。这在这个 github 问题中有记录。一个纯JS解决方案在那里链接,并且花了我一段时间才能在R中复制它(使用Plotly 4.7.1)。
首先,您需要每个类别一个矩阵,每个矩阵都填充有1和NA。每个矩阵必须具有相同的大小。让我们编造一些数据。
greenSeriesData <- matrix(c(1,1,NA,NA,1,NA,NA,NA,1), nrow = 3)
redSeriesData <- matrix(c(NA,NA,1,1,NA,NA,NA,NA,NA), nrow = 3)
blueSeriesData <- matrix(c(NA,NA,NA,NA,NA,1,1,1,NA), nrow = 3)

然后,对于每个类别,您需要有一个单独的数据框来保存给定类别的颜色。重要的是,这些数据框不能有列名。

greenColor <- data.frame(x = c(0,1), y = c("#63a803", "#63a803"))
colnames(greenColor) <- NULL

redColor <- data.frame(x = c(0,1), y = c("#a80b03", "#a80b03"))
colnames(redColor) <- NULL

blueColor <- data.frame(x = c(0,1), y = c("#035da8", "#035da8"))
colnames(blueColor) <- NULL

现在,您可以准备绘制图表,并将每个类别指定为单独的曲线:

plot_ly(
    type = "heatmap"
) %>% add_trace(
    z = greenSeriesData,
    colorscale = greenColor
) %>% add_trace(
    z = redSeriesData,
    colorscale = redColor
) %>% add_trace(
    z = blueSeriesData,
    colorscale = blueColor
)

如果您想进一步调整图例的外观,您需要为每个追踪添加一个 colorbar 参数:

plot_ly(
    type = "heatmap"
) %>% add_trace(
    z = greenSeriesData,
    colorscale = greenColor,
    colorbar = list(
        len = 0.3,
        y = 1,
        yanchor = 'top',
        title = 'Green series',
        tickvals = ''
    )
) %>% add_trace(
    z = redSeriesData,
    colorscale = redColor,
    colorbar = list(
        len = 0.3,
        y = 1,
        yanchor = 'top',
        title = 'Red series',
        tickvals = ''
    )
) %>% add_trace(
    z = blueSeriesData,
    colorscale = blueColor,
    colorbar = list(
        len = 0.3,
        y = 1,
        yanchor = 'top',
        title = 'Blue series',
        tickvals = ''
    )
)

1

我曾经也遇到过同样的问题,并通过Mikolaj提供的github链接来到这里。对我起作用的第二种简化方法是手动定义colorscale并且去掉图例(可以手动绘制)。

为了简单起见,我们假设有三个类别(颜色)。

colors <- RColorBrewer::brewer.pal(3, 'Set2')

colorscale 是基于归一化值定义的,因此在这种情况下可以简单地执行以下操作:”
colorscale <- list(
  list(0, colors[1]),
  list(0.5, colors[2]),
  list(1, colors[3])
) 

这可以推广到N种颜色,将嵌套列表中的第一个值定义为(i - 1)/(N - 1),其中i是相应的color索引。

例如:

plot_ly() %>%
  add_trace(
    type = "heatmap",
    data = mtcars %>% 
      group_by(cyl, gear) %>% 
      summarise(n = n()) %>% 
      mutate(cat = 1 + (n > 1) + (n > 10)),
    x = ~cyl,
    y = ~gear,
    z = ~cat,
    colorscale = colorscale,
    showscale = FALSE
  )

0
一个简单的方法是,在ggplot中制作热图,然后将其转换为plotly。
library(ggplot2)
library(plotly)
df.team_data <- expand.grid(teams = c("Team A", "Team B", "Team C", "Team D")
                       ,metrics = c("Metric 1", "Metric 2", "Metric 3", "Metric 4", "Metric 5"))
set.seed(41)
df.team_data$performance <- sample(c(0, 1), 20, replace = TRUE)
df.team_data$scores <- sample(c(10, 100), 20, replace = TRUE)

df.team_data$performance<-factor(df.team_data$performance)

col.plot<-c('lightblue','yellow')

gg_team <- ggplot(data = df.team_data, aes(x = metrics, y = teams)) +
   geom_tile(aes(fill = performance)) +
   geom_text(aes(label = scores)) +
   scale_fill_manual(values=col.plot)

ggplotly(gg_team)

这主要是从这个问题中获取的:R: ggplot 热图颜色更改


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接