基于Pandas绘制DataFrame首行与各Case概率序列可视化图表的技术咨询
为每个Case生成独立的概率趋势图表
嘿,咱们来搞定你这个需求!要给DataFrame里的每个case单独画可视化图表,X轴是10到500步长10的序列,Y轴对应每个case在prob-10、prob-20…这些列的取值,对吧?下面我给你一步步拆解实现:
1. 先导入必要的工具库
import pandas as pd import matplotlib.pyplot as plt
2. 构造/读取你的DataFrame
先模拟你的数据结构(如果是从文件读的,直接用pd.read_csv就行,后面会说怎么处理逗号小数):
# 模拟你的数据 data = { 'cases': ['case1', 'case2', 'case3'], 'year': [2018, 2017, 2019], 'HH': [200, 299, 200], 'prob-10': ['0,35', '0,33', '0,45'], 'prob-20': ['0,24', '0,25', '0,22'], 'prob-30': ['0,44', '0,33', '0,33'] # 这里可以继续补充到prob-500的列 } df = pd.DataFrame(data)
3. 预处理:把逗号小数转换成浮点数
Pandas默认认点作为小数点,所以得先把所有prob-开头列里的逗号换成点,再转成数值类型:
# 筛选所有prob开头的列 prob_columns = [col for col in df.columns if col.startswith('prob-')] # 替换逗号为点,转成float df[prob_columns] = df[prob_columns].replace(',', '.', regex=True).astype(float) # 如果你是从CSV读数据,可以直接在读取时指定小数分隔符,省掉这一步: # df = pd.read_csv('your_data_file.csv', decimal=',')
4. 生成X轴的数值序列
X轴是10到500步长10,刚好对应prob-后面的数字:
# 生成10、20、…、500的序列 x_axis = range(10, 501, 10) # 要是你的prob列不全(比如只有到prob-30),可以从列名里提取X值,更灵活: # x_axis = [int(col.split('-')[1]) for col in prob_columns]
5. 遍历每个Case,绘制独立图表
循环每一行,给每个case单独创建图表,还能自动保存到本地:
for _, row in df.iterrows(): case_name = row['cases'] # 获取当前case的所有prob值 y_values = row[prob_columns].values # 创建新的画布,避免图表重叠 plt.figure(figsize=(8, 5)) # 绘制折线图(换成plt.bar就是柱状图,按需调整) plt.plot(x_axis, y_values, marker='o', linewidth=2, label=case_name) # 给图表加标签和标题,更清晰 plt.title(f'Probability Trend - {case_name}', fontsize=12) plt.xlabel('Probability Threshold', fontsize=10) plt.ylabel('Probability Value', fontsize=10) plt.grid(alpha=0.3) plt.legend() # 保存图表到本地,文件名对应case名 plt.savefig(f'{case_name}_prob_trend.png', bbox_inches='tight') # 显示图表 plt.show()
小提示:
- 如果你想要柱状图,把
plt.plot改成plt.bar就行,其他代码不用动。 - 要是需要调整图表样式(比如颜色、标记形状),直接在
plt.plot里加参数就行,比如color='red'、marker='s'。 - 如果你的prob列数量和
x_axis长度不匹配,记得检查列名是不是严格按照prob-10、prob-20…的格式来的,或者用上面注释里的方法从列名提取X值,适配性更强。
这样每个case都会生成一个独立的图表,标题和文件名都对应case名称,一目了然~
内容的提问来源于stack exchange,提问作者sbnm cplk
相关产品推荐
相关产品推荐

