Matplotlib: ValueError: x и y должны иметь одинаковое первое измерение

Я пытаюсь установить линейную линию, наиболее подходящую для моего графика 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() 

  • Передача списка kwargs?
  • аргументы с распаковкой лямбда
  • Захват HTTP-ошибок
  • Python Tkinter: попытка получить размер виджета
  • Из escaped html -> в обычный html? - Python
  • Почему объекты функции оценивают значение True в python?
  • эффективно заменить плохие символы
  • Несколько копий инструментария py.test
  • 2 Solutions collect form web for “Matplotlib: ValueError: x и y должны иметь одинаковое первое измерение”

    Вы должны сделать массивы x и y numpy, а не списки:

     x = np.array([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 = np.array([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]) 

    С этим изменением он создает график ожидания. Если они являются списками, m * x не будет давать ожидаемый результат, а пустой список. Заметим, что m – скаляр numpy.float64 , а не стандартный float Python.

    Я на самом деле считаю это немного сомнительным поведением Numpy. В обычном Python умножение списка с целым числом просто повторяет список:

     In [42]: 2 * [1, 2, 3] Out[42]: [1, 2, 3, 1, 2, 3] 

    в то время как умножение списка с поплавком дает ошибку (как я думаю, это должно):

     In [43]: 1.5 * [1, 2, 3] --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-43-d710bb467cdd> in <module>() ----> 1 1.5 * [1, 2, 3] TypeError: can't multiply sequence by non-int of type 'float' 

    Странно то, что умножение списка Python с помощью сканера Numpy, по-видимому, работает:

     In [45]: np.float64(0.5) * [1, 2, 3] Out[45]: [] In [46]: np.float64(1.5) * [1, 2, 3] Out[46]: [1, 2, 3] In [47]: np.float64(2.5) * [1, 2, 3] Out[47]: [1, 2, 3, 1, 2, 3] 

    Таким образом, кажется, что float усекается до int, после чего вы получаете стандартное поведение Python повторения списка, что является довольно неожиданным поведением. Лучше всего было бы поднять ошибку (чтобы вы сами заметили проблему, а не задавали свой вопрос в Stackoverflow) или просто отображали ожидаемое умножение по типу (в котором ваш код только что работал) , Интересно, что добавление между списком и сканированием Numpy работает:

     In [69]: np.float64(0.123) + [1, 2, 3] Out[69]: array([ 1.123, 2.123, 3.123]) 

    Изменение ваших списков в массивах numpy сделает работу!

     import matplotlib.pyplot as plt from scipy import stats import numpy as np x = np.array([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]) # x is a numpy array now y = np.array([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]) # y is a numpy array now 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() 

    введите описание изображения здесь

    Python - лучший язык программирования в мире.