#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)
делает свое дело. Спасибо!