как можно установить лог-масштаб для значений, которые уже зарегистрированы, но слишком велики, чтобы возвести их обратно в линейный масштаб?пример:
import matplotlib.pylab as plt
import numpy as np
def f_returns_verylarge_logs():
# some computation here that returns very small numbers on a log scale
# (meaning large negative numbers in log units)
log10_y = [3000, 3100, 3200]
return log10_y
ax1 = plt.subplot(2, 1, 1)
x = [1, 2, 3]
# y values are small, so it is no problem to keep them
# around in LINEAR scale
y = [50, 100, 200]
plt.plot(x, y)
plt.xlabel("x")
plt.ylabel("y")
ax1.set(yscale="log")
ax2 = plt.subplot(2, 1, 2)
x = [1, 2, 3]
log_y = f_returns_verylarge_logs()
y = np.power(10., log_y)
plt.plot(x, y)
plt.xlabel("x")
plt.ylabel("y")
ax2.set(yscale="log")
plt.show()
это дает ошибку переполнения:
RuntimeWarning: overflow encountered in power
y = np.power(10., log_y)
цель состоит в том, чтобы заставить нижний график работать и выглядеть (в терминах утиков / меток) как верхний без unlogging log_y
, поскольку это вызывает переполнение.
плохое решение состоит в том, чтобы уменьшить значения журнала, а затем удалить их из журнала, как в:
plt.figure()
scaled_log_y = np.array(log_y) / 100.
scaled_unlog_y = np.power(10., scaled_log_y)
plt.plot(x, scaled_unlog_y)
plt.gca().set(yscale="log")
plt.ylabel("y (units are wrong)")
plt.xlabel("x")
plt.show()
, но это дает неправильные единицы: для 3000 это говорит 10 ^ 30 вместо 10 ^ 3000.