Plotly R:如何设置坐标轴标签和刻度标签之间的间距

16

除了更改边距外,是否有设置轴标签和轴刻度标签之间间距的方法?

示例绘图:

plot_ly(mtcars, x = ~ wt, y = ~ paste0(hp, '0000'))

就像上面示例图中一样,y轴标题与该轴的刻度标签重叠。有没有一种方法可以在它们之间设置间距?

如上例绘图,y轴标题与该轴刻度标签重叠,是否有一种方法可以在它们之间设置间距?


2
对于其他人来说,唯一有效的方法是同时使用支撑答案和边距答案。 - HCAI
5个回答

20

推荐解决方案

自从plotly v4.9.2以来,您可以使用新的standoff布局属性,它

设置轴标签和标题文本之间的距离(以px为单位)。默认值是轴刻度标签、标题font.size和轴linewidth的函数。请注意,轴标题位置始终受到边距的限制,因此实际的偏移距离始终小于设置或默认值。通过设置standoff并打开automargin,plotly.js将推动边距以适应给定的偏移距离处的轴标题。

示例:

plotly::plot_ly(mtcars, x = ~ wt, y = ~ paste0(hp, '0000')) %>%
  plotly::layout(yaxis = list(title = list(text = "Gross horsepower",
                                           standoff = 40L)))

enter image description here


过时的解决方案

问题

仅仅增加左边距如@Codutie在他的回答中建议只能在一定程度上帮助(至少在plotly v4.7.1+版本中是这样)。如下面的截图所示,左侧的大部分150像素边距都是浪费空间的: enter image description here

生成上述图表的R代码(来自@Codutie):

library(plotly)

plot_ly(mtcars, x = ~ wt, y = ~ paste0(hp, '0000')) %>%
  layout(margin = list(l = 150, r = 20, b = 10, t = 10))

由于Plotly的目标是响应式,它会自动完成大部分布局缩放——通常这是一件好事,因为您不必费太多周折就可以得到一个漂亮的图表。当然,Plotly的自动缩放结果并不总是完美的或者正是您想要的,这就是有很多专门的(布局)属性让您操纵绘图的某些方面。 不幸的是,没有属性可设置轴标签与轴本身(或轴刻度标签)之间的距离

解决办法(变通方法)

相反,您可以依靠以下变通方法通过设置适当的y轴标题字符串来操纵轴与其标签之间的距离:

plot_ly(mtcars, x = ~ wt, y = ~ paste0(hp, '0000')) %>%
    layout(margin = list(l = 150, r = 20, b = 10, t = 10),
           yaxis = list(title = paste0(c(rep(" ", 20),
                                         "Gross horsepower",
                                         rep(" ", 20),
                                         rep("\n ", 3)),
                                       collapse = "")))

这将导致: 输入图像描述 y轴标题组件的解释:
- rep("\n ", 3):这是增加距离的主要技巧,只需在实际标题("Gross horsepower")后缀换行符和不间断空格即可。 - rep(" ", 20):这是为了确保Plotly的自动缩放不会再次干扰而采取的额外措施——用40个不间断空格包装实际标题(当然可以更多/更少)。否则,文本将被放置在两个轴刻度之间,一旦绘图高度足够大,就会“物理”允许它——这会有点破坏我们手动设置距离的尝试,因为我们必须使用一个更大的换行符-不间断空格组合来再次获得相同的距离,并且更重要的是,距离将取决于绘图高度。在上面的绘图中,这并不是必需的,因为有足够的y轴刻度,您需要显示具有超过1000像素的高度的绘图才能达到那个关键点。

感谢,standoff 正是我所需要的。对于其他人来说,您可以将 ggplotly() 的输出导入到 layout() 中以更改 standoff 值,它将打印一个新标题,因此您需要执行例如 theme(axis.title.y = element_blank()) 来关闭原始标题。 - DaveArmstrong

5

使用standoff选项。

library(plotly)

y <- list(
  title = list(text="Y Axis",standoff=20)
)

plot_ly(mtcars, x = ~ wt, y = ~ paste0(hp, '0000'))%>%layout(yaxis=y)

4
您可以尝试通过像这样将边距添加到您的图表中来进行修改:

您可以尝试通过像这样将边距添加到您的图表中来进行修改:

m <- list(l=150, r=20, b=10, t=10) # l = left; r = right; t = top; b = bottom
plot_ly(mtcars, x = ~ wt, y = ~ paste0(hp, '0000')) %>% layout(margin=m)

希望这能帮到你?

谢谢您的回答,但我想避免那样做。我正在寻找一种自动化的方法,这样我就不需要为每个图形调整边距。 - r4ndomw4lk
@r4ndomw4lk 你可以编写一个函数来添加左边距(或者甚至是自定义标题,增加距离,就像我的下面的答案一样),以自动化处理事情,不是吗?例如 add_margin <- function(plotly_object) { plotly_object %>% layout(margin = list(l = 60)) } - Salim B

3

我通常使用ticksuffix选项来创建标签后面的额外空间。

layout(
      xaxis = list(title = "", automargin=T, ticksuffix = "%")
     ,yaxis = list(title = "", automargin=T, ticksuffix = "   ")
)

2
我在Python中处理这个问题的方法是简单地添加一个换行符和空格,然后你就可以创建一个分隔符的空白行。虽然有些取巧,但它确实有效。你可以在第二行看到它。"最初的回答"
 yaxis=go.layout.YAxis(
    title_text="<b>Number of Articles<br> </b>",
    titlefont=dict(size=12)),
    paper_bgcolor="white",
    title=go.layout.Title(
    xref="paper",
    x=0.5 
  )

最初的回答:

Before

改良后:

After


2
问题是在询问如何在R中实现这一点。据我所知,这与此无关。我尝试了一些类似于您在R中所做的东西,但并没有解决问题。 - bcstryker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接