如何用Matplotlib绘制元组列表的双系列折线与散点图?
解决Matplotlib散点图同时显示多组数据的问题
问题核心在于plt.plot和plt.scatter的参数接收逻辑不同:
plt.plot支持同时传入多组x-y数据对(比如plt.plot(x1,y1,x2,y2)),所以*zip(*lista)拆分出的x, y1, y2会被自动识别为两组数据,生成两条折线。- 但
plt.scatter仅接受一组x坐标、一组y坐标,后续传入的参数会被解析为点的大小、颜色等属性(你代码里的y2被当成了点的大小参数s,所以只显示了第一组点,点的大小对应y2的值)。
解决方法
方法1:拆分数据后分别绘制
直接拆分出x轴和两组y值,分别调用plt.scatter,还可以自定义样式区分不同组:
import matplotlib.pyplot as plt import numpy as np lista = [(0,1,3),(1,4,5),(2,0,2),(3,5,10),(4,3,7)] # 拆分出x轴、第一组y值、第二组y值 x, y1, y2 = zip(*lista) plt.scatter(x, y1, color='blue', marker='o', label='Group 1') plt.scatter(x, y2, color='red', marker='s', label='Group 2') # 添加图例方便区分 plt.legend() plt.show()
方法2:循环批量处理(适合多组数据场景)
如果后续需要处理更多组数据,用循环批量绘制更高效:
import matplotlib.pyplot as plt import numpy as np lista = [(0,1,3),(1,4,5),(2,0,2),(3,5,10),(4,3,7)] data = list(zip(*lista)) x = data[0] y_groups = data[1:] # 提取所有y组数据 # 自定义样式循环绘制 colors = ['blue', 'red'] markers = ['o', 's'] for i, y in enumerate(y_groups): plt.scatter(x, y, color=colors[i], marker=markers[i], label=f'Group {i+1}') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

