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

求助:如何将Matplotlib散点图与for loop生成的连线图合并

问题:合并散点图与条件连线图

需要将以下两个Matplotlib图形合并到同一坐标系中:

1. 两组散点图

代码:

fig, ax = plt.subplots()

ax.scatter(x1, y1, color='blue', label='Series 1')
ax.scatter(x2, y2, color='green', label='Series 2')

效果:蓝色点为Series 1,绿色点为Series 2的散点分布。

2. 条件筛选后的连线图

通过for loop绘制满足y1==y2且x1 > x2条件的点之间的连线,代码:

for x1, x2, y1, y2 in special:
    ax.plot([x1, x2], [y1, y2])

效果:仅连接符合筛选条件的对应散点的连线图。

尝试使用plt.fill_between但无法与散点图配合实现需求,目前两图只能分开显示,希望将连线叠加到散点图上,保留所有无连线的散点,形成完整图形。


示例测试数据

import datetime

x1 = [datetime.datetime(2023, 4, 6, 3, 58, 32), datetime.datetime(2023, 4, 6, 3, 58, 32), datetime.datetime(2023, 4, 6, 3, 58, 32), datetime.datetime(2023, 4, 6, 3, 58, 32), datetime.datetime(2023, 4, 6, 3, 58, 32), datetime.datetime(2023, 4, 6, 3, 58, 32), datetime.datetime(2023, 4, 7, 6, 57, 13), datetime.datetime(2023, 4, 11, 5, 57, 14), datetime.datetime(2023, 4, 11, 5, 57, 14), datetime.datetime(2023, 4, 12, 16, 57, 4), datetime.datetime(2023, 4, 12, 16, 57, 4)]

x2 = [datetime.datetime(2023, 3, 23, 2, 38, 55), datetime.datetime(2023, 3, 25, 5, 26, 27), datetime.datetime(2023, 3, 25, 6, 26, 27), datetime.datetime(2023, 3, 26, 16, 46, 48), datetime.datetime(2023, 3, 29, 12, 53, 11), datetime.datetime(2023, 3, 31, 15, 25, 33), datetime.datetime(2023, 4, 2, 5, 40, 26), datetime.datetime(2023, 4, 3, 18, 36, 11), datetime.datetime(2023, 4, 3, 18, 36, 11), datetime.datetime(2023, 4, 6, 2, 21, 47), datetime.datetime(2023, 4, 7, 6, 54, 1), datetime.datetime(2023, 4, 11, 5, 47, 34), datetime.datetime(2023, 4, 12, 16, 32, 35), datetime.datetime(2023, 4, 12, 17, 6, 9),
 datetime.datetime(2023, 4, 19, 1, 46, 29)]

y1 = ['bda3fa6c0e47be8fb2af68889a76fb7b', '86bcdeef6510f5c129c036a7446c5d20', '45249523a3866a65c30daec40fff68ca', '653e4c7b5f77a81513cbe557554c79c3', '1e6358c3e2be89cf4aabbdc792de64d2', '42249fa0ce3f09182a51c4a91bf7ebd8', '4aba3f7340769eccf0ded01f1e557b98', 'eadc80f6ca1d4c3fccf94fcc202f66ff', '9f9fd071d04150f60783841b6669c48d', 'febea981a7bc1935a9bd97e6aec11f64', 'ac1590025eb4791909fd027c02e5288f']

y2 = ['653e4c7b5f77a81513cbe557554c79c3', 'febea981a7bc1935a9bd97e6aec11f64', 'ac1590025eb4791909fd027c02e5288f', '61806b2fe0aad80e37057e32c3263886', '4aba3f7340769eccf0ded01f1e557b98', '45249523a3866a65c30daec40fff68ca', 'ce07499ecb1e7c34f5c4df8fcb638856', '751d8f2ddd2262244f24c2bca8d86fdf', '46532398219ddd7b2c0e0466ecc00985', '9668ee6dd65b606af2089bd643b313c7', '1e6358c3e2be89cf4aabbdc792de64d2', '9a3755b1dced8a4f56918e5322a12dd2', 'c3e74c8067d21a9928d7ba2d1df8bec2', '9d09a0bc49064fb76cdc0e3f016aa591', 'bda3fa6c0e47be8fb2af68889a76fb7b']

special = [['2023-04-06 03:58:32',  '2023-03-31 15:25:33',  '45249523a3866a65c30daec40fff68ca',  '45249523a3866a65c30daec40fff68ca'], ['2023-04-06 03:58:32',  '2023-03-23 02:38:55',  '653e4c7b5f77a81513cbe557554c79c3',  '653e4c7b5f77a81513cbe557554c79c3'], ['2023-04-07 06:57:13',
 '2023-03-29 12:53:11',  '4aba3f7340769eccf0ded01f1e557b98',  '4aba3f7340769eccf0ded01f1e557b98'],
 ['2023-04-12 16:57:04',  '2023-03-25 05:26:27',  'febea981a7bc1935a9bd97e6aec11f64',  'febea981a7bc1935a9bd97e6aec11f64'], ['2023-04-12 16:57:04',  '2023-03-25 06:26:27',  'ac1590025eb4791909fd027c02e5288f',  'ac1590025eb4791909fd027c02e5288f']]

解决方案

核心是在同一个Axes对象上依次绘制散点和连线,注意需要将special中的字符串时间转换为datetime对象,确保与散点图的时间格式一致:

import matplotlib.pyplot as plt
import datetime

# 导入示例数据(复制上述测试数据代码)

# 创建画布和坐标系
fig, ax = plt.subplots(figsize=(12, 6))

# 绘制散点图
ax.scatter(x1, y1, color='blue', label='Series 1')
ax.scatter(x2, y2, color='green', label='Series 2')

# 处理special中的时间字符串并绘制连线
for x_str1, x_str2, y_val1, y_val2 in special:
    # 转换时间字符串为datetime对象
    x_val1 = datetime.datetime.strptime(x_str1, '%Y-%m-%d %H:%M:%S')
    x_val2 = datetime.datetime.strptime(x_str2, '%Y-%m-%d %H:%M:%S')
    # 绘制连线,可自定义颜色和样式
    ax.plot([x_val1, x_val2], [y_val1, y_val2], color='red', linestyle='--')

# 添加图表元素
ax.set_xlabel('时间')
ax.set_ylabel('标识字符串')
ax.legend()
# 旋转x轴标签避免重叠
plt.xticks(rotation=45)

plt.tight_layout()
plt.show()

这段代码会在散点图基础上,添加符合条件的红色虚线连接对应点,所有散点都会保留,最终形成合并后的完整图形。


内容的提问来源于stack exchange,提问作者Filip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:17:33