使用ggplotly结合frame制作动画直方图时遇报错的解决咨询
修复ggplotly动画直方图报错的方案
错误原因
直接在ggplot的aes()中添加frame = day后转成ggplotly会报错,因为geom_histogram会对数据做统计变换(生成bin的计数),而plotly的frame参数需要基于原始数据的分组关联,统计变换后的数据结构和原始frame分组不匹配,导致出现invalid argument to unary operator错误。
解决方案1:预计算直方图统计数据,用geom_bar制作动画
先按day分组计算每个bin的计数,再构建ggplot并转成ggplotly:
set.seed(7) df = data.frame( day = factor(rep(1:7, each = 100)), value = runif(700, 0, 1) ) library(ggplot2) library(plotly) library(dplyr) # 预计算每个day对应的直方图bin和计数 df_hist <- df %>% group_by(day) %>% mutate(bin = cut(value, breaks = seq(0, 1, by = 0.05))) %>% # 自定义bin宽度 count(bin, .drop = FALSE) %>% mutate(bin_start = as.numeric(sub("\\((.*),.*\\]", "\\1", bin))) # 提取bin起始值用于x轴 # 构建ggplot并转成ggplotly p <- ggplot(df_hist, aes(x = bin_start, y = n, frame = day)) + geom_bar(stat = "identity", width = 0.05) + # 宽度匹配bin间隔 xlab("value") + ylab("Count") ggplotly(p)
解决方案2:使用plotly原生语法制作动画直方图
跳过ggplot,直接用plotly原生函数构建动画,适配性更强:
set.seed(7) df = data.frame( day = factor(rep(1:7, each = 100)), value = runif(700, 0, 1) ) library(plotly) plot_ly(df, x = ~value, frame = ~day) %>% add_histogram(nbinsx = 20) %>% # 自定义bin数量 layout(xaxis = list(title = "value"), yaxis = list(title = "Count"))
以上两种方法都能生成按day切换的动画直方图,解决原代码的报错问题。
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

