如何在具有多个轴的 Plotly (R) 子图中正确放置轴标签?
How to correctly place axis labels in Plotly (R) subplots with multiple axes?
我正在尝试使用 plotly (v. 4.9.2.1) 在 R 中创建一个图,三个面板共享一个 x-axis,最后一个显示两个变量,第二个显示在单独的 y-axis。我在下面制作了一个玩具示例,其中包含重现我遇到的基本问题的虚假数据。问题是,一旦我包含第二个 y-axis,我就无法让 x-axis 标题正确显示在所有图的底部。在下面的代码中,我专门为所有跟踪输入了 xaxis
参数,尽管删除它没有任何区别。此外,将 x 标题放在其他绘图的布局中也不会改变任何内容,最终绘图中的边距是为了确保 y-axis 刻度标签可见并且不会改变轴标签的位置.
set.seed(123)
x1 <- seq(from=1, to=100, by=5)
x2 <- seq(from=1, to=100, by=3)
x3 <- seq(from=1, to=100, by=2)
x4 <- c(1,23,50,80)
y1 <- rnorm(length(x1))
y2 <- rnorm(length(x2))
y3 <- rnorm(length(x3))
y4 <- c(0,10,0,10)
p1 <- plot_ly(showlegend=FALSE) %>%
add_markers(x=x1, y=y1, xaxis='x')
p2 <- plot_ly(showlegend=FALSE) %>%
add_markers(x=x2, y=y2, xaxis='x')
p3 <- plot_ly(showlegend=FALSE) %>%
add_markers(x=x3, y=y3, yaxis='y3', xaxis='x') %>%
add_lines(x=x4, y=y4, line=list(shape='hv'), yaxis='y4', xaxis='x') %>%
layout(yaxis3=list(overlaying='y4'),
yaxis4=list(side='right'),
margin=list(r=50))
subplot(p1, p2, p3, nrows = 3, shareX=TRUE) %>% layout(xaxis=list(title='Time'))
x 轴默认锚定到默认 "yaxis"。在你的情况下,它是最上面的一个。
为了让 xaxis 放在底部,你可以修改它的 anchor 为另一个 yaxis:"y2" 用于中间子图,"y3" 或 "y4" 用于底部子图.
为此,请在添加布局时指定 x 轴的锚点属性:
layout(xaxis=list(title='Time', anchor="y3"))
注意:要检查您的代码并查看您的轴如何相互锚定,您可以以 json 格式打印绘图图形的完整结构:
fig <- subplot(p1, p2, p3, nrows = 3, shareX=TRUE)
fig <- layout(fig, xaxis=list(title='Time', anchor="y3"))
plotly_json(fig)
您将能够检查:
"layout": {
"xaxis": {
"domain": [0, 1],
"automargin": true,
"title": "Time",
"anchor": "yaxis2"
},
"yaxis3": {
"overlaying": "y4",
"anchor": "x",
"domain": [0, 0.313333333333333]
},
...
我正在尝试使用 plotly (v. 4.9.2.1) 在 R 中创建一个图,三个面板共享一个 x-axis,最后一个显示两个变量,第二个显示在单独的 y-axis。我在下面制作了一个玩具示例,其中包含重现我遇到的基本问题的虚假数据。问题是,一旦我包含第二个 y-axis,我就无法让 x-axis 标题正确显示在所有图的底部。在下面的代码中,我专门为所有跟踪输入了 xaxis
参数,尽管删除它没有任何区别。此外,将 x 标题放在其他绘图的布局中也不会改变任何内容,最终绘图中的边距是为了确保 y-axis 刻度标签可见并且不会改变轴标签的位置.
set.seed(123)
x1 <- seq(from=1, to=100, by=5)
x2 <- seq(from=1, to=100, by=3)
x3 <- seq(from=1, to=100, by=2)
x4 <- c(1,23,50,80)
y1 <- rnorm(length(x1))
y2 <- rnorm(length(x2))
y3 <- rnorm(length(x3))
y4 <- c(0,10,0,10)
p1 <- plot_ly(showlegend=FALSE) %>%
add_markers(x=x1, y=y1, xaxis='x')
p2 <- plot_ly(showlegend=FALSE) %>%
add_markers(x=x2, y=y2, xaxis='x')
p3 <- plot_ly(showlegend=FALSE) %>%
add_markers(x=x3, y=y3, yaxis='y3', xaxis='x') %>%
add_lines(x=x4, y=y4, line=list(shape='hv'), yaxis='y4', xaxis='x') %>%
layout(yaxis3=list(overlaying='y4'),
yaxis4=list(side='right'),
margin=list(r=50))
subplot(p1, p2, p3, nrows = 3, shareX=TRUE) %>% layout(xaxis=list(title='Time'))
x 轴默认锚定到默认 "yaxis"。在你的情况下,它是最上面的一个。
为了让 xaxis 放在底部,你可以修改它的 anchor 为另一个 yaxis:"y2" 用于中间子图,"y3" 或 "y4" 用于底部子图.
为此,请在添加布局时指定 x 轴的锚点属性:
layout(xaxis=list(title='Time', anchor="y3"))
注意:要检查您的代码并查看您的轴如何相互锚定,您可以以 json 格式打印绘图图形的完整结构:
fig <- subplot(p1, p2, p3, nrows = 3, shareX=TRUE)
fig <- layout(fig, xaxis=list(title='Time', anchor="y3"))
plotly_json(fig)
您将能够检查:
"layout": {
"xaxis": {
"domain": [0, 1],
"automargin": true,
"title": "Time",
"anchor": "yaxis2"
},
"yaxis3": {
"overlaying": "y4",
"anchor": "x",
"domain": [0, 0.313333333333333]
},
...