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

R语言Plotly气泡地图如何按预设因子顺序调整图例排序

问题描述

使用R的Plotly绘制气泡地图时,已预先设置分类列Class的因子顺序,希望图例按预设因子层级展示,但实际输出图例顺序不符合预期。
相关前置因子设置代码:

COME1039$Class <- as.factor(COME1039$Class, levels = c('moins de 100 000 F.CFP',
                                                       'entre 100 000 et 5 millions F.CFP',
                                                       'entre 5 millions et 1 milliard F.CFP',
                                                       'entre 1 milliard et 20 milliards F.CFP',
                                                       'plus de 20 milliards F.CFP'))

完整绘图代码:

g <- list(
  scope = 'world',
  visible = F,
  showland = TRUE,
  landcolor = toRGB("#EAECEE"),
  showcountries = T,
  countrycolor = toRGB("#D6DBDF"),
  showocean = T,
  oceancolor = toRGB("#808B96")
)

COM.g1 <- plot_geo(data = COME1039,
                   sizes = c(1, 700))
COM.g1 <- COM.g1 %>% add_markers(
  x = ~LONGITUDE,
  y = ~LATITUDE,
  name = ~Class,
  size = ~`Poids Imports`,
  color = ~Color,
  colors=c(ispfPalette[c(1,2,3,7,6)]),
  text=sprintf("<b>%s</b> <br>Poids imports: %s tonnes<br>Valeur imports: %s millions de F.CFP",
               COME1039$NomISO,
               formatC(COME1039$`Poids Imports`/1000,
                       small.interval = ",",
                       digits = 1,
                       big.mark = " ",
                       decimal.mark = ",",
                       format = "f"),
               formatC(COME1039$`Valeur Imports`/1000000,
                       small.interval = ",",
                       digits = 1,
                       big.mark = " ",
                       decimal.mark = ",",
                       format = "f")),
  hovertemplate = "%{text}<extra></extra>"
)
COM.g1 <- COM.g1%>% layout(geo=g)
COM.g1 <- COM.g1%>% layout(dragmode=F)
COM.g1 <- COM.g1 %>% layout(showlegend=T)
COM.g1 <- COM.g1 %>% layout(legend = list(title=list(text='Valeurs des importations<br>'),
                                          orientation = "h",
                                          itemsizing='constant',
                                          x=0,
                                          y=0)) %>% hide_colorbar()
COM.g1
问题原因
  1. 因子设置函数用错:R中as.factor()不支持levels传参,上述因子设置代码不会生效,Class列的因子顺序会按默认字符排序规则生成,并非指定顺序。
  2. 颜色映射逻辑错误:add_markers()中将color映射到了存储颜色ID的Color列,Plotly生成图例时只会参考color参数绑定变量的取值顺序,不会参考name参数绑定的Class列顺序,即使Class顺序设置正确,图例也会按Color列的取值顺序排列。
解决步骤
  • 第一步:修正因子设置代码,将as.factor()替换为支持levels参数的factor()函数,确保Class列的层级顺序符合预期:
COME1039$Class <- factor(COME1039$Class, 
                         levels = c('moins de 100 000 F.CFP',
                                    'entre 100 000 et 5 millions F.CFP',
                                    'entre 5 millions et 1 milliard F.CFP',
                                    'entre 1 milliard et 20 milliards F.CFP',
                                    'plus de 20 milliards F.CFP'))
  • 第二步:修改add_markers()的映射规则,将color参数直接绑定到已经排好序的~Class列,保留colors参数的调色板顺序和Class层级顺序一一对应即可。由于Color和Class本身是一一对应关系,直接映射Class不会改变原有配色效果,还能让Plotly自动按Class的因子顺序生成图例。
    修正后的add_markers()核心代码如下:
COM.g1 <- COM.g1 %>% add_markers(
  x = ~LONGITUDE,
  y = ~LATITUDE,
  size = ~`Poids Imports`,
  color = ~Class,
  colors=c(ispfPalette[c(1,2,3,7,6)]),
  text=sprintf("<b>%s</b> <br>Poids imports: %s tonnes<br>Valeur imports: %s millions de F.CFP",
               COME1039$NomISO,
               formatC(COME1039$`Poids Imports`/1000,
                       small.interval = ",",
                       digits = 1,
                       big.mark = " ",
                       decimal.mark = ",",
                       format = "f"),
               formatC(COME1039$`Valeur Imports`/1000000,
                       small.interval = ",",
                       digits = 1,
                       big.mark = " ",
                       decimal.mark = ",",
                       format = "f")),
  hovertemplate = "%{text}<extra></extra>"
)

其余绘图代码无需改动,运行后图例就会严格按照预设的因子顺序展示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:45:52