Как отформатировать второстепенные отметки на сдвоенных осях X и Y, обе из которых логарифмически масштабируются? - PullRequest
0 голосов
/ 15 января 2020

У меня есть данные, для которых я хотел бы показать две разные шкалы. Документы Matplotlib (такие как this ) содержат несколько примеров, которые объединяют оси x или y (не оба), и ни один из этих примеров не показывает, как манипулировать второстепенными тиками обеих осей x и y, когда срубы масштабируется.

Это мой вопрос: как отформатировать второстепенные тики по двойным осям x и двойным осям y, которые логарифмически масштабируются? В приведенном ниже примере обычные оси xy линейно - масштабируется (обозначается индексом i), тогда как альтернативные / зеркальные / двойные оси xy логарифмически масштабируются (обозначается индексом j). Функция twinboth была заимствована из аналогичного вопроса . Кроме того, я использую LogLocator вместо AutoMinorLocator, как предлагается в в этом посте .

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

## linear scale parameters
m, b = 0.5, np.pi
xi = np.arange(1, 11, 1).astype(int)
noisei = np.random.uniform(low=-0.5, high=0.5, size=xi.size)
yi = m * xi + b + noisei

## log scale parameters
xj = 2 ** xi
noisej = 2 ** noisei
yj = 2 ** yi

def twinboth(ax):
    # Alternately, we could do `newax = ax._make_twin_axes(frameon=False)`
    newax = ax.figure.add_subplot(ax.get_subplotspec(), frameon=False)
    newax.xaxis.set(label_position='top')
    newax.yaxis.set(label_position='right', offset_position='right')
    newax.yaxis.get_label().set_rotation(-90) # Optional...
    newax.yaxis.tick_right()
    newax.xaxis.tick_top()
    return newax

## initialize figure and linear axes
fig, axes = plt.subplots(nrows=2, ncols=2)
for axi in axes.ravel():
    ## plot linear
    axi.scatter(xi, yi, color='r', alpha=0.5, label='linear')
    axi.grid(color='k', alpha=0.3, linestyle=':')
    ## get twinned logarithmic axes
    axj = twinboth(axi)
    axj.set_xscale('log', basex=2)
    axj.set_yscale('log', basey=2)
    ## whole number instead of sci-notation
    axj.xaxis.set_major_formatter(ticker.ScalarFormatter())
    axj.yaxis.set_major_formatter(ticker.ScalarFormatter())
    ## attempt log-scaled minor ticks on twin axes
    axj.xaxis.set_minor_locator(ticker.LogLocator(base=2))
    axj.yaxis.set_minor_locator(ticker.LogLocator(base=2))
    axj.xaxis.set_minor_formatter(ticker.ScalarFormatter())
    axj.yaxis.set_minor_formatter(ticker.ScalarFormatter())
    ## plot log-scale on twin axes
    axj.scatter(xj, yj, color='b', alpha=0.5, label='log')

## get legend handles/labels from last iteration of for-loop above (avoid duplicates)
handlesi, labelsi = axi.get_legend_handles_labels()
handlesj, labelsj = axj.get_legend_handles_labels()
handles = handlesi + handlesj
labels = labelsi + labelsj
fig.subplots_adjust(bottom=0.2, wspace=0.3, hspace=0.3)
fig.legend(handles=handles, labels=labels, loc='lower center', mode='expand', ncol=2)

plt.show()
plt.close(fig)

Этот код генерирует рисунок ниже, на котором НЕТ второстепенных тиков.

MWE figure

1 Ответ

0 голосов
/ 15 января 2020

Ваши второстепенные тики скрыты вашими основными тиками.

axj.set_xscale('log', basex=2)
axj.set_yscale('log', basey=2)

Установите шкалы ваших "двойных осей" на логарифм и т. Д. С основными тиками логарифма (4, 16, 64, 256, 1024).

axj.xaxis.set_minor_locator(ticker.LogLocator(base=2))
axj.yaxis.set_minor_locator(ticker.LogLocator(base=2))

Добавим второстепенные отметки в логарифмированных местах, которые будут 4, 16, 64, 256, 1024; то же самое, что ваши основные тики.

То, что вы хотите сделать, это либо:

axi.xaxis.set_minor_locator(ticker.LogLocator(base=2))
axi.yaxis.set_minor_locator(ticker.LogLocator(base=2))

Добавление незначительных логарифмических тиков к вашей линейной оси, либо:

axj.xaxis.set_minor_locator(ticker.LinearLocator())
axj.yaxis.set_minor_locator(ticker.LinearLocator())

Добавление незначительных линейных тиков к оси логарифма.

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