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

机器学习项目中如何用Matplotlib为每个特征绘制两组水平条形图

解决双水平条形图的绘制问题

看起来你现在的代码逻辑是根据Yr[f]的值来选择绘制其中一个条形,但这并不是双条形图的正确实现方式——我们需要为每个特征同时展示两个类别(比如Y=0和Y=1)的百分比,并排显示在同一行上。

问题出在哪?

你的循环里,每个特征只画了一个条形(要么是Yr[f]=1的情况,要么是另一种),但实际上应该对每个特征,分别计算两类样本中的特征占比,然后把两个条形放在同一y轴位置,通过调整x偏移量让它们并排。

修改后的代码实现

我帮你调整了代码,实现你想要的双水平条形图效果:

import matplotlib.pyplot as plt
import numpy as np

# 加载数据(假设你的load_dataset_sc函数正常返回)
[Xr, Yr, feat_names] = load_dataset_sc('boavista_covid_dados_abertos_reduzida.csv')

# 设置条形宽度
bar_width = 0.35
# 获取特征数量
n_feats = len(feat_names)
# 创建y轴位置的数组
y_pos = np.arange(n_feats)

# 分离两类数据:Yr=0和Yr=1的样本
mask_0 = Yr == 0
mask_1 = Yr == 1

# 计算每个特征在两类中的百分比
percent_0 = 100 * np.sum(Xr[mask_0], axis=0) / Xr[mask_0].shape[0]
percent_1 = 100 * np.sum(Xr[mask_1], axis=0) / Xr[mask_1].shape[0]

# 绘制两个水平条形图
plt.barh(y_pos - bar_width/2, percent_0, bar_width, label='Y=0')
plt.barh(y_pos + bar_width/2, percent_1, bar_width, label='Y=1')

# 设置y轴标签
plt.yticks(y_pos, feat_names)
# 添加x轴标题
plt.xlabel('百分比 (%)')
# 添加图例
plt.legend()
# 调整布局防止标签被截断
plt.tight_layout()
plt.show()

代码解释

  1. 数据分组:通过布尔掩码mask_0和mask_1把数据分成Y=0和Y=1两组,分别计算每组中每个特征的占比百分比。
  2. 条形位置调整:用y_pos - bar_width/2和y_pos + bar_width/2让两个条形在同一y轴位置左右并排,避免重叠。
  3. 美化图表:添加图例、轴标签,用tight_layout()自动调整布局,防止特征名称被截断。

这样就能得到你期望的每个特征对应两个水平条形的效果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:07:28