Matplotlib绘图异常:plt.plot(t, t**2)绘制出两条线而非一条
为什么
plt.plot(t, t**2)画出两条线,plt.plot(t, 10*t)却正常? 嘿,这个问题我之前踩过坑!大概率是你的数组t属于下面两种常见情况之一,我给你慢慢拆解:
最可能的原因:t是复数数组
Matplotlib的plot函数对复数数组有个默认行为——它会把实部和虚部分开各画一条线:
- 当你跑
plt.plot(t, 10*t)时,10*t的实部是t实部的10倍,虚部是t虚部的10倍,这俩序列的比例完全一致,所以两条线会严丝合缝叠在一起,看起来就像只有一条。 - 但
t**2就不一样了:复数平方后,实部是(实部² - 虚部²),虚部是2*实部*虚部,这俩结果完全不成比例,自然就会显示两条独立的线。
怎么验证?
先打印下t的类型和内容看看:
print(type(t)) print(t.dtype) print(t)
如果输出里dtype是complex64或者complex128,那就是复数数组的锅没跑了。
解决办法
要是你只需要画实数部分的关系,直接把t转成实数就行:
# 方法一:直接在绘图时取实部 plt.plot(np.real(t), np.real(t**2)) # 方法二:先转成实数数组再用 t_real = np.real(t) plt.plot(t_real, t_real**2)
第二种可能:t是两列的二维数组
要是t的形状是(n, 2)(也就是有n行2列),那t**2会对每一列的元素单独平方。而Matplotlib的plot函数碰到二维数组时,会把每一列当成一个独立的数据集,各画一条线:
- 跑
plt.plot(t, 10*t)时,10*t的每一列都是t对应列的10倍,两条线完全重叠,看起来就像一条。 - 但
t**2的每一列是t对应列的平方,两列的曲线形状肯定不一样,所以就会显出两条线。
怎么验证?
查下t的形状就清楚了:
print(t.shape)
要是输出是(n, 2),那就是二维数组的问题。
解决办法
如果你只需要用其中一列,比如第一列,直接提取出来用就行:
# 取第一列作为新的一维数组 t_single = t[:, 0] plt.plot(t_single, t_single**2)
小概率情况
还有个不太常见的可能:你之前绘图后没清空画布(比如没关之前的图,也没调用plt.clf()重置),导致新的图叠加上了旧的线。不过这种情况一般是多了之前的线,不是突然冒两条新线,可能性很低,先排查上面两种情况就行。
内容的提问来源于stack exchange,提问作者Kenny Smith
相关产品推荐
相关产品推荐

