如何在R管道中使用Plotly制作交互式分组条形图?
用Plotly在R管道中实现交互式分组条形图
问题背景
你作为R编程新手,希望用Plotly替代ggplot制作交互式分组条形图。原ggplot实现代码如下:
all_trips_v2 %>% mutate(weekday = wday(started_at, label = TRUE)) %>% group_by(member_casual, weekday) %>% summarise(number_of_rides = n() ,average_duration = mean(ride_length)) %>% arrange(member_casual, weekday) %>% ggplot(aes(x = weekday, y = number_of_rides, fill = member_casual)) + geom_col(position = "dodge")
你尝试在管道中用Plotly实现但未成功,代码如下:
all_trips_v2 %>% mutate(weekday = wday(started_at, label = TRUE)) %>% group_by(member_casual, weekday) %>% summarise(number_of_rides = n(), average_duration = mean(ride_length)) %>% arrange(member_casual, weekday) %>% plot_ly(all_trips_v2, x = ~weekday, y = ~number_of_rides, type = 'bar', name = 'member') %>% add_trace(y = n_distinct(all_trips_v2$member_casual), name = 'casual') %>% layout(yaxis = list(title = 'Average duration'), barmode = 'group')
你的疑问:是否可以在R管道中使用Plotly?或者有其他可行的实现方法?
解决方案
1. 管道中直接使用Plotly的正确写法
管道传递的是经过前序处理后的数据框,不需要在plot_ly中再次指定原始数据集all_trips_v2,用.指代管道传入的数据(或直接省略data参数,Plotly会自动识别)。同时无需手动拆分分组,利用color参数映射member_casual变量即可自动生成分组条形图:
all_trips_v2 %>% mutate(weekday = wday(started_at, label = TRUE)) %>% group_by(member_casual, weekday) %>% summarise(number_of_rides = n(), average_duration = mean(ride_length)) %>% arrange(member_casual, weekday) %>% plot_ly(x = ~weekday, y = ~number_of_rides, color = ~member_casual, type = 'bar', barmode = 'group') %>% layout(yaxis = list(title = "骑行次数"), xaxis = list(title = "工作日"), legend = list(title = list(text = "用户类型")))
2. 分步实现(适合新手理解)
如果觉得链式管道容易混淆,可以先将处理好的数据存为对象,再进行可视化:
# 第一步:处理数据 processed_data <- all_trips_v2 %>% mutate(weekday = wday(started_at, label = TRUE)) %>% group_by(member_casual, weekday) %>% summarise(number_of_rides = n(), average_duration = mean(ride_length)) %>% arrange(member_casual, weekday) # 第二步:Plotly可视化 plot_ly(processed_data, x = ~weekday, y = ~number_of_rides, color = ~member_casual, type = 'bar', barmode = 'group') %>% layout(yaxis = list(title = "骑行次数"), xaxis = list(title = "工作日"), legend = list(title = list(text = "用户类型")))
关键问题说明
你之前的代码存在两个核心问题:
- 错误地在
plot_ly中传入原始数据集all_trips_v2,而非管道处理后的数据; - 手动用
add_trace添加分组的逻辑错误,n_distinct(all_trips_v2$member_casual)仅计算用户类型数量,并非对应分组的骑行次数。
内容的提问来源于stack exchange,提问作者Spicy Ramen Noodles
相关产品推荐
相关产品推荐

