You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R Plotly能否实现Y轴镜像?如何绘制同位置双重复数据柱状图

在R Plotly中实现镜像Y轴+同位置叠加柱状图

当然可以实现!刚好我做过类似的需求,下面给你一个完整的实现方案,完全不用把数据转成负值~

核心思路

要实现你想要的效果,关键是利用Plotly的双Y轴叠加功能:其中一个Y轴设置为反转刻度(实现镜像),然后让两组柱状图分别绑定到不同的Y轴,同时指定它们在同一X位置显示。

完整代码示例

直接运行下面的代码,你可以替换成自己的真实数据:

library(plotly)

# 准备示例数据(两组重复数值,可替换为你的数据)
df <- data.frame(
  category = c("类别A", "类别B", "类别C", "类别D"),
  常规组数据 = c(12, 28, 18, 35),
  镜像组数据 = c(12, 28, 18, 35)
)

# 构建Plotly图表
p <- plot_ly(df) %>%
  # 第一组:绑定左侧常规Y轴
  add_bars(
    x = ~category,
    y = ~常规组数据,
    name = "常规Y轴组",
    yaxis = "y",
    marker = list(color = "#2ca02c")
  ) %>%
  # 第二组:绑定右侧镜像Y轴
  add_bars(
    x = ~category,
    y = ~镜像组数据,
    name = "镜像Y轴组",
    yaxis = "y2",
    marker = list(color = "#d62728")
  ) %>%
  # 布局配置:重点是镜像Y轴的设置
  layout(
    title = "镜像Y轴同位置叠加柱状图",
    xaxis = list(title = "分类标签"),
    # 左侧常规Y轴
    yaxis = list(
      title = "常规Y轴",
      side = "left",
      range = c(0, max(df$常规组数据) * 1.1),  # 预留顶部空间
      showgrid = TRUE
    ),
    # 右侧镜像Y轴:核心参数
    yaxis2 = list(
      title = "镜像Y轴",
      side = "right",
      overlaying = "y",  # 和左侧Y轴重叠
      autorange = "reversed",  # 反转刻度实现镜像,无需转负
      range = c(0, max(df$镜像组数据) * 1.1),  # 和左侧Y轴范围保持一致
      showgrid = FALSE  # 关闭网格避免重叠混乱
    ),
    barmode = "overlay",  # 允许两组柱子在同一位置叠加
    legend = list(x = 0.05, y = 1.1, orientation = "h")  # 调整图例位置
  )

# 展示图表
p

关键参数解释

  • yaxis2 = list(overlaying = "y"):让右侧Y轴和左侧Y轴重叠,保证两组柱子在同一X位置显示。
  • autorange = "reversed":反转右侧Y轴刻度,正数会从顶部向下绘制,完美实现镜像效果,完全不需要修改原始数据的正负。
  • barmode = "overlay":确保两组柱状图叠加而非分置两侧,符合你的需求。

自定义调整建议

如果需要优化效果,可以尝试:

  • 调整柱子的opacity参数(比如opacity = 0.7),让叠加部分更清晰。
  • 自定义Y轴的刻度间隔、颜色等样式。
  • 如果两组数据范围不同,分别设置两个Y轴的range参数,保证镜像比例协调。

内容的提问来源于stack exchange,提问作者Corsair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:13:46