如何解决在绘图热图R中更改颜色栏标签
我正在使用调查数据,在该数据中,一个人从被问到一个变量是否影响另一个变量时的回答是“不是”到“绝对”。将响应映射到数字,然后计算平均响应。
我正在热图中显示这些平均值(x和y是具有相同变量名的列表)。我希望热图中的正方形颜色能够反映数值平均值,但是我希望颜色栏上的标签能够反映实际的响应文本(例如,“不”,“低”,“中”,“高”,“非常”高度”),并将刻度线限制在位置0、1、2、3、4。
我不确定是否可以通过密谋来完成。我能够使用ggiraph来做到这一点,但是这正在进入Shiny,并且ggiraph在那里存在其自身的问题-总的来说,我对显示大小有更多的控制权,而我无法让ggiraph渲染足够大。
下面是最小代码,输出也是如此。
library(plotly)
library(tidyr)
M <- matrix(c(NA,1,3,2,NA,4,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
解决方法
您可以使用ggplot
和ggplotly
来提高灵活性。但是首先需要将数据转换为长数据。frame:
M <- as.data.frame.matrix(matrix(c(NA,1,3,2,NA,4,NA),nrow = 3,ncol = 3))
names(M) <- c('var1','var2','var3')
p <- M %>%
pivot_longer(.,paste0("var",1:3),names_to = "x",values_to = "z") %>%
mutate(y = rep(paste0("var",each = 3)) %>%
ggplot(aes(x,y,fill = z))+
geom_tile() +
scale_fill_continuous(breaks = 0:4,labels = c("not","lowly","moderatly","highly","very high"))
ggplotly(p)
函数scale_fill_continuous
允许您为不同的中断点手动指定标签。您可以使用ggplot
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。