如何绘制含双Y系列、非数值型X轴且处理缺失值的图表
如何绘制含双Y系列、非数值型X轴且处理缺失值的图表
嗨,我来帮你搞定这个图表问题!你的需求其实很清晰:要把两个数值系列放在同一张图里,X轴是所有规则编号的完整集合(必须保留原始文本格式,不能当成数值处理),而且没有对应Y值的X要显示为0对吧?我用Python的pandas+matplotlib来给你一步步演示,完全贴合你的需求~
步骤1:准备/导入数据
首先先模拟一组和你结构一致的数据(如果你的数据是从文件读的,换成pd.read_csv()就行):
import pandas as pd import matplotlib.pyplot as plt # 模拟你的两列数据 df_values1 = pd.DataFrame({ 'rule_number': ['18-0-1', '7-3-1', '5-0-15'], 'Values1': [10, 25, 18] }) df_values2 = pd.DataFrame({ 'rule_number': ['18-0-1', '7-3-1', '9-2-4'], 'Values2': [15, 20, 12] })
步骤2:处理数据,补全缺失值
核心是先拿到所有规则编号的完整集合,然后把两个数据集都对齐到这个集合,缺失的Y值自动补0:
# 获取所有唯一的规则编号(两个数据集的并集) all_rule_numbers = pd.concat([df_values1['rule_number'], df_values2['rule_number']]).unique() # 将两个数据集重新索引到完整规则集合,缺失值填充为0 df1_complete = df_values1.set_index('rule_number').reindex(all_rule_numbers).fillna(0).reset_index() df2_complete = df_values2.set_index('rule_number').reindex(all_rule_numbers).fillna(0).reset_index()
步骤3:绘制图表,保留X轴文本格式
这里分两种常见的图表类型给你演示:
选项1:分组柱状图
如果想对比两个系列的数值,柱状图很直观:
plt.figure(figsize=(10, 6)) x_positions = range(len(all_rule_numbers)) # 用数字占位X轴位置 bar_width = 0.35 # 柱子宽度,避免重叠 # 绘制两个系列的柱子 plt.bar([pos - bar_width/2 for pos in x_positions], df1_complete['Values1'], width=bar_width, label='Values1') plt.bar([pos + bar_width/2 for pos in x_positions], df2_complete['Values2'], width=bar_width, label='Values2') # 替换X轴标签为原始规则文本,旋转45度避免重叠 plt.xticks(x_positions, all_rule_numbers, rotation=45, ha='right') # 添加图表元素 plt.title('Values1 vs Values2 by Rule Number') plt.xlabel('Rule Number') plt.ylabel('Value') plt.legend() plt.tight_layout() # 自动调整布局,防止标签被截断 plt.show()
选项2:折线图
如果想展示数值变化趋势,折线图更合适:
plt.figure(figsize=(10, 6)) x_positions = range(len(all_rule_numbers)) # 绘制两个系列的折线,加上标记点更清晰 plt.plot(x_positions, df1_complete['Values1'], marker='o', linestyle='-', label='Values1') plt.plot(x_positions, df2_complete['Values2'], marker='s', linestyle='--', label='Values2') # 同样替换X轴标签为原始文本 plt.xticks(x_positions, all_rule_numbers, rotation=45, ha='right') # 添加图表元素 plt.title('Values1 vs Values2 Trend by Rule Number') plt.xlabel('Rule Number') plt.ylabel('Value') plt.legend() plt.tight_layout() plt.show()
关键说明
- 用
reindex对齐完整规则集合,再用fillna(0)完美解决了“缺失Y值显示为0”的需求; - 先用数字占位X轴位置,再通过
plt.xticks替换成原始文本,彻底避免了matplotlib把规则编号当成数值处理的问题,完全保留你想要的格式; - 如果你的规则编号太多,
rotation=45可以避免标签重叠,也可以根据需要调整旋转角度。
备注:内容来源于stack exchange,提问作者cppprogrammer
相关产品推荐
相关产品推荐

