R: ggplot and plotly axis margin won't change

后端 未结 3 1572
心在旅途
心在旅途 2020-12-10 12:47

I\'m having problems stopping the y-axis text from overlapping with the ticks using ggplotly around ggplot. How can I fix this? I\'ve tried the fol

相关标签:
3条回答
  • 2020-12-10 13:32

    Let's use a simple reproducible example from here.

    library(gapminder)
    library(plotly)
    p <- ggplot(gapminder, aes(x=gdpPercap, y=lifeExp)) + geom_point() + scale_x_log10()
    p <- p + aes(color=continent) + facet_wrap(~year)
    gp <- ggplotly(p)
    

    We can move the adjust the margins as suggested by MLavoie but then our axis legend moves as well.

    gp %>% layout(margin = list(l = 75))
    

    The axis label is actually not a label but an annotation, so let's move it first. You can query the structure of the annotations in the graph gp:

    # find the annotation you want to move
    str(gp[['x']][['layout']][['annotations']]) 
    
    List of 15
     $ :List of 13
      ..$ text          : chr "gdpPercap"
      ..$ x             : num 0.5
      ..$ y             : num -0.0294
      ..$ showarrow     : logi FALSE
      ..$ ax            : num 0
      ..$ ay            : num 0
      ..$ font          :List of 3
      .. ..$ color : chr "rgba(0,0,0,1)"
      .. ..$ family: chr ""
      .. ..$ size  : num 14.6
      ..$ xref          : chr "paper"
      ..$ yref          : chr "paper"
      ..$ textangle     : num 0
      ..$ xanchor       : chr "center"
      ..$ yanchor       : chr "top"
      ..$ annotationType: chr "axis"
     $ :List of 13
      ..$ text          : chr "lifeExp"
      ..$ x             : num -0.0346
      ..$ y             : num 0.5
    .... <truncated>
    

    Ok, so annotations are stored in a list of 15; "lifeExp" is the second([[2]]) element of this list. The "x" ([['x']]) and "y" values control the movement left and right/up and down in this case, respectively.

    # Check current x-location of x-axis label
    gp[['x']][['layout']][['annotations']][[2]][['x']]
    [1] -0.03459532
    
    # Move the label further to the left
    gp[['x']][['layout']][['annotations']][[2]][['x']] <- -0.1
    gp %>% layout(margin = list(l = 75))
    

    0 讨论(0)
  • 2020-12-10 13:37

    I found both answers above quite useful. However, I noticed that the layout_ggplotly() function given above works correctly only when x and y axis titles exist. If either of those is missing -- for example, as a result of theme(axis.title.x = element_blank()) -- then positional reference using ...[[1]]... and ...[[2]]... refers to wrong titles / annotations.

    I wrote a function that I used in my project to address such limitation, I believe this builds up on the previous answers.

    annotatify <- function(gg, x.y = -0.05, y.x = -0.05) {
      wip <- gg[['x']][['layout']][['annotations']] %>% 
        enframe() %>%
        mutate(value = map(value, as_tibble)) %>% 
        unnest(cols = c(value)) %>% 
        filter(!is.na(annotationType)) %>% 
        mutate(
          x = case_when(x == 0.5 ~ x, TRUE ~ x.y),
          y = case_when(y == 0.5 ~ y, TRUE ~ y.x)
        ) %>% 
        select(name, text, x, y) %>% 
        unique()
    
      if (nrow(wip) == 2) {
        for (i in 1:nrow(wip)) {
          if (wip$x[i] == 0.50) {
            gg[['x']][['layout']][['annotations']][[1]][['y']] <- wip$y[i]
          } else {
            gg[['x']][['layout']][['annotations']][[2]][['x']] <- wip$x[i]
          }
        }
      } else if (wip$y == 0.5) {
        gg[['x']][['layout']][['annotations']][[1]][['x']] <- wip$x
      } else {
        gg[['x']][['layout']][['annotations']][[1]][['y']] <- wip$y
      }
    
      gg
    }
    
    0 讨论(0)
  • 2020-12-10 13:46

    Find an answer from Github that solved this problem elegantly.

    layout_ggplotly <- function(gg, x = -0.02, y = -0.08){
      # The 1 and 2 goes into the list that contains the options for the x and y axis labels respectively
      gg[['x']][['layout']][['annotations']][[1]][['y']] <- x
      gg[['x']][['layout']][['annotations']][[2]][['x']] <- y
      gg
    }
    gp %>% layout_ggplotly
    
    0 讨论(0)
提交回复
热议问题