Я пытаюсь построить серию сигналов таким образом, чтобы они равномерно распределялись вдоль оси y.Я считаю, что matplotlib.transforms
это путь.У меня есть что-то элементарное, работающее с использованием этого кода:
import matplotlib.transforms
import matplotlib as mp
import numpy as np
import pylab as pl
%matplotlib inline
ax = pl.gca()
n_levels = 10
t = np.arange(1000)/1000
offset_step = 1/(n_levels + 1)
for i in range(n_levels):
offset = offset_step * (i + 1)
o = mp.transforms.ScaledTranslation(0, offset, ax.transAxes)
trans = mp.transforms.blended_transform_factory(ax.transData, ax.transData + o)
y = np.sin(t*2*np.pi*10*i)
p, = ax.plot(t, y, 'k-', transform=trans)
ax.axis(ymin=0, ymax=25)
Это создает следующий график.

Даже при том, что фактические смещения в координатах осей0,09 0,18 ... 0,82 0,91, линии явно не появляются с такими точными смещениями!Что я делаю не так?
Редактировать: Чтобы ответить на некоторые вопросы, касающиеся того, почему я не могу просто применить смещение в пространстве данных, а не использовать преобразование.Это более простая форма более сложного преобразования, которое мне нужно сделать, когда я хочу иметь возможность масштабировать амплитуду отдельных линий без необходимости регулировать пределы по оси Y.Для этого действительное y-преобразование:
boxin = mp.transforms.Bbox([[0, 0], [1, 1]])
boxout = mp.transforms.Bbox([[0, 0], [1, 1]])
y_trans = mp.transforms.BboxTransform(boxin, boxout) + \
axes.transData + \
mp.transforms.ScaledTranslation(0, offset_step * (i + 1), axes.transAxes)
Затем в моем интерактивном приложении я могу изменить масштабирование каждого отдельного сигнала, используя:
scale = 2
box = np.array([[0, 0], [scale, scale]])
boxout.set_points(box)
figure.canvas.redraw()
Это действительно работаетЧто ж.Однако для различных вариантов n_levels
мне нужно изначально настроить ymin и ymax при генерации графика, чтобы гарантировать, что линии расположены на одинаковом расстоянии вдоль оси y.Желаемый результат:
