假设我们有以下矩阵:
m <- matrix(1:12, 3, 4, dimnames=list(LETTERS[1:3], LETTERS[1:4]))
我们使用highcharteR绘制:
library(highcharter)
hchart(head(m, -1), "bubble", hcaes(),
showInLegend = FALSE)
然后,我们可以用图像替换x轴的标签,例如,对于A:
hchart(head(m, -1), "bubble", hcaes(),
showInLegend = FALSE) %>%
hc_xAxis(type = 'category',
labels = list(
formatter = JS(
"function(){
if(this.value == 'A'){
return '<img src=\"https://www.highcharts.com/samples/graphics/sun.png\"></img>';
} else {
return this.value;
}
}"
),
useHTML = TRUE
))
这将给予我们:
但是我们如何使用base64而不是url得到相同的结果呢?有没有什么方法可以把图片嵌入到html的highcharteR文件中?
我尝试将图像转换为base64并将其嵌入到图表中:
image_path <- "https://www.highcharts.com/samples/graphics/sun.png"
image_data <- base64enc::dataURI(file=image_path, mime="image/png")
hchart(head(m, -1), "bubble", hcaes(),
showInLegend = FALSE) %>%
hc_xAxis(type = 'category',
labels = list(
formatter = JS(
sprintf(
"function(){
if(this.value == 'A'){
return '<img src=\"%s\"></img>';
} else {
return this.value;
}
}",
image_data
)
),
useHTML = TRUE
))
但这让我没有印象。输出是空白的,html(在输出中)在这个位置只是:<img>
1条答案
按热度按时间qzlgjiam1#
问题是highcharts.js正在验证
labels.formatter
等函数生成的html。特别是,src
属性必须以Highcharts.AST.allowedReferences
中包含的值之一开始,请参阅源代码中的内容。一个简单的解决方案是单独设置
src
,在当前JavaScript指令序列完成后立即使用setTimeout
。这意味着要替换与
更规范的解决方案是通过添加
"data:"
作为允许的前缀来更改Highcharts.AST.allowedReferences
。虽然这可以在formatter
本身完成:只对
allowedReferences
进行一次更改会更有效,例如通过prepending对highcharter生成的htmlwidget的JavaScript语句(或通过特定于您的应用程序的其他初始化钩子):