Reduce number of gridlines in plotly scatter plots with log scale in R shiny

不羁岁月 提交于 2019-12-06 14:13:16

For the 2D scatterplot, you can draw your own grid lines using the shapes option in layout. You also then suppress the gridlines using showgrid = FALSE.

shinyApp(
  ui = fluidPage( plotlyOutput('plot') ),

  server = function(input, output) {

    hline <- function(y = 0, color = "grey", width=0.1) {
      list(type = "line", x0 = 0, x1 = 1, xref = "paper",
        y0 = y, y1 = y, line = list(color = color, width=width))
    }

    output$plot <- renderPlotly ({
      mtcars <- rbind(mtcars, mtcars*1000, mtcars/1000)  #create data with big logarithmic range
      maxlog <- round(log10(max(mtcars[['mpg']][mtcars[['mpg']]>0], mtcars[['disp']][mtcars[['disp']]>0])), digits = 0) +1 # determine max log needed
      minlog <- round(log10(min(mtcars[['mpg']][mtcars[['mpg']]>0], mtcars[['disp']][mtcars[['disp']]>0])), digits = 0) -1 # determine min log needed
      logrange <- (maxlog - minlog)*9 +1 # get the distance between smallest and largest log power
      tval <- sort(as.vector(sapply(seq(1,9), function(x) x*10^seq(minlog, 

        maxlog)))) #generates a sequence of numbers in logarithmic divisions
      ttxt <- rep("",length(tval))  # no label at most of the ticks
      ttxt[seq(1,logrange,9)] <- formatC(tval, format = "e", digits = 2)[seq(1,logrange,9)] # every 9th tick is labelled

      p <- plot_ly(source = 'ThresholdScatter')
      p <- add_trace(p, data = mtcars, 
        x = mtcars[['mpg']], 
        y = mtcars[['disp']],
        type = 'scatter', 
        mode = 'markers',
        marker = list(size = 2)) 

      p <- layout(p,autosize = F, width = 500, height = 500,
        yaxis = list(type="log",
          zeroline=F, showline=T, showgrid=F,
          ticks="outside",
          tickvals=tval,
          ticktext=ttxt),
        xaxis = list(type="log",
          zeroline=F, showline=T, showgrid=F,
          ticks="outside",
          tickvals=tval,
          ticktext=ttxt),
        shapes = lapply(10^(-1:6), hline))
    })
  }
)

Unfortunately, I don't think you can use this approach in the 3d plot, as shapes do not have a z dimension. You could do something similar using add_lines instead of shapes, but this won't be quite as neat.

In Python, for the 3D plot, specify all Layout attributes within a scene dict, as following:

layout = go.Layout(
        margin=dict(
        l=0,
        r=0,
        b=0,
        t=0
    ),
    scene=dict(
    xaxis=dict(
        type='log',
               autorange=True,
               title='L1'))
)

I'd assume the same functionality exists in R for the latest version of plotly.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!