Ответ 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()
Для поведения с нулевым пересечением вы имеете в виду график "Симметричный журнал" (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()