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

Plotly R多分类图表数值显示异常及编码后图表异常问题

问题描述
  • 使用Plotly R构建多分类堆叠条形图时,图表显示数值与输入数据不匹配,悬停标签和轴标签也不对应:例如dsc_cat1=Cat1、dsc_cat3=Var 1、mth=1的数值应为6200.63,但图表显示近15k,悬停标签却显示8022.49(对应数据第4行)。
  • 将dsc_cat3中的"Var 5"重编码为"VAR 5"后,图表仅显示VAR 5分类,其余内容消失。
  • 当前使用Plotly版本为4.10.4。

示例数据

df <- structure(list(dsc_cat1 = c("Cat1", "Cat1", "Cat2", "Cat1", "Cat1", 
"Cat2", "Cat2", "Cat1", "Cat1", "Cat2", "Cat2", "Cat1", "Cat1", 
"Cat2", "Cat2", "Cat1", "Cat1", "Cat2", "Cat1", "Cat1", "Cat2", 
"Cat2"), dsc_cat3 = c("Var 1", "Var 2", "Var 3", "Var 1", "Var 2", 
"Var 3", "Var 4", "Var 1", "Var 2", "Var 3", "Var 4", "Var 1", 
"Var 2", "Var 5", "Var 3", "Var 1", "Var 2", "Var 3", "Var 1", 
"Var 2", "Var 3", "Var 4"), val = c(6200.63, 5358.48, 2417.35, 
8022.49, 14852.6, 2417.35, 100.93, 5389.56, 14631.52, 2417.35, 
84.39, 5387.66, 18231.84, 632.72, 1325.05, 5387.03, 14852.6, 
2417.35, 5377.88, 14087.98, 1510.02, 47.27), mth = c(1, 1, 1, 
2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6)), row.names = c(NA, 
-22L), class = c("tbl_df", "tbl", "data.frame"))

原图表生成代码

library(dplyr)
library(plotly)

df %>% 
  arrange(mth, dsc_cat1) %>% 
  plot_ly(
    x = c(~mth, ~dsc_cat1)
    ,y = ~val
    ,type = "bar"
    ,color = ~dsc_cat3
  ) %>%
  layout(
    barmode = "stack"
  )

重编码代码

df <- df %>% 
  mutate(
    dsc_cat3 = case_match(
      .x = dsc_cat3
      ,"Var 5" ~ "VAR 5"
      ,.default = dsc_cat3
    )
  )

解决方案

1. 修复数值与标签不匹配问题

原代码中x = c(~mth, ~dsc_cat1)的写法错误,会将mth和dsc_cat1的向量拼接在一起,导致x轴分组混乱,进而引发堆叠数值错误、悬停标签错位。正确做法是将mth和dsc_cat1组合成单个分组变量,作为x轴的分类依据。

修改后的绘图代码:

df %>% 
  arrange(mth, dsc_cat1) %>% 
  mutate(x_group = paste(mth, dsc_cat1, sep = " - ")) %>% # 组合月份与分类1为x轴分组
  plot_ly(
    x = ~x_group
    ,y = ~val
    ,type = "bar"
    ,color = ~dsc_cat3
    ,text = ~paste("数值:", val, "<br>分类1:", dsc_cat1, "<br>分类3:", dsc_cat3, "<br>月份:", mth) # 自定义清晰的悬停标签
  ) %>%
  layout(
    barmode = "stack"
    ,xaxis = list(title = "月份 - 分类1")
  )

修改后x轴会显示"1 - Cat1"、"1 - Cat2"这类明确的分组,堆叠数值将准确对应每个分组下的dsc_cat3类别,悬停标签也能正确匹配原始数据。

2. 修复重编码后分类消失问题

重编码逻辑本身无错,但需确保重编码后的数据保留所有dsc_cat3类别,避免Plotly仅显示部分出现过的分类。可以将dsc_cat3转换为因子并保留所有水平,强制Plotly识别全部分类。

修改后的重编码+绘图代码:

# 重编码并转换为因子
df <- df %>% 
  mutate(
    dsc_cat3 = case_match(
      .x = dsc_cat3
      ,"Var 5" ~ "VAR 5"
      ,.default = dsc_cat3
    ),
    dsc_cat3 = factor(dsc_cat3, levels = unique(dsc_cat3)) # 保留所有分类水平
  )

# 绘图代码同上方修复版本
df %>% 
  arrange(mth, dsc_cat1) %>% 
  mutate(x_group = paste(mth, dsc_cat1, sep = " - ")) %>% 
  plot_ly(
    x = ~x_group
    ,y = ~val
    ,type = "bar"
    ,color = ~dsc_cat3
    ,text = ~paste("数值:", val, "<br>分类1:", dsc_cat1, "<br>分类3:", dsc_cat3, "<br>月份:", mth)
  ) %>%
  layout(
    barmode = "stack"
    ,xaxis = list(title = "月份 - 分类1")
  )

调整后,所有dsc_cat3类别(包括VAR 5和其他原类别)都会在图例和图表中正常显示,不会出现仅显示单个分类的问题。

内容的提问来源于stack exchange,提问作者sactyr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:26:07