Как выровнять тики по логарифмической шкале по участкам? - PullRequest
0 голосов
/ 02 июля 2019

Я хочу зафиксировать положение тиков на логарифмической шкале, чтобы они были одинаковыми на каждом участке (см. Красную аннотацию на изображении).Мой код выглядит следующим образом:

ax = fig.add_subplot(2,2, axis)
ax2 = ax.twinx()
ax2.set_yscale('log')
ax2.set_ylim(0,100)

Прямо сейчас, set_yscale=('log') оптимизирует интервал между тиками для каждого субплота.Я предпочитаю использовать интервал между галочками в правом верхнем участке.

enter image description here

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Этого можно добиться, получив пределы левой двойной оси и установив ее как пределы правой двойной оси.

Рассмотрим следующий рабочий пример.Выполните эту процедуру для вспомогательных участков, для которых вы хотите выровнять оси.



import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8, 3))

axl = fig.add_subplot(121)
axr = fig.add_subplot(122)

ax1 = axl.twinx()
ax1.plot(np.logspace(-2, 3, 5))
ax1.set_yscale('log')

ax2 = axr.twinx()
ax2.plot(np.logspace(0, 3, 5))
ax2.set_yscale('log')

ax2.set_ylim(ax1.get_ylim()) # <-- This is the key line

plt.tight_layout()
plt.show()

enter image description here

0 голосов
/ 04 июля 2019

Решение ОП:

Построить фиктивную кривую и установить alpha=0.Убедитесь, что кривая охватывает y_min и y_max.

fig = plt.figure()
axes = [1,2,3,4]

for axis in axes:
    ax = fig.add_subplot(2,2, axis)
    ax2 = ax.twinx()
    ax2.set_yscale('log')
    ax2.plot(x_dummy, y_dummy, alpha=0)            # <-- dummy plot

    x_real, y_real = func_that_loads_data()        # <-- your interesting plot 
    curve1 = ax2.plot(x_real, y_real)        

plt.show()

Решение, предоставленное Шелдором, было непрактичным для реализации, потому что я строю свои данные, используя цикл for (неизбежно, если я не увеличу количество переменных).

Поскольку я перезаписываю переменную ax на каждой итерации, мне придется сохранять предел по оси y как глобальную переменную. Прочтите здесь, почему следует избегать глобальных переменных.

ax = fig.add_subplot(2,2, axis)
ax2 = ax.twinx()
ax2.set_yscale('log') 

if axis == 1:
    global yscale
    yscale = ax2.get_ylim()                       # <-- where the magic happens
elif axis > 1:
    ax2.set_ylim(yscale)
...