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

如何绘制不显示零高度条形空白的分组条形图

如何绘制不显示零高度条形空白的分组条形图

我手头有个数据集,需要绘制分组条形图,但数据里有很多缺失值,导致图表里会出现高度为0的条形空白,看着很别扭。

我已经尝试过把宽格式数据转成长格式,做了多级索引,还清理了空值。甚至还试着调整年份部分,以为能帮到分组,但还是没搞定。我可以给你说说我目前的操作:

我的数据集是这样的:有10个国家,每个国家的数据覆盖2000-2021年,但问题是有些国家只有2000年的数据,其他年份都没有;有的国家只在2018、2019年有数据。我给数据集做了多级索引并排序,索引是Country_Name和Years,还有一列Value,但就是没法高效绘制出没有空白的分组条形图。

我的数据表示例大概是这样:

Value
Afghanistan, 2000123
Afghanistan, 2001
Brazil, 2018456
Brazil, 2019789

解决思路和实操步骤

其实核心就是只保留有有效数据的行,彻底丢掉空值记录,然后利用绘图库的分组功能适配非连续的年份-国家组合,下面用常用的pandas+matplotlib/seaborn来给你演示:

1. 先彻底清理数据集

首先把所有Value为空的行删掉,别留着它们,不然绘图时还是会出现空白:

# 假设你的多级索引DataFrame是df
# 先把索引转成列,方便后续处理
df = df.reset_index()
# 删除Value为空的行
df_clean = df.dropna(subset=['Value']).copy()
# 如果Value是字符串类型,转成数值型(避免后续绘图报错)
df_clean['Value'] = pd.to_numeric(df_clean['Value'], errors='coerce')
# 再次删除转类型后出现的空值
df_clean = df_clean.dropna(subset=['Value'])

2. 用Seaborn快速绘制(推荐)

Seaborn的barplot会自动识别有效数据组合,只绘制有值的条形,完全不会出现空白:

import seaborn as sns
import matplotlib.pyplot as plt

# 设置图表大小
plt.figure(figsize=(12, 6))
# x轴放年份,y轴放数值,用国家做分组
sns.barplot(data=df_clean, x='Years', y='Value', hue='Country_Name')
# 调整细节:旋转年份标签避免重叠,添加标题
plt.title('各国年度数据分组条形图(无空白)')
plt.xticks(rotation=45)
# 自动调整布局
plt.tight_layout()
plt.show()

这样出来的图表里,只有存在有效数据的年份-国家配对才会显示条形,完美解决空白问题。

3. 用Matplotlib手动控制(适合自定义需求)

如果你需要更精细的控制,比如调整条形宽度、颜色,可以用Matplotlib手动绘制:

import matplotlib.pyplot as plt
import numpy as np

# 获取所有唯一的年份和国家
unique_years = df_clean['Years'].unique()
unique_countries = df_clean['Country_Name'].unique()
# 计算每个国家条形的宽度
bar_width = 0.8 / len(unique_countries)

plt.figure(figsize=(12, 6))
# 遍历每个国家绘制条形
for i, country in enumerate(unique_countries):
    # 筛选当前国家的有效数据
    country_data = df_clean[df_clean['Country_Name'] == country]
    # 找到每个年份在总年份列表中的位置
    year_positions = [np.where(unique_years == year)[0][0] for year in country_data['Years']]
    # 计算每个条形的x轴位置
    x_pos = np.array(year_positions) + i * bar_width
    # 绘制条形
    plt.bar(x_pos, country_data['Value'], width=bar_width, label=country)

# 设置x轴标签和位置
plt.xticks(np.arange(len(unique_years)) + bar_width*(len(unique_countries)-1)/2, unique_years, rotation=45)
# 添加图例和标题
plt.legend(title='国家')
plt.title('各国年度数据分组条形图(无空白)')
plt.tight_layout()
plt.show()

关键提醒

  • 绝对不要用填充0的方式处理缺失值,不然还是会出现零高度的空白条形,一定要直接删除空值行。
  • 如果你的数据还是多级索引状态,记得先reset_index()把索引转成普通列,这样绘图库能更方便地识别分组字段。

备注:内容来源于stack exchange,提问作者ShrinidhiPareek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 10:44:32