plotly subplot 对每个 plot 应用不同的比例

问题描述 投票:0回答:2

我想使用

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% 与右侧的宽度不同。如何解决?

r plotly
2个回答
1
投票

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


1
投票

我们还可以通过将

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%"))

© www.soinside.com 2019 - 2024. All rights reserved.