You need to enable JavaScript to run this app. R与Python实现宽表数据的堆叠/分组柱状图绘制及常见问题解决
优惠活动
大模型
产品
解决方案
定价
更多

R与Python实现宽表数据的堆叠/分组柱状图绘制及常见问题解决

问题核心根源

当前出现的图例命名异常、无法切换分组柱状图的问题,本质是没有遵循ggplot2、seaborn这类语法式绘图库的输入要求——这类库默认适配「一个x分类列、一个分组列(映射颜色/填充)、一个数值y列」的长表结构。直接在宽表上手动叠加多个独立柱状图图层,会直接绕过库内置的位置计算、图例生成逻辑,就算传入position="dodge"参数也无法生效。

R 环境(ggplot2)实现方案

前置步骤:宽表转长表

手里的宽表只需要调用tidyr的pivot_longer把所有数值列合并成长格式,不需要逐行修改原数据结构,大样本下批量处理效率很高:

# 加载依赖包
library(tidyverse)

# 构造示例数据
df <- data.frame(
  Continent = c("Asia","Africa","EU","US","Antractica"),
  Death = c(24242,75457,63521,967445,947),
  Cases = c(92332,338753,700346,8536856,4232)
)

# 宽表转长表:把多个数值列合并为「指标类型+对应值」结构
df_long <- df %>% 
  pivot_longer(
    cols = c(Cases, Death), # 也可以直接写 -Continent 自动选中所有非分类列
    names_to = "Metric",   # 存储原列名的新分类列
    values_to = "Value"     # 存储原列数值的新数值列
  )

两种图表实现

堆叠柱状图

转成长表后,只需要把fill映射到新生成的Metric列,图例、位置逻辑都会自动适配:

ggplot(df_long, aes(x = Continent, y = Value, fill = Metric)) +
  geom_bar(stat = "identity") + # 默认就是堆叠位置
  labs(y = "Covid 相关统计值", fill = "统计指标") # 直接在这里自定义坐标轴、图例标题即可

分组并排柱状图

当fill被正确映射为数据列时,position_dodge参数会自动触发分组对齐逻辑,不需要手动拆分图层:

ggplot(df_long, aes(x = Continent, y = Value, fill = Metric)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  labs(y = "Covid 相关统计值", fill = "统计指标")
Python 环境(Seaborn)实现方案

前置步骤:宽表转长表

用pandas内置的melt方法即可完成格式转换,和R的转表逻辑完全一致:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 构造示例数据
df = pd.DataFrame({
    "Continent": ["Asia","Africa","EU","US","Antractica"],
    "Death": [24242,75457,63521,967445,947],
    "Cases": [92332,338753,700346,8536856,4232]
})

# 宽表转长表
df_long = df.melt(
    id_vars = "Continent", # 固定保留的分类列
    value_vars = ["Cases", "Death"], # 也可以省略,自动选中其余所有列
    var_name = "Metric",
    value_name = "Value"
)

两种图表实现

堆叠柱状图

把hue映射为Metric列即可自动生成正确图例、触发堆叠逻辑:

sns.barplot(
    data = df_long,
    x = "Continent",
    y = "Value",
    hue = "Metric",
    estimator = sum,
    errorbar = None
)
plt.ylabel("Covid 相关统计值")
plt.legend(title = "统计指标")

分组并排柱状图

seaborn的barplot默认在hue存在时自动开启dodge并排排列,不需要手动计算位置:

sns.barplot(
    data = df_long,
    x = "Continent",
    y = "Value",
    hue = "Metric",
    estimator = sum,
    errorbar = None,
    dodge = True
)
plt.ylabel("Covid 相关统计值")
plt.legend(title = "统计指标")
避坑提示
  • 不要在宽表上手动叠加多个独立的柱状图图层,这种写法既不能生成统一的规范图例,也无法联动位置参数,后续调整配色、修改标注都需要逐图层修改,大样本下维护成本极高
  • 转长表时,数值列的指定可以用「排除固定分类列」的写法(比如R里写cols = -Continent、Python里省略value_vars参数),适配更多数值列的宽表场景,不需要逐一枚举列名
  • 图例标题、坐标轴标题直接通过绘图函数的标签参数修改即可,不需要手动拆解图例内部的元素调整名称

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 19:36:01