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

如何用Altair绘制多列value_counts()柱状图(替代Matplotlib)

用Altair实现DataFrame多列归一化频率柱状图

要实现和你提供的Matplotlib代码完全一致的图表效果,核心是先将数据转换成Altair适配的长格式结构,再通过分簇柱状图配置实现。具体步骤如下:

1. 导入依赖库

import pandas as pd
import altair as alt

2. 构造示例数据

df = pd.DataFrame({
    'Col1': [0,1,2,3], 
    'Col2': [0,1,2,2], 
    'Col3': [2,3,3,3]
})

3. 处理数据:计算归一化频率并转换格式

Matplotlib可直接用宽格式绘图,但Altair更适合长格式数据。我们需要完成以下操作:

  • 对每列计算value_counts(normalize=True),得到各列类别的归一化频率
  • 将结果合并为宽格式DataFrame
  • 重置索引,把类别值转为单独列
  • 转成长格式,让列名、类别、频率成为独立字段
  • 填充空值为0(原数据中不存在的类别频率为0)
# 计算每列的归一化频率,生成宽格式DataFrame
freq_df = pd.DataFrame({col: df[col].value_counts(normalize=True) for col in df})
# 重置索引,将类别值转为"Category"列
freq_df = freq_df.reset_index().rename(columns={'index': 'Category'})
# 转成长格式,适配Altair要求
long_df = freq_df.melt(id_vars='Category', var_name='Column', value_name='Frequency')
# 填充空值为0,确保所有类别都有数据
long_df['Frequency'] = long_df['Frequency'].fillna(0)

4. 用Altair绘制分簇柱状图

通过配置轴、颜色和分簇规则,实现和Matplotlib完全一致的效果:

chart = alt.Chart(long_df).mark_bar(opacity=0.8).encode(
    x=alt.X('Column:N', title='列名'),
    y=alt.Y('Frequency:Q', title='归一化频率', domain=[0, 1]),
    color=alt.Color('Category:N', title='类别'),
    # 配置分簇:同一列下的不同类别柱子并排显示
    xOffset='Category:N'
).properties(
    width=400,
    height=300,
    title='各列类别归一化频率柱状图'
)

chart.show()

效果匹配说明

  • x轴显示列名(Col1/Col2/Col3),同一列下的不同类别柱子分簇排列
  • y轴范围固定为0到1,与normalize=True的结果直接对应
  • 不同颜色区分各个类别,和Matplotlib生成的图表视觉效果完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:40:41