如何在echarts4r直方图的tooltip中显示区间而非均值?
实现echarts4r直方图tooltip显示区间而非均值
可以通过两种方式实现需求,以下是具体方案:
方法一:自定义Tooltip Formatter(基于原生直方图)
通过指定直方图的组距(binWidth),再在Tooltip的自定义格式化函数中计算区间范围,无需手动统计数据:
library(data.table) library(echarts4r) iris %>% setDT() %>% e_charts() %>% e_histogram( Sepal.Width, name = "histogram", binWidth = 0.2) # 明确组距,需与下方JS代码中的值一致 e_density( Sepal.Width, name = "density", y_index = 1) %>% e_tooltip( trigger = "axis", formatter = htmlwidgets::JS(" function(params) { // 处理直方图的提示内容 if(params[0].seriesName === 'histogram') { const binWidth = 0.2; const midValue = parseFloat(params[0].axisValue); const lower = (midValue - binWidth/2).toFixed(1); const upper = (midValue + binWidth/2).toFixed(1); return `区间: ${lower}-${upper}<br/>频数: ${params[0].value}`; } // 处理密度曲线的提示内容 else { return `${params[0].seriesName}: ${params[0].value.toFixed(4)}<br/>Sepal.Width: ${params[0].axisValue}`; } } ") )
方法二:手动统计区间数据,用柱状图模拟直方图
先手动计算每个区间的频数,再用e_bar绘制,完全控制Tooltip显示的内容:
library(data.table) library(echarts4r) # 统计区间与频数 dt <- setDT(iris)[, .(count = .N), by = .( interval = cut(Sepal.Width, breaks = seq(min(Sepal.Width), max(Sepal.Width), by = 0.2)) )] # 将区间格式转为"x.x-x.x"的字符串 dt[, interval_label := gsub("\\(|\\]|\\,", "-", interval)][, interval_label := substr(interval_label, 1, nchar(interval_label)-1)] # 绘图 dt %>% e_charts(x = interval_label) %>% e_bar(count, name = "histogram") %>% e_density(Sepal.Width, name = "density", y_index = 1) %>% e_tooltip(trigger = "axis", formatter = htmlwidgets::JS(" function(params) { let tipContent = ''; params.forEach(item => { if(item.seriesName === 'histogram') { tipContent += `区间: ${item.name}<br/>频数: ${item.value}`; } else { tipContent += `${item.seriesName}: ${item.value.toFixed(4)}<br/>Sepal.Width: ${item.axisValue}`; } }); return tipContent; } "))
两种方法对比
- 方法一:无需手动统计数据,直接复用
e_histogram的原生逻辑,只需保证binWidth参数与JS代码中的值一致即可。 - 方法二:更灵活,可自定义区间划分规则,Tooltip内容完全可控,适合需要对区间做特殊调整的场景。
内容的提问来源于stack exchange,提问作者Avraam
相关产品推荐
相关产品推荐

