求助:如何将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
相关产品推荐
相关产品推荐

