基于dplyr汇总值绘制成本/产品总频数柱状图的技术问询
嘿,我来帮你搞定这个Plotly柱状图的需求!咱们一步步来,先解决相对频数的计算,再搞定绘图~
第一步:用dplyr计算频数&相对频数
首先得把你的likelyReasonFreq数据整理成适合绘图的格式。这里分两种常见数据结构来处理:
情况1:数据是长格式(已有区分cost/product的类别列)
假设你的数据里有category列(值为cost/product)和rank列(记录1-3的排名),我们先筛选有效数据,再统计频数和相对频数:
library(dplyr) library(plotly) plot_data <- likelyReasonFreq %>% # 筛选非NA且排名在1-3之间的记录 filter(!is.na(rank), rank %in% 1:3) %>% # 按类别统计频数 count(category, name = "frequency") %>% # 手动指定各类别的总样本量(你已经知道cost=38,product=101) mutate(total = case_when( category == "cost" ~ 38, category == "product" ~ 101 )) %>% # 计算相对频数 mutate(relative_frequency = frequency / total)
情况2:数据是宽格式(比如有cost_rank、product_rank两个独立列)
先把宽格式转成长格式,再重复上面的统计逻辑:
library(dplyr) library(plotly) library(tidyr) # 宽格式转长格式 long_data <- likelyReasonFreq %>% pivot_longer( cols = c(cost_rank, product_rank), # 替换成你实际的列名 names_to = "category", values_to = "rank" ) %>% mutate(category = stringr::str_remove(category, "_rank")) # 简化类别名为cost/product # 统计频数和相对频数 plot_data <- long_data %>% filter(!is.na(rank), rank %in% 1:3) %>% count(category, name = "frequency") %>% mutate(total = case_when( category == "cost" ~ 38, category == "product" ~ 101 )) %>% mutate(relative_frequency = frequency / total)
第二步:用Plotly绘制柱状图
现在有了整理好的plot_data,可以选择绘制频数或相对频数的柱状图:
频数柱状图
plot_ly(plot_data, x = ~category, y = ~frequency, type = "bar") %>% layout( title = "Cost vs Product Top3 Rank 频数统计", xaxis = list(title = "Cost/Product"), yaxis = list(title = "频数"), showlegend = FALSE, # 给柱子添加数值标签(可选) annotations = list( x = plot_data$category, y = plot_data$frequency, text = plot_data$frequency, xanchor = 'center', yanchor = 'bottom', showarrow = FALSE ) )
相对频数柱状图(百分比显示)
plot_ly(plot_data, x = ~category, y = ~relative_frequency, type = "bar") %>% layout( title = "Cost vs Product Top3 Rank 相对频数统计", xaxis = list(title = "Cost/Product"), yaxis = list(title = "相对频数", tickformat = ".0%"), # Y轴显示为百分比 showlegend = FALSE, # 添加百分比标签(可选) annotations = list( x = plot_data$category, y = plot_data$relative_frequency, text = paste0(round(plot_data$relative_frequency * 100, 1), "%"), xanchor = 'center', yanchor = 'bottom', showarrow = FALSE ) )
小提示
如果你的数据列名和示例里的不一样,记得替换成你实际的列名哦~ 比如排名列叫top_rank,就把代码里的rank换成top_rank就行。
内容的提问来源于stack exchange,提问作者Ellie
相关产品推荐
相关产品推荐

