You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:01:59