如何从元组列表生成权重数组,绘制Y轴为权重的直方图
嘿,这事儿不难!你的元组列表里每个元素的第二个值就是我们需要的权重,生成权重数组和绘制Y轴为权重的直方图的步骤我给你理清楚了👇
第一步:生成权重数组
从你的元组列表A中提取权重数组非常直接,只需要遍历每个元组,取出第二个元素即可:
# 补全省略部分后的完整元组列表示例 A = [(122208102.23250552, 34), (164096757.6449624, 4), (212275562.3177331, 72), (499344188.7213493, 240), (515347294.02090293, 2), (614044718.1056056, 4), (623878472.271997, 37), (1050993427.1862154, 2), (1885818969.4904015, 106), (2718942354.402217, 539), (2784838407.8050084, 23), (3996685731.144668, 26), (4540461526.048465, 1), (7019400139.695788, 2), (8079788636.830896, 2), (8847080928.7053, 2), (11989470404.794186, 104), (18560941417.034264, 782)] # 提取权重数组 weights = [t[1] for t in A] # 对应的数值数组(后续绘图会用到) values = [t[0] for t in A]
这样weights就是你要的权重数组了。
第二步:绘制Y轴为权重的直方图
根据你的需求,我提供两种常用的绘图方式,你可以根据数据规模和可视化需求选择:
方式1:直接基于原始数据绘制
方法A:展开数据后绘制普通直方图
把每个数值重复对应权重的次数,再绘制标准直方图,Y轴自然就是权重(出现次数):
import matplotlib.pyplot as plt # 展开数据:每个数值重复对应权重的次数 expanded_data = [] for val, cnt in A: expanded_data.extend([val] * cnt) # 绘制直方图,自动分箱 plt.hist(expanded_data, bins='auto', edgecolor='black') plt.ylabel('权重(出现次数)') plt.xlabel('数值') plt.title('数值分布直方图(Y轴为权重)') plt.show()
方法B:不展开数据,用权重参数绘制(适合大数据量)
如果数据量很大,展开数据会占用过多内存,直接用matplotlib的weights参数更高效:
import matplotlib.pyplot as plt # 提取数值和权重(如果前面已经生成过可以跳过这一步) values = [t[0] for t in A] weights = [t[1] for t in A] # 绘制直方图,指定weights参数 plt.hist(values, bins='auto', weights=weights, edgecolor='black') plt.ylabel('权重(出现次数)') plt.xlabel('数值') plt.title('数值分布直方图(Y轴为权重)') plt.show()
方式2:自定义分箱,展示区间总权重
如果你想把数值分成若干区间,Y轴显示每个区间的总权重,可以这样做:
import matplotlib.pyplot as plt import numpy as np values = [t[0] for t in A] weights = [t[1] for t in A] # 自定义分箱数量,比如分成10个区间 bins = np.linspace(min(values), max(values), 10) # 计算每个区间的总权重 bin_total_weights, _ = np.histogram(values, bins=bins, weights=weights) # 绘制直方图(用条形图更直观展示区间权重) plt.bar(bins[:-1], bin_total_weights, width=np.diff(bins), edgecolor='black') plt.ylabel('区间总权重') plt.xlabel('数值区间') plt.title('数值区间权重直方图') plt.show()
内容的提问来源于stack exchange,提问作者Rebel
相关产品推荐
相关产品推荐

