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

如何绘制含双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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 09:02:58