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
问题原因
- 因子设置函数用错:R中
as.factor()不支持levels传参,上述因子设置代码不会生效,Class列的因子顺序会按默认字符排序规则生成,并非指定顺序。 - 颜色映射逻辑错误:
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
相关产品推荐
相关产品推荐

