【发布时间】:2017-04-05 10:49:14
【问题描述】:
除了更改边距之外,还有什么方法可以设置轴标签和轴刻度标签之间的间距?
示例图:
plot_ly(mtcars, x = ~ wt, y = ~ paste0(hp, '0000'))
在上面的示例图中,y 轴的标题与该轴的刻度标签重叠。有没有办法在它们之间设置间距?
【问题讨论】:
-
对于看到这一点的其他人来说,唯一有效的方法是结合使用对峙答案和边缘答案。
除了更改边距之外,还有什么方法可以设置轴标签和轴刻度标签之间的间距?
示例图:
plot_ly(mtcars, x = ~ wt, y = ~ paste0(hp, '0000'))
在上面的示例图中,y 轴的标题与该轴的刻度标签重叠。有没有办法在它们之间设置间距?
【问题讨论】:
由于plotly v4.9.2,您可以使用新的standoff layout attribute 其中
设置轴标签和标题文本之间的间距(以 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)))
增加左边距as @Codutie suggests in his answer 确实在一定程度上有所帮助(至少在 plotly v4.7.1+ 中)。左边的 150 像素边距中的大部分都是浪费的空间,如下面的屏幕截图所示:
生成上述图的 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 的自动缩放结果并不总是完美的或完全不是您想要实现的,这就是为什么 there are plenty of dedicated (layout) attributes 允许您操纵情节的某些方面。 很遗憾,没有设置轴标签与轴本身之间距离的属性(或轴刻度标签)。
相反,您可以依靠以下解决方法通过设置适当的 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 个不间断空格中(当然可以更多/更少)。否则,文本 Gross horsepower 将被放置在两个轴刻度之间,只要绘图高度足够大以“物理”允许它 - 这会有点挫败我们手动设置距离的尝试,因为我们会必须使用更大的换行符 - 非破坏空间组合才能再次获得相同的距离,更重要的是 - 距离将取决于地块高度。在上面的图中,这并不是必需的,因为要显示高度超过 1000 像素的图,您需要显示尽可能多的 y 轴刻度才能达到该临界点。【讨论】:
您可以尝试通过将边距添加到图表中来修改边距,如下所示:
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)
希望这有帮助吗?
【讨论】:
add_margin <- function(plotly_object) { plotly_object %>% layout(margin = list(l = 60)) }
我通常做的是使用 ticksuffix 选项,它可以在标签后面创建额外的空间。
layout(
xaxis = list(title = "", automargin=T, ticksuffix = "%")
,yaxis = list(title = "", automargin=T, ticksuffix = " ")
)
【讨论】:
使用 standoff 选项
library(plotly)
y <- list(
title = list(text="Y Axis",standoff=20)
)
plot_ly(mtcars, x = ~ wt, y = ~ paste0(hp, '0000'))%>%layout(yaxis=y)
【讨论】:
我在 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
)
之前:
之后:
【讨论】: