Plotly R:如何添加属于框架的动态注释
Plotly R : how to add dynamic annotation which belongs to frame
我正在努力完成一项简单的任务。我有一个包含 3 列的数据库:
- 年份(数字)
- 年龄(数字)
- 流行(数字)
- Part60:年龄 >= 60 岁的人所占百分比(类似于“60 岁以上人口的百分比:12%”的字符串)。该值对于一年中的每一行都是相同的。
数据集看起来像:
我构建了一个带有基于年份的框架的绘图条形图。所以我有一个滑块,可以让我显示每个年龄段的人数,而且这是逐年动画化的。
我想添加一个注释,显示框架年份的 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
如果有任何不清楚的地方,请告诉我。
我正在努力完成一项简单的任务。我有一个包含 3 列的数据库:
- 年份(数字)
- 年龄(数字)
- 流行(数字)
- Part60:年龄 >= 60 岁的人所占百分比(类似于“60 岁以上人口的百分比:12%”的字符串)。该值对于一年中的每一行都是相同的。 数据集看起来像:
我构建了一个带有基于年份的框架的绘图条形图。所以我有一个滑块,可以让我显示每个年龄段的人数,而且这是逐年动画化的。
我想添加一个注释,显示框架年份的 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
如果有任何不清楚的地方,请告诉我。