按因子顺序在R Plotly气泡地图中排序图例。

4

我正在制作一个气泡地图,其中我生成了两列数据,一列用于颜色ID(Color列),另一列用于引用该ID的文本(Class列)。这是对我的个体进行分类的方式(颜色始终属于Class)。 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

很不幸,我的数据太大了,无法在此处添加,但这是我得到的输出结果:

enter image description here

如您所见,图例的顺序并不是因子水平的顺序。该怎么解决?如果需要数据来帮助您给我提示,我会尽量限制它们的大小。

非常感谢!


图例项目按照数据集中首次出现的顺序进行排序。在这里,您可以找到相关答案 - ismirsehregal
感谢您的回答。很抱歉,数据集已经按颜色列排序,因此也按类别列排序(以便能够按值而不是按字母顺序进行排序),因为这两列是相关联的。因此,类别列已经按我想要的顺序排列。但是图例仍然按字母顺序排列。 - Benjamin BERNARD
啊,我明白了。我也在这里遇到了这种行为(https://community.plotly.com/t/order-of-a-stack-bar-chart/9355/4),但没有得到答案。 - ismirsehregal
1个回答

7

Plotly将对您的图例进行字母排序,您需要“让它听从”。您绘制图形中数据序列的顺序是图例中项目出现的顺序。因此,如果您重新排列对象中的数据序列,则会改变图例的顺序。

由于我没有您的数据,所以我使用了一些来自rnaturalearth的数据。

首先,我使用plot_geo创建了一个图形。然后我使用plotly_build()确保了Plotly对象中的数据序列顺序。我使用lapply函数来研究当前数据序列的顺序。然后我创建了一个新的顺序,重新排列数据序列,并再次绘制了图形。

初始绘图和构建。

library(tidyverse)
library(plotly)
library(rnaturalearth)

canada <- ne_states(country = "Canada", returnclass = "SF")
x = plot_geo(canada, sizes = c(1, 700)) %>% 
  add_markers(x = ~longitude, y = ~latitude,
              name = ~name, color = ~name)
x <- plotly_build(x)            # capture all elements of the object

现在进行调查;这是为了让您看到所有内容是如何结合在一起的。

# what order are they in?
y = vector()
invisible(
  lapply(1:length(x$x$data), 
         function(i) {
           z <- x$x$data[[i]]$name
           message(i, " ", z)
         })
)
# 1 Alberta
# 2 British Columbia
# 3 Manitoba
# 4 New Brunswick
# 5 Newfoundland and Labrador
# 6 Northwest Territories
# 7 Nova Scotia
# 8 Nunavut
# 9 Ontario
# 10 Prince Edward Island
# 11 Québec
# 12 Saskatchewan
# 13 Yukon

在你的问题中,你展示了将图例元素转化为因子。这也是我在处理这份数据时所做的事情。
can2 = canada %>% 
  mutate(name = ordered(name,
                        levels = c("Manitoba", "New Brunswick", 
                                   "Newfoundland and Labrador", 
                                   "Northwest Territories", 
                                   "Alberta", "British Columbia", 
                                   "Nova Scotia", "Nunavut", 
                                   "Ontario", "Prince Edward Island", 
                                   "Québec", "Saskatchewan", "Yukon")))

我使用数据对Plotly对象中的跟踪进行了重新排序,创建了一个向量。它以级别及其行号或顺序(1:13)开始。然后,我按级别对数据进行了字母排序(这样它就与Plotly对象中的当前顺序相匹配)。
此组函数调用的输出是一组数字向量(例如5、6、1等)。由于我有13个名称,因此范围是1:13。您也可以将其设置为动态的,如1:length(levels(can2$name))
# capture order
df1 = data.frame(who = levels(can2$name), ord = 1:13) %>% 
  arrange(who) %>% select(ord) %>% unlist()

现在只需要重新排列对象轨迹并可视化它。
x$x$data = x$x$data[order(c(df1))] # reorder the traces
x      # visualize

Originally:

enter image description here

With reordered traces:

enter image description here


2
你的解决方案再次表现出色!这真是一个棘手的问题。你值得这些声望点数! - Benjamin BERNARD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接