使用R Shiny中的对数刻度减少绘图散点图中的网格线数量

时间:2019-02-10 00:13:04

标签: r shiny plotly gridlines

我已经构建了以下测试应用程序,在该应用程序中,我解决了该问题,以将刻度线标签作为科学注释获得,但是现在我希望将网格线的数量减少到仅放置在“主要”刻度线处,即有文字标签的标签。 这个问题是根据之前SO question

的讨论/评论发布的

由于我正在使用这两种方法,因此我想找到一种适用于2D和3D散点图的方法。

这是3D应用程序。

    library(shiny)
    library(plotly)

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

      server = function(input, output) {
        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],mtcars[['cyl']][mtcars[['cyl']]>0])), digits = 0) +1 # determine max log needed
          minlog <- round(log10(min(mtcars[['mpg']][mtcars[['mpg']]>0], mtcars[['disp']][mtcars[['disp']]>0],mtcars[['cyl']][mtcars[['cyl']]>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']],
                      z = mtcars[['cyl']],
                      type = 'scatter3d', 
                      mode = 'markers',
                      marker = list(size = 2)) 

      p <- layout(p, autosize = F, width = 500, height = 500,
                  scene = list(yaxis = list(type="log",
                                            zeroline=F, showline=T, 
                                            ticks="outside",
                                            tickvals=tval,
                                            ticktext=ttxt),
                               xaxis = list(type="log",
                                            zeroline=F, showline=T, 
                                            ticks="outside",
                                            tickvals=tval,
                                            ticktext=ttxt),
                               zaxis = list(type="log",
                                            zeroline=F, showline=T, 
                                            ticks="outside",
                                            tickvals=tval,
                                            ticktext=ttxt),
                               camera = list(eye = list(x = -1.5, y = 1.5, z = 1.5))))
    })
  }
    )

,但相同,但为二维

        library(shiny)
        library(plotly)

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

          server = function(input, output) {
            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, 
                                         ticks="outside",
                                         tickvals=tval,
                                         ticktext=ttxt),
                          xaxis = list(type="log",
                                       zeroline=F, showline=T, 
                                       ticks="outside",
                                       tickvals=tval,
                                       ticktext=ttxt))
            })
          }


  )

2 个答案:

答案 0 :(得分:1)

对于2D散点图,可以使用}, 中的shapes选项绘制自己的网格线。然后,您还可以使用layout取消网格线。

showgrid = FALSE

enter image description here

不幸的是,我不认为您不能在3d图中使用此方法,因为形状没有z维度。您可以使用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)) }) } ) 代替形状来做类似的事情,但这不会那么整洁。

答案 1 :(得分:0)

在Python中,对于3D图,在scene字典中指定所有布局属性,如下所示:

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

我认为R的最新版本的R中存在相同的功能。

enter image description here