如何用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
相关产品推荐
相关产品推荐

