【发布时间】:2020-12-26 10:15:41
【问题描述】:
我正在处理调查数据,当被问及一个变量是否影响另一个变量时,一个人的回答从“不”到“绝对”。将响应映射到数字,并计算平均响应。
我在热图中呈现这些平均值(x 和 y 是具有相同变量名称的列表)。我希望热图中正方形的颜色能够反映数值平均值,但我希望颜色栏上的标签能够反映实际的响应文本(例如,'not'、'lowly、'moderately'、'highly'、'very高度')并将刻度线限制在位置 0,1,2,3,4。
我不确定这是否可以通过 plotly 来完成。我可以用 ggiraph 做到这一点,但这会进入 Shiny 并且 ggiraph 在那里有自己的问题 - 在情节上,我可以更好地控制显示尺寸,我无法让 ggiraph 渲染得足够大。
下面是最少的代码,输出也是。
library(plotly)
library(tidyr)
M <- matrix(c(NA, 1,3, 2, NA, 4, 3, 0, NA), nrow = 3, ncol = 3)
names_M <- c('var1', 'var2', 'var3')
val_to_char <- function(x) {
if(is.na(x)) {return(x)}
else if(x < 0.5) {return('not')}
else if(x < 1.5) {return('lowly')}
else if(x < 2.5) {return('moderately')}
else if(x < 3.5) {return('highly')}
else {return('very high')}
}
labels <- apply(M, c(1,2), val_to_char)
fig <- plot_ly()
fig <- fig %>%
add_trace(
type = 'heatmap',
x = names_M, y = names_M, z = M, text = labels,
hovertemplate = '<extra></extra> Row: %{y}</br></br>Col: %{x}</br>Avg response: %{text}'
)
fig
【问题讨论】: