我目前有一个带有分类轴的 Plotly 热图。
热图将图表中的个体与他们自己进行对比,每对个体都有一个整数值(z 值,这是热图上绘制的值)分配给该对(它是衡量两个个体之间的公平程度的量度)。配对我们的)。现在,热图上的颜色是自动分配的。
不幸的是,我不太清楚如何为这样的热图指定配色方案。是否可以指定用于每个 z 值的颜色?例如,我可以设置 1 = 蓝色、2 = 红色、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)
然后对于每个类别,您需要有一个单独的 data.frame 为给定类别保存颜色。重要的是那些 data.frames 不需要有 colnames。
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 = ''
)
)
我有同样的问题,并通过 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
)