R:ggplot 和 plotly 轴边距不会改变

Posted

技术标签:

【中文标题】R:ggplot 和 plotly 轴边距不会改变【英文标题】:R: ggplot and plotly axis margin won't change 【发布时间】:2017-08-03 10:45:36 【问题描述】:

我在阻止 y 轴文本与使用 ggplotly 周围 ggplot 的刻度重叠时遇到问题。我怎样才能解决这个问题?我试过以下代码:

set.seed(395)
df1<- data.frame(CO2= c(cumsum(rnorm(1*36)), cumsum(rnorm(1*36))),
                  Group= rep(c("A","B"), each=36),
                  Segment=rep(seq(1,12),each=36))

plot<-ggplot(df1, aes(CO2, fill = Group)) +
           geom_density(alpha = 0.8)+
           facet_wrap(~ Segment)+
           theme_bw()+
           labs(x="CO2", y="density")
#Shouldn't the following work?
    pb <- plotly_build(plot)
    pb$layout$margin$l <- 200
    pb$layout$margin$b <- 100
    pb

【问题讨论】:

你试过这个吗:***.com/questions/14487188/…? 它似乎没有任何区别。我应该澄清我正在使用 ggplotly 我收到了Error in eval(expr, envir, enclos) : object 'y' not foundggplot 电话。 你的例子不起作用;我有没有尝试过类似 pb %>% layout(margin = list(t=150, l = 150, r =150, b=150)) 【参考方案1】:

我发现上面的两个答案都非常有用。但是,我注意到上面给出的layout_ggplotly() 函数只有在 x 和 y 轴标题存在时才能正常工作。如果缺少其中任何一个(例如,由于theme(axis.title.x = element_blank())),则使用...[[1]]......[[2]]... 的位置引用指的是错误的标题/注释。

我在我的项目中编写了一个函数来解决这种限制,我相信这是建立在以前的答案之上的。

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

【讨论】:

【参考方案2】:

从Github 找到一个优雅地解决了这个问题的答案。

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

【讨论】:

【参考方案3】:

让我们使用来自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)

我们可以按照 MLavoie 的建议移动调整 margins,但随后我们的轴图例也会移动。

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

轴标签其实不是标签而是注解,所以我们先移动一下。可以查询图中注解的结构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>

好的,所以注释存储在 15 个列表中; "lifeExp" 是该列表的第二个([[2]]) 元素。在这种情况下,“x”([['x']])和“y”值分别控制左右/上下移动。

# 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))

【讨论】:

谢谢!这是一种享受!您对此代码或文档有任何参考吗?您正在调整的是情节还是 ggplot 功能? @HCAI:很高兴它成功了!边距是一个绘图布局属性(我添加了一个指向原始答案的链接),第二部分是 ggplot 的调整/破解以绘图转换结果。转换通常效果很好,但有时需要一些帮助。 当我尝试这个时,我得到:*tmp*[[2]] 中的错误:下标越界 @MichaelSzczepaniak:我刚刚再次尝试,代码仍然适用于我。您可以将您的代码和设置作为单独的问题发布吗? @Max:谢谢回复。我在这里发布了另一个代码问题:***.com/questions/47523919/…

以上是关于R:ggplot 和 plotly 轴边距不会改变的主要内容,如果未能解决你的问题,请参考以下文章

如何在ggarrange ggpubr ggplot中调整边距(轴元素消失)R

R语言可视化包ggplot2包改变边距(margin)实战(Modify the Margins)

R语言ggplot2可视化改变线图(line plot)中线条的色彩实战

R语言ggplot2可视化密度图(density plot)改变密度图下的填充色实战

R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(改变点的大小和形状)实战

R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(改变图例位置)实战(dot plot)