используйте масштаб журнала в matplotlib для больших записанных значений без переполнения - PullRequest
2 голосов
/ 13 июня 2019

как можно установить лог-масштаб для значений, которые уже зарегистрированы, но слишком велики, чтобы возвести их обратно в линейный масштаб?пример:

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.

1 Ответ

1 голос
/ 13 июня 2019

Возможно, вы хотите что-то вроде следующего, где просто каждый тик в позиции n помечен "10^n".

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker

x = [1, 2, 3]
y1 = [50, 100, 200]
y2 = [3000, 3100, 3200]

ax1 = plt.subplot(2, 1, 1)
ax1.plot(x, y1)
ax1.set_xlabel("x")
ax1.set_ylabel("y")
ax1.set(yscale="log")

ax2 = plt.subplot(2, 1, 2)

ax2.plot(x, y2)
ax2.set_xlabel("x")
ax2.set_ylabel("y")
ax2.yaxis.set_major_formatter(mticker.FuncFormatter(lambda x,_: f"$10^{{{int(x)}}}$"))

plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...