Подтвердить что ты не робот

Построение квадратной оси с логарифмической шкалой в matplotlib

Я хотел бы сделать квадратный график рассеяния оси с помощью matplotlib. Обычно использование set_scale("log") отлично работает, но оно ограничивает меня log10. Я хотел бы сделать сюжет в log2. Я видел решение здесь: Как создать экспоненциально масштабированную ось?

но это довольно сложно и не работает, если у вас есть 0 значений в ваших массивах, что я и делаю. Я бы просто проигнорировал такие функции, как другие функции numpy.

Например:

log2scatter(data1, data2)

где data1 и data2 содержат 0s, должны иметь логарифмический масштаб по оси x и y с логарифмическими интервалами. Так же, как log10, кроме log2...

Спасибо.

4b9b3361

Ответ 1

Просто укажите basex=2 или basey=2.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.set_xscale('log', basex=2)
ax.set_yscale('log', basey=2)

ax.plot(range(1024))
plt.show()

enter image description here

Для поведения с нулевым пересечением вы имеете в виду график "Симметричный журнал" (a.k.a. "symlog" ). Что бы это ни стоило, данные не отфильтровываются, это всего лишь линейный график около 0 и лог-график везде. Это масштаб, который изменяется, а не данные.

Обычно вы просто делаете ax.set_xscale('symlog', basex=2), но использование базы не-10, по-видимому, является ошибкой в ​​данный момент для графиков symlog.

Edit: Хех! Ошибка связана с классической ошибкой: с использованием изменяемого аргумента по умолчанию.
Я отправил отчет об ошибке, но если вам хочется его исправлять, вам нужно сделать небольшое редактирование lib/matplotlib/ticker.py, по строке 1376, в __init__ методе SymmetricalLogLocator.

Вместо

def __init__(self, transform, subs=[1.0]):
    self._transform = transform
    self._subs = subs
    ...

Измените его на нечто похожее на:

def __init__(self, transform, subs=None):
    self._transform = transform
    if subs is None:
        self._subs = [1.0]
    else:
        self._subs = subs
    ....

С внесенными изменениями он ведет себя так, как ожидалось...

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
ax.set_xscale('symlog', basex=2)
ax.set_yscale('symlog', basey=2)

x = np.arange(-1024, 1024)
ax.plot(x, x)

plt.show()

enter image description here

Ответ 2

Если вы используете plt.xscale, вам все равно нужно указать basex, а не base:

plt.figure()
plt.plot(x, y)
plt.xscale('log', basex=2)
plt.show()