Plotly R:如何添加属于框架的动态注释

Plotly R : how to add dynamic annotation which belongs to frame

我正在努力完成一项简单的任务。我有一个包含 3 列的数据库:

我构建了一个带有基于年份的框架的绘图条形图。所以我有一个滑块,可以让我显示每个年龄段的人数,而且这是逐年动画化的。

我想添加一个注释,显示框架年份的 Part60 值...我知道可以将 ggplot 发送到 ggplotly 函数,但是我想从头开始使用plot_ly 作为参数的函数(对我来说)更容易控制并遵循我的代码逻辑。

这是我的代码:

gH <- plot_ly(data = dataH,
              name = 'Hommes',
              marker = list(color = ispfPalette[4]),
              x = ~Pop,
              y = ~Age,
              frame = ~Annee)
gH <- gH %>% layout(yaxis = list(categoryorder="array",
                                 categoryarray=dataH$Age))
gH <- gH %>% layout(yaxis = list(title = '',
                                 zeroline = TRUE,
                                 showline = TRUE,
                                 showticklabels = TRUE,
                                 showgrid = FALSE), 
                    xaxis = list(title = '',
                                 zeroline = TRUE,
                                 showline = TRUE,
                                 autorange = "reversed"),
                    shapes = hline(60)) 
gH <- gH %>% add_annotations(
  x = 3000,
  y = 62,
  text = 'Part des 60 ans et + : 12 %',
  showarrow = F,
  color = ispfPalette[8]

其中 text = 'Part des 60 ans et + : 12 %' 应该替换为允许我获得属于滑块年份的值的内容。

有人可以帮我做吗?

在此先感谢您的大力帮助。

因为我没有你的数据,所以很难给你最好的答案。虽然,这里有一种方法,您可以在其中添加在整个动画中变化的文本。

library(plotly)
library(tidyverse)

data(gapminder, package = "gapminder")
str(gapminder)

funModeling::df_status(gapminder)
# continent, lifeExp, year

gap <- gapminder %>% group_by(year, continent) %>%
  summarise(Expectancy = mean(lifeExp))

# plot 
p1 <- plot_ly(gap, x = ~Expectancy, y = ~continent,
              frame = ~year, type = 'bar', 
              showlegend = F,
              hovertemplate = paste0("Continent: %{y}<br>",
                                     "<extra></extra>"),
              texttemplate = "Life Expectancy: %{x:.2f}") %>%
  layout(yaxis=list(title=""), 
         xaxis=list(title="Average Life Expectancy per Continent By Year"),
         title=list(text=paste("Fancy Title")),
         margin = list(t = 100))
p1

如果您想要制作动画的文本没有连接到每个标记(条、点、线),那么您可以这样做。

# Something to add in the annotation text
gap2 <- gap %>% filter(continent == "Asia") %>% 
  droplevels() %>% 
  arrange(year)

# build to see frames
p2 <- plotly_build(p1)

# modify frames; need an annotation for each frame
# make sure the data is in order by year (order by frame)
lapply(1:nrow(gap2), # for each frame
       function(i){
         annotation = list(
           data = gap2,
           type = "text",
           x = 77,
           y = .5,
           yref = "paper",
           showarrow = F,
           text = paste0("Asian Life Expectancy<br>", 
                         sprintf("%.2f", gap2[i, ]$Expectancy)), 
           font = list(color = "#b21e29", size = 16))
         p2$x$frames[[i]]$layout <<- list(annotations = list(annotation)) # change plot
       })
p2

如果有任何不清楚的地方,请告诉我。