如何用Plotly实现按变量调整颜色深度的Treemap(复刻treemap效果)
用Plotly复刻treemap包的树形图效果
原treemap包实现效果
我用treemap包绘制了一幅树形图,其中每个矩形的面积与Valor变量关联,颜色由Nota变量标准化后的scale变量控制,采用红灰渐变配色。代码及效果如下:
library(data.table) library(tidyverse) library(treemap) url <- "https://raw.githack.com/fsbmat-ufv/stackExchange/main/df2.csv" df <- fread(url) df$scale <- scale(df$Nota) treemap(df, index = "MUNICIPIO", vSize = "Valor", vColor = "scale", type = "value", palette = "-RdGy", lowerbound.cex.labels = 0.1, title = "Treemap Rio de Janeiro", overlap.labels=0.05)

尝试Plotly实现的问题
我希望用Plotly创建相同或类似的树形图,要求矩形面积关联Valor变量,颜色深度随Nota或scale变量变化,但尝试的代码未达到预期效果。尝试的代码如下:
color <- colorRamp(c("red", "gray")) colorlist <- rgb(color((df$Nota)/max(df$Nota)), max = 255) df %>% plotly::plot_ly(labels = ~ MUNICIPIO, values = ~Valor, parents = ~NA, type = 'treemap', hovertemplate = "City: %{label}<extra></extra>") %>% plotly::layout(title = "Patent scape", colorway = colorlist)

解决方案
以下是可以实现目标效果的Plotly代码,关键修改点已标注:
library(data.table) library(plotly) # 读取数据并处理scale变量 url <- "https://raw.githack.com/fsbmat-ufv/stackExchange/main/df2.csv" df <- fread(url) df$scale <- scale(df$Nota) # Plotly树形图实现 plot_ly(df, labels = ~MUNICIPIO, # 对应原treemap的index参数 values = ~Valor, # 控制矩形面积,对应vSize parents = ~NA, # 无层级结构,设为NA type = 'treemap', color = ~scale, # 绑定颜色到标准化后的scale变量,对应vColor colors = c("red", "gray"), # 指定红灰渐变配色,对应原palette="-RdGy" hovertemplate = "城市: %{label}<br>Valor: %{value}<br>Nota: %{customdata}<extra></extra>", customdata = ~Nota # 传入Nota到hover提示 ) %>% layout(title = "Treemap Rio de Janeiro")
关键修改说明:
- 修正了管道符语法错误(原代码
%>改为正确的%>%) - 放弃手动生成颜色列表的方式,改用Plotly原生的
color参数绑定颜色变量,自动实现渐变映射 - 用
colors参数直接指定红灰渐变的起止颜色,和原treemap的配色逻辑一致 - 优化了hover提示内容,增加
Valor和Nota的显示,提升交互体验
内容的提问来源于stack exchange,提问作者fsbmat
相关产品推荐
相关产品推荐

