Matplotlib plt.plot绘图异常:折线连接不符合预期问题排查
问题原因及解决方案
嘿,我一眼就看出问题所在啦!你遇到的绘图异常,根源是你的x列表中的数值并不是严格按递增顺序排列的——看一下你的x数组,在9000之后居然又出现了1000,而matplotlib的plot函数是严格按照你提供的列表索引顺序来连接点的,不是按照x值的大小顺序。这就导致绘图时,程序会从9000对应的点直接跳回1000对应的点,自然就出现了不符合预期的连线。
要解决这个问题,只需要先把x和y的配对数据按x值从小到大排序,再用排序后的数组绘图即可。具体代码如下:
import matplotlib.pyplot as plt x = [1, 10, 50, 100, 250, 500, 750, 900, 950, 1000, 1500, 2000, 3500, 5000, 6500, 8000, 9000, 1000, 11000, 12000, 14000] y = [0.8980629181861878, 0.10853165966272355, 0.08126119875907897, 0.06252053439617157, 0.06377455067634583, 0.06653642201423646, 0.059822401523590085, 0.062289491295814514, 0.05231357836723328, 0.05339253479242325, 0.05086378312110901, 0.05312803852558136, 0.059300369888544084, 0.05587265187501907, 0.06438382065296173, 0.059782819837331774, 0.08129128956794739, 0.05339253479242325, 0.08861093366146088, 0.0757862297296524, 0.10072390681505203] # 将x和y配对后按x值升序排序 sorted_data = sorted(zip(x, y), key=lambda item: item[0]) x_sorted, y_sorted = zip(*sorted_data) # 使用排序后的数据绘图 plt.plot(x_sorted, y_sorted, marker='D') plt.xlabel("x") plt.ylabel("y") plt.show()
这段代码的核心逻辑是:
- 用
zip(x, y)把每个x值和对应的y值打包成元组 - 用
sorted()函数按元组中的第一个元素(也就是x值)排序 - 再用
zip(*sorted_data)把排序后的元组重新拆分成x和y的列表
这样处理后,所有点会按照x值从小到大的顺序排列,plot函数就会依次连接x轴上相邻的点,完全符合你的预期啦。另外,你x列表里重复的1000值也会被放在一起,正常显示对应的连线,如果你需要对重复值做特殊处理(比如取平均值),可以在排序后额外添加逻辑,但如果只是要正常连线的话,上面的代码就足够了。
内容的提问来源于stack exchange,提问作者Oria Gruber
相关产品推荐
相关产品推荐

