Автоматическая ось Matplotlib дает неожиданный результат

#python #python-3.x #numpy #matplotlib #plot

#python #python-3.x #numpy #matplotlib #график

Вопрос:

Я строю некоторые данные с помощью Matplotlib, но метки автоматической оси отключены. Ось X имеет отрицательные значения в метке, где они должны быть положительными, а ось Y имеет очень странный масштаб.

Вот некоторый код:

 import numpy as np
import numpy.polynomial.polynomial as poly
import matplotlib.pylab as plot

# pass in same sized arrays x, y, and z, returns fit of x to z and y to z 
def fitData(x, y, z): 
    x_coefs = poly.polyfit(x, z, 1)
    xfit = poly.Polynomial(x_coefs)    # instead of np.poly1d
    y_coefs = poly.polyfit(y, z, 3)
    yfit = poly.Polynomial(y_coefs)    # instead of np.poly1d
    return xfit, yfit 

x = [3.08,  3.1 ,  3.12,  3.14,  3.16,  3.18,  3.2 ,  3.22,  3.24, 
     3.26,  3.28,  3.3 ,  3.32,  3.34,  3.36,  3.38,  3.4 ,  3.42, 
     3.44,  3.46,  3.48,  3.5 ,  3.52,  3.54,  3.56,  3.58,  3.6 , 
     3.62,  3.64,  3.66,  3.68]

y = [0.000857,  0.001182,  0.001619,  0.002113,  0.002702,  0.003351,
    0.004062,  0.004754,  0.00546 ,  0.006183,  0.006816,  0.007362,
    0.007844,  0.008207,  0.008474,  0.008541,  0.008539,  0.008445,
    0.008251,  0.007974,  0.007608,  0.007193,  0.006752,  0.006269,
    0.005799,  0.005302,  0.004822,  0.004339,  0.00391 ,  0.003481,
    0.003095]

z = np.linspace(0, 1, num=len(x)) # create as many z points as input data 

xfit, yfit = fitData(x, y, z)

ax1 = plot.subplot(1, 2, 1)
plot.title("X position")
plot.xlabel("Z (ft)")
plot.ylabel("X (ft)")
ax1.plot(z, xfit(z))

ax2 = plot.subplot(1, 2, 2)
plot.title("Y position")
plot.xlabel("Z (ft)")
plot.ylabel("Y (ft)")
ax2.plot(z, yfit(z))

plot.tight_layout()
plot.show() 

  

И вот мои результирующие графики:

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

Как вы можете видеть, диапазон на шкале масштаба X-графика, похоже, работает в обратном направлении, а масштаб y-графика сильно отклонен. У кого-нибудь есть идеи, почему это может происходить?

Комментарии:

1. Какой график вы ожидаете?

2. Формы графиков правильные, меня особенно смущают оси. Диапазоны странные.

Ответ №1:

В общем, я предполагаю, что Matplotlib знает диапазон ваших данных, поэтому я бы начал с просмотра данных, которые он отображает. Глядя на данные x, y-перехват должен быть равен 3,08, в то время как x_coefs — array([-5.13333333, 1.66666667] так что ваши подходящие функции каким-то образом отключены (ipython или print (x_coefs) — ваш друг здесь).

Вам нужно поменять местами x и z в x_coefs = poly.polyfit(x, z, 1) , аналогично для y_coefs .

Комментарии:

1. Хороший улов. Вот почему графики выглядят как обратные тому, какими они должны были быть. Похоже, что polyfit принимает аргументы в порядке, обратном тому, который я ожидал. Замена z и x ie. x_coefs = poly.polyfit(z, x, 1) делает свое дело. Спасибо!