R Plotly Bubblemap 中的图例按照因子顺序排序

Ben*_*ARD 4 maps r plotly

我正在制作一个气泡图,其中生成了两列,一列用于颜色 id(列颜色),一列用于引用 id 的文本(列类)。这是我个人的分类(颜色总是属于类别)。类是遵循我使用的特定顺序的一个因素:

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'))
Run Code Online (Sandbox Code Playgroud)

这是我的代码

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
Run Code Online (Sandbox Code Playgroud)

不幸的是,我的数据太大,无法添加到这里,但这是我得到的输出:

在此输入图像描述

如您所见,图例的顺序不是因子级别之一。如何获得?如果数据是强制性的,可以帮助您给我一个提示,我会尽力限制它们的大小。

非常感谢 !

Kat*_*Kat 7

Plotly 将会按字母顺序排列你的图例,你必须“让它”听。绘图中轨迹的顺序就是图例中项目出现的顺序。因此,如果您重新排列对象中的轨迹,您也会重新排列图例。

\n

我没有你的数据,所以我使用了一些数据rnaturalearth

\n

首先,我使用plot_geo. 然后我用来plotly_build()确保 Plotly 对象中有跟踪顺序。我曾经lapply调查过痕迹的当前顺序。然后我创建了一个新订单,重新排列了迹线,并再次绘制了它。

\n

最初的情节和构建。

\n
library(tidyverse)\nlibrary(plotly)\nlibrary(rnaturalearth)\n\ncanada <- ne_states(country = "Canada", returnclass = "SF")\nx = plot_geo(canada, sizes = c(1, 700)) %>% \n  add_markers(x = ~longitude, y = ~latitude,\n              name = ~name, color = ~name)\nx <- plotly_build(x)            # capture all elements of the object\n
Run Code Online (Sandbox Code Playgroud)\n

现在进行调查;这更多是为了让您可以看到这一切是如何结合在一起的。

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

在您的问题中,您表明您将图例元素作为一个因素。这也是我对这些数据所做的。

\n
can2 = canada %>% \n  mutate(name = ordered(name,\n                        levels = c("Manitoba", "New Brunswick", \n                                   "Newfoundland and Labrador", \n                                   "Northwest Territories", \n                                   "Alberta", "British Columbia", \n                                   "Nova Scotia", "Nunavut", \n                                   "Ontario", "Prince Edward Island", \n                                   "Qu\xc3\xa9bec", "Saskatchewan", "Yukon")))\n
Run Code Online (Sandbox Code Playgroud)\n

我使用这些数据对 Plotly 对象中的跟踪进行重新排序。这将创建一个向量。它从级别及其行号或顺序开始 (1:13)。然后我按级别按字母顺序排列数据(因此它与 Plotly 对象中的当前顺序匹配)。

\n

这组函数调用的输出是一个数字向量(即 5、6、1 等)。因为我有 13 个名字,所以我有 1:13。您也可以随时使其动态化1:length(levels(can2$name))

\n
# capture order\ndf1 = data.frame(who = levels(can2$name), ord = 1:13) %>% \n  arrange(who) %>% select(ord) %>% unlist()\n
Run Code Online (Sandbox Code Playgroud)\n

现在剩下的就是重新排列对象轨迹并将其可视化。

\n
x$x$data = x$x$data[order(c(df1))] # reorder the traces\nx      # visualize\n
Run Code Online (Sandbox Code Playgroud)\n

起初:

\n

在此输入图像描述

\n

重新排序的痕迹:

\n

在此输入图像描述

\n

  • 您的解决方案再次表现出色!噢,这是一个棘手的问题。您值得拥有声誉积分! (2认同)