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

Plotly水平并排Choropleth子图失效及共用图例实现求助

解决Plotly子图水平排列失效及共用颜色条问题

问题原因

  1. 水平排列失效:两个地图的geo组件默认占据整个绘图区域,导致subplot(nrows=1)无法生效,只能垂直堆叠。
  2. 共用颜色条:默认每个choropleth图独立生成颜色条,需要统一颜色范围并合并为单个颜色条。

解决方案代码

library(plotly)
df <- read.csv("https://raw.githubusercontent.com/plotly/datasets/master/2011_us_ag_exports.csv")

# 定义统一的geo配置
g <- list(
  scope = 'usa',
  projection = list(type = 'albers usa'),
  showlakes = TRUE,
  lakecolor = toRGB('white')
)

# 计算两个变量的统一颜色范围,确保颜色刻度一致
z_min <- min(df$beef, df$pork)
z_max <- max(df$beef, df$pork)

# 第一个子图:设置geo的水平域为左半部分,保留颜色条
p1 <- plot_ly(
  z = df$beef, 
  text = df$hover, 
  locations = df$code, 
  type = 'choropleth', 
  locationmode = 'USA-states', 
  color = df$beef, 
  colors = 'Purples',
  zmin = z_min,  # 统一最小刻度
  zmax = z_max,  # 统一最大刻度
  colorbar = list(
    title = "Millions USD",
    x = 0.5,  # 颜色条居中放置
    xanchor = "center"
  )
) %>% 
  layout(
    geo = c(g, list(domain = list(x = c(0, 0.48))))  # 限定geo在左半区域
  )

# 第二个子图:设置geo的水平域为右半部分,关闭自身颜色条
p2 <- plot_ly(
  z = df$pork, 
  text = df$hover, 
  locations = df$code, 
  type = 'choropleth', 
  locationmode = 'USA-states', 
  color = df$pork, 
  colors = 'Purples',
  zmin = z_min,  # 统一最小刻度
  zmax = z_max,  # 统一最大刻度
  showscale = FALSE  # 关闭自身颜色条
) %>% 
  layout(
    geo = c(g, list(domain = list(x = c(0.52, 1))))  # 限定geo在右半区域
  )

# 生成子图,设置水平排列并调整边距
plotly::subplot(p1, p2, nrows = 1, margin = 0.05)

关键修改点

  • 水平排列:通过layout(geo = list(domain = list(x = ...)))分别指定两个geo组件的水平区域,避免重叠,配合subplot(nrows=1)实现并排显示。
  • 共用颜色条:
    • 用zmin和zmax统一两个图的颜色刻度范围,确保颜色对应的值一致。
    • 关闭其中一个图的颜色条(showscale = FALSE),将保留的颜色条通过x和xanchor设置在两个子图中间,实现共用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 18:53:26