R plotly customdata 格式变化
R plotly customdata format variations
我正在尝试通过 javascrit 访问分配给每个数据点的 customdata
(例如,为每个点分配一个超链接)。但是,我注意到数据格式从一个图变为另一个图,这看起来很奇怪。
这在这个例子中非常有效(基于 post),即当 fill
审美是 character
向量时:
library(plotly)
library(htmlwidgets)
js <- "function(el, x) {
el.on('plotly_click', function(d) {
console.log(d);
console.log(d.points[0].data.customdata[0]);
});
}"
X <- data.frame(x = c(1, 2, 1, 2), y = c(1, 1, 2, 2), z = as.character(1:4), mydata = letters[1:4])
gg <- ggplot(X, aes(x = x, y = y, customdata = mydata)) + geom_tile(aes(fill = z))
ggplotly(gg) %>% onRender(js)
可以看出,单击每个点时会显示单个正确的自定义数据。自定义数据的结构与其他图类似。
然而,当 z
作为数值变量输入时,自定义数据的结构表现异常:
X <- data.frame(x = c(1, 2, 1, 2), y = c(1, 1, 2, 2), z = 1:4, mydata = letters[1:4])
gg <- ggplot(X, aes(x = x, y = y, customdata = mydata)) + geom_tile(aes(fill = z))
ggplotly(gg) %>% onRender(js)
这是一个错误吗?我怎样才能解决这个问题?事实上,我的数据集比这个例子中的数据集大得多。
编辑
@ismirsehregal 提供了适用于上述示例的解决方案。然而,似乎customdata
将矢量数据照原样,这似乎是错误的。因此,如果我们更改 X
的顺序,js
脚本将停止工作。
展示:
library(plotly)
library(htmlwidgets)
js <- "function(el, x) {
el.on('plotly_click', function(d) {
var zdimensions = [ 0, 0 ];
var vecindex = 0;
var clickedcustomdata = '';
var zdimensions = [ d.points[0].data.z.length, d.points[0].data.z[0].length ];
vecindex = d.points[0].pointIndex[0]*zdimensions[1] + d.points[0].pointIndex[1];
clickedcustomdata = d.points[0].data.customdata[vecindex];
console.log(d);
console.log(clickedcustomdata);
});
}"
X <- data.frame(x = c(1, 2, 3, 1, 2, 3),
y = c(1, 1, 1, 2, 2, 2),
z = 1:6,
mydata = letters[1:6])
X <- X[order(-X$z),]
gg <- ggplot(X, aes(x = x, y = y, customdata = mydata)) + geom_tile(aes(fill = z))
fig <- ggplotly(gg) %>% onRender(js)
fig
我想一个潜在的解决方案是预先在 R 中排序 X
以便它匹配矩阵顺序?
这是基于 pointIndex
的解决方法。
我正在根据提供的 pointIndex
:
计算 customdata
的向量索引
library(plotly)
library(htmlwidgets)
js <- "function(el, x) {
el.on('plotly_click', function(d) {
var zdimensions = [ 0, 0 ];
var vecindex = 0;
var clickedcustomdata = '';
var zdimensions = [ d.points[0].data.z.length, d.points[0].data.z[0].length ];
vecindex = d.points[0].pointIndex[0]*zdimensions[1] + d.points[0].pointIndex[1];
clickedcustomdata = d.points[0].data.customdata[vecindex];
console.log(clickedcustomdata);
});
}"
X <- data.frame(x = c(1, 2, 1, 2, 1, 2), y = c(1, 1, 2, 2, 3, 3), z = 1:6, mydata = letters[1:6])
gg <- ggplot(X, aes(x = x, y = y, customdata = mydata)) + geom_tile(aes(fill = z))
fig <- ggplotly(gg) %>% onRender(js)
fig
This 对到达此处很有帮助。
我仍然鼓励您在 GitHub 上提交问题,所以这已正式修复。
我正在尝试通过 javascrit 访问分配给每个数据点的 customdata
(例如,为每个点分配一个超链接)。但是,我注意到数据格式从一个图变为另一个图,这看起来很奇怪。
这在这个例子中非常有效(基于 fill
审美是 character
向量时:
library(plotly)
library(htmlwidgets)
js <- "function(el, x) {
el.on('plotly_click', function(d) {
console.log(d);
console.log(d.points[0].data.customdata[0]);
});
}"
X <- data.frame(x = c(1, 2, 1, 2), y = c(1, 1, 2, 2), z = as.character(1:4), mydata = letters[1:4])
gg <- ggplot(X, aes(x = x, y = y, customdata = mydata)) + geom_tile(aes(fill = z))
ggplotly(gg) %>% onRender(js)
然而,当 z
作为数值变量输入时,自定义数据的结构表现异常:
X <- data.frame(x = c(1, 2, 1, 2), y = c(1, 1, 2, 2), z = 1:4, mydata = letters[1:4])
gg <- ggplot(X, aes(x = x, y = y, customdata = mydata)) + geom_tile(aes(fill = z))
ggplotly(gg) %>% onRender(js)
编辑
@ismirsehregal 提供了适用于上述示例的解决方案。然而,似乎customdata
将矢量数据照原样,这似乎是错误的。因此,如果我们更改 X
的顺序,js
脚本将停止工作。
展示:
library(plotly)
library(htmlwidgets)
js <- "function(el, x) {
el.on('plotly_click', function(d) {
var zdimensions = [ 0, 0 ];
var vecindex = 0;
var clickedcustomdata = '';
var zdimensions = [ d.points[0].data.z.length, d.points[0].data.z[0].length ];
vecindex = d.points[0].pointIndex[0]*zdimensions[1] + d.points[0].pointIndex[1];
clickedcustomdata = d.points[0].data.customdata[vecindex];
console.log(d);
console.log(clickedcustomdata);
});
}"
X <- data.frame(x = c(1, 2, 3, 1, 2, 3),
y = c(1, 1, 1, 2, 2, 2),
z = 1:6,
mydata = letters[1:6])
X <- X[order(-X$z),]
gg <- ggplot(X, aes(x = x, y = y, customdata = mydata)) + geom_tile(aes(fill = z))
fig <- ggplotly(gg) %>% onRender(js)
fig
我想一个潜在的解决方案是预先在 R 中排序 X
以便它匹配矩阵顺序?
这是基于 pointIndex
的解决方法。
我正在根据提供的 pointIndex
:
customdata
的向量索引
library(plotly)
library(htmlwidgets)
js <- "function(el, x) {
el.on('plotly_click', function(d) {
var zdimensions = [ 0, 0 ];
var vecindex = 0;
var clickedcustomdata = '';
var zdimensions = [ d.points[0].data.z.length, d.points[0].data.z[0].length ];
vecindex = d.points[0].pointIndex[0]*zdimensions[1] + d.points[0].pointIndex[1];
clickedcustomdata = d.points[0].data.customdata[vecindex];
console.log(clickedcustomdata);
});
}"
X <- data.frame(x = c(1, 2, 1, 2, 1, 2), y = c(1, 1, 2, 2, 3, 3), z = 1:6, mydata = letters[1:6])
gg <- ggplot(X, aes(x = x, y = y, customdata = mydata)) + geom_tile(aes(fill = z))
fig <- ggplotly(gg) %>% onRender(js)
fig
This 对到达此处很有帮助。
我仍然鼓励您在 GitHub 上提交问题,所以这已正式修复。