Проблема
Я работаю с данными в логарифмическом масштабе и хотел бы повернуть их так, чтобы они соответствовали линии.Я знаю модель, но не совсем уверен, какой угол я должен подключить к transform_angles
, чтобы восстановить правильное вращение.После небольшого количества проб и ошибок я знаю, что ответ составляет около 10 градусов для требуемых мне осей.
MWE
import matplotlib.pylab as plt
import numpy as np
plt.clf()
plt.yscale('log')
plt.ylim((1e-11, 1e-1)) # Other data is usually plotted and these are the ranges I need.
plt.xlim((-0.2, 7.2))
x_fit = np.linspace(0.8, 3.2, 1000)
y_ols = (lambda x: np.exp(np.log(2)*(-20.8 + -1.23 * x)))(x_fit) # I get these numbers from OLS fitting.
plt.plot(x_fit, y_ols, 'b-', dashes='', label='__nolegend__')
plt.gca().text(np.min(x_fit), 1.2*y_ols[0], r'$O(2^{{ {:.3}x }})$'.format(-1.23), rotation=-10).set_bbox(dict(facecolor='w', alpha=0.7, edgecolor='k', linewidth=0)) # There are several others lines which have been omitted.
Подобные вопросы ( держит текст повернутым в системе координат данных после изменения размера? ) использовать только линейные оси, как и демонстрации matplotlib .
Замечания на графике для ответа на комментарии
- В своем полном графике я использую двойную ось (обе в логарифмическом масштабе) с функцией
twinx()
.Все данные нанесены на ax1
, который использует шкалу log-10 (как показано).(Я мог бы быть более явным и написать yscale('log', basey=10)
...).В конечном итоге я хочу ось Base-10. - Модель, использованная при создании
y_ols
, основана на регрессионном сопоставлении с некоторыми исходными данными и требует base-2.В логарифмическом масштабе достаточно легко восстановить градиент в любой необходимой базе.
Использование градиентов
Достаточно легко восстановить градиент в логарифмическом масштабе, используя сочетание np.gradient
и угла (в радианах), используя np.arctan
, но я не могу восстановить число, близкое к 10 градусам (0,17 радиан).
transData.transform_angles(np.array((np.mean(np.gradient(np.log10(y_ols), np.mean(np.diff(x_fit)))),)), np.array([np.min(x_fit), 1.2*y_ols[0]]).reshape((1, 2)), radians=True)[0]
дает -1.6
радиан (приблизительно -90 градусов), тогда как мне требуется число, близкое к 0.17
радиан.Возможно, мне следует использовать другую базу, или я все делаю неправильно (отсюда и пост).
Дополнения - вертикальное смещение
Как видно из кода, я добавилвертикальное смещение для точки привязки при использовании 1.2*y_ols[0]
.Если решение должно принять это во внимание, тогда все будет лучше.