我试图在我的matplotlib图中拟合最适合的线性线 . 我不断得到x和y没有相同的第一个维度的错误 . 但他们都有15个长度 . 我做错了什么?
import matplotlib.pyplot as plt
from scipy import stats
import numpy as np
x = [0.46,0.59,0.68,0.99,0.39,0.31,1.09,0.77,0.72,0.49,0.55,0.62,0.58,0.88,0.78]
y = [0.315,0.383,0.452,0.650,0.279,0.215,0.727,0.512,0.478,0.335,0.365,0.424,0.390,0.585,0.511]
xerr = [0.01]*15
yerr = [0.001]*15
plt.rc('font', family='serif', size=13)
m, b = np.polyfit(x, y, 1)
plt.plot(x,y,'s',color='#0066FF')
plt.plot(x, m*x + b, 'r-') #BREAKS ON THIS LINE
plt.errorbar(x,y,xerr=xerr,yerr=0,linestyle="None",color='black')
plt.xlabel('$\Delta t$ $(s)$',fontsize=20)
plt.ylabel('$\Delta p$ $(hPa)$',fontsize=20)
plt.autoscale(enable=True, axis=u'both', tight=False)
plt.grid(False)
plt.xlim(0.2,1.2)
plt.ylim(0,0.8)
plt.show()
2 回答
你应该制作
x
和y
numpy数组,而不是列表:通过这种改变,它产生了预期的情节 . 如果它们是列表,
m * x
将不会产生您期望的结果,而是一个空列表 . 请注意m
是numpy.float64
标量,而不是标准Pythonfloat
.我实际上认为这是Numpy有点可疑的行为 . 在普通的Python中,将列表与整数相乘只重复列表:
将列表与float相乘会产生错误(我认为应该如此):
奇怪的是,将Python列表与Numpy标量相乘显然有效:
所以似乎浮动被截断为一个int,之后你得到重复列表的标准Python行为,这是非常意外的行为 . 最好的办法是提出一个错误(这样你就可以自己发现问题,而不必在Stackoverflow上提出你的问题),或者只显示预期的逐元素乘法(你的代码将在其中运行) . 有趣的是,列表和Numpy标量之间的添加确实有效:
将列表更改为
numpy
数组将完成工作!