我想使用
plotly::subplot
和以下代码创建一个背靠背的情节:
library(plotly)
df <- data.frame(x = c("A", "B", "C"), a = c(0.1, 0.2, 0.3), b = c(0.1, 0.2, 0.6))
p1 <- plot_ly(df) %>%
add_bars(x = ~a, y = ~x) %>%
layout(xaxis = list(tickformat = ".0%", autorange = "reversed"))
p2 <- plot_ly(df) %>%
add_bars(x = ~b, y = ~x) %>%
layout(xaxis = list(tickformat = ".0%"))
subplot(p1, p2, shareY = TRUE, shareX = TRUE, nrows = 1, margin = 0)
我的问题是左侧 x 轴刻度上的 10% 与右侧的宽度不同。如何解决?
在
range = list(0.6, 0)
中使用反向范围列表 p1
而不是 autorange
.
library(plotly)
p1 <- plot_ly(df) %>%
add_bars(x = ~a, y = ~x) %>%
layout(xaxis = list(tickformat = ".0%", range = list(0.6, 0)))
p2 <- plot_ly(df) %>%
add_bars(x = ~b, y = ~x) %>%
layout(xaxis = list(tickformat = ".0%"))
subplot(p1, p2, shareY = TRUE, shareX = TRUE, nrows = 1, margin = 0)
要缩小
p1
上的x 轴范围,请使用scaleanchor
。在这种情况下,我们可以将 autorange = "reversed"
保留在 p1
中。但是,margin = 0
中的subplot
参数在设置后似乎不起作用。因此,我们可能需要将 margin
操作为负值并设置刻度间隔 (tickvals
) 以避免在“0%”上重叠标签。
p1 <- plot_ly(df) %>%
add_bars(x = ~a, y = ~x) %>%
layout(xaxis = list(tickformat = ".0%", autorange = "reversed"))
p2 <- plot_ly(df) %>%
add_bars(x = ~b, y = ~x) %>%
layout(xaxis = list(tickformat = ".0%"))
subplot(p1, p2, shareY = TRUE, shareX = TRUE, nrows = 1, margin = -0.07) %>%
layout(xaxis = list(scaleanchor = "x2"), xaxis2 = list(tickvals = list(0.2, 0.4, 0.6)))
我们还可以通过将
a
列中的值转换为负值,然后将数据重塑为更长的格式来实现这一点。然后带有 barmode = "relative"
的单个图将为我们提供所需的结果。根据需要更改填充、边距和轴限制。
library(plotly)
library(dplyr)
library(tidyr)
data.frame(x = c("A", "B", "C"), a = c(0.1, 0.2, 0.3), b = c(0.1, 0.2, 0.6)) %>%
mutate(a = -a) %>%
pivot_longer(-x) %>%
plot_ly(x = ~value, y= ~x, type = 'bar', color= ~name) %>%
layout(barmode = 'relative',
xaxis = list(tickformat = ".0%"))