Как разместить сетку линейно для оси шкалы журнала в Matplotlibs? - PullRequest
0 голосов
/ 07 августа 2020

В библиотеке matplot я хочу расположить сетки в линейном порядке, а масштаб оси - логарифмический c.

Я хочу вот это: введите описание изображения здесь

Пока код такой:

ax.grid(True,  which="major", ls="-")
ax.set_yscale('log')
ax.yaxis.set_major_formatter(StrMethodFormatter('{x:.8f}'))
ax.yaxis.set_minor_formatter(StrMethodFormatter('{x:.8f}'))

1 Ответ

1 голос
/ 07 августа 2020

Вы можете явно установить основные тики на желаемые позиции. Либо просто ticks=[2**i for i in range(30], либо более сложные отметки из примера (они будут близки к равномерному, но не полностью). При желании числа могут отображаться с разделителем тысяч. Незначительные отметки, которые автоматически добавляются шкалой журнала, выглядят очень запутанно и могут быть удалены.

from matplotlib import pyplot as plt
import numpy as np
from matplotlib.ticker import FixedLocator, StrMethodFormatter, NullFormatter, NullLocator

fig, ax = plt.subplots()
ax.plot(np.exp(10+np.random.normal(0.01, 0.6, 1000).cumsum()))
ax.grid(True,  which="major", ls="-")
ax.set_yscale('log')
ticks = [j * k for j in (1, 1000, 1000000) for k in [3, 6, 12] + [25*2**i for i in range(7)]   ]
ax.yaxis.set_major_locator(FixedLocator(ticks))
ax.yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}'))
ax.yaxis.set_minor_locator(NullLocator())
#ax.yaxis.set_minor_formatter(NullFormatter())
ax.set_ylim(ymin=2)
plt.tight_layout()
plt.show()

пример сюжета

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