【发布时间】:2018-09-23 21:14:03
【问题描述】:
这是对这个问题的跟进:SO Q
上述问题的答案使用了将轴刻度变为指数的 JavaScript 代码。它适用于单个图上的单个轴。
在 subplot() 结构中运行它时,当我将其应用于最终图时,它仅适用于第一个图。
我正在寻找的修改是这些:
1:如何使它在子图上工作。我尝试在每个子图的构建中调用 JavaScript,但是所有图都没有指数。
2:让它同时适用于 x 和 y 轴(我试过了,失败了,哭了一点)
3:当轴不是数字时,使其不破坏宇宙(我的应用程序也可以绘制日期列,因此需要检查它是否实际上是数字输入)
4:如果可能,打印为 1.23E+1 而不是 1E+1
library(shiny)
library(plotly)
library(htmlwidgets)
ui <- fluidPage(
mainPanel(
plotlyOutput('myplotly')
)
)
server <- function(input, output, session) {
javascript <- "
function(el, x)
{
function fix_ticks()
{
ticks = Plotly.d3.selectAll('g.ytick').selectAll('text');
ticks.forEach(function(tick)
{
var num = parseInt(tick[0].innerHTML);
tick[0].innerHTML = num.toExponential();
})
}
el.on('plotly_afterplot', fix_ticks);
}"
output$myplotly <- renderPlotly({
myplots <- lapply(unique(mtcars$cyl), function(v) {
data <- mtcars[which(mtcars$cyl == v), ]
subp <- plot_ly(data = data,
x = rownames(data),
y = ~mpg,
type = "bar")
subp
})
p <- subplot(myplots, margin = 0.08)
p$elementId <- NULL ## to surpress warning of widgetid
p <- onRender(p, javascript)
p <- p %>% layout(margin =list(l = 60, r = 20, b = 160, t = 70) )
p
})
}
shinyApp(ui = ui, server = server)
更新 根据此处给出的答案建议,我现在正在运行以下代码来检查数字,然后适用于每个轴。我还没有得到最后一个处理负值的建议,它是使用 tick[0].innerHTML。我最终使用了第 1 点下答案下的建议,因为我无法让 tick[0].innerHTML 方法在 forEach 循环内工作。但是,针对先前评论的建议是回到 tick[0] 方法,我无法让一种方法完全起作用。
这是我在遇到负面问题之前最终使用的代码 -> NaN 问题
javascriptMPP <- "
function(el, x)
{
function isNumber(n) {
return (Object.prototype.toString.call(n) === '[object Number]' || Object.prototype.toString.call(n) === '[object String]') &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
}
function fixTicks()
{
ticks = Plotly.d3.selectAll('g.yaxislayer-above,g.xaxislayer-above').selectAll('text');
ticks.each(function(d)
{
if(parseInt(d.text) !== 0 )
{
var num = parseInt(d.text).toExponential(2);
Plotly.d3.select(this).text(num);
}
})
}
el.on('plotly_afterplot', fixTicks);
}"
【问题讨论】:
-
注意正确拼写 JavaScript 以避免与 Java 发生搜索冲突。
标签: javascript r plotly subplot