机器学习项目中如何用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()
代码解释
- 数据分组:通过布尔掩码
mask_0和mask_1把数据分成Y=0和Y=1两组,分别计算每组中每个特征的占比百分比。 - 条形位置调整:用
y_pos - bar_width/2和y_pos + bar_width/2让两个条形在同一y轴位置左右并排,避免重叠。 - 美化图表:添加图例、轴标签,用
tight_layout()自动调整布局,防止特征名称被截断。
这样就能得到你期望的每个特征对应两个水平条形的效果啦!
内容的提问来源于stack exchange,提问作者Gabriel Messi
相关产品推荐
相关产品推荐

