Matplotlib: возможно ли создать новую ось с заданным смещением по оси y без создания подплота?

С помощью sankey-toolbox в Matplotlib мы можем автоматически строить sankey-диаграммы: положение sankey-объекта автоматически рассчитывается на основе положения его предшествующего объекта и не может быть задано вручную; и когда инициализируется санкей-диаграмма, положение первого санкей-объекта будет назначено с помощью ввода оси. (точка (0,0) будет центральной точкой этого объекта)

И вот ситуация: я хочу нарисовать две диаграммы Санки с заданным смещением по оси Y, и несколько портов двух диаграмм должны быть подключены. Следовательно, необходимы две системы координат со смещением по y в одном и том же субплощадке. Я пробовал метод 'add_axes', но с помощью этого метода создается новый участок, и возникает проблема с масштабированием графики.

Теперь вот вопрос: возможно ли создать новую систему координат с заданным смещением по оси y без создания подзаговора?

2 ответа

Решение

Не совсем полный ответ, но он может помочь вам найти решение:sankey.add() поддерживает transform Ключевой аргумент. В зависимости от вашей фигуры, создайте новый transform экземпляр, и используйте его для сдвинутой части вашей фигуры:

offset = transforms.ScaledTranslation(0.0, 0.5, fig.dpi_scale_trans)
new_transform = ax.transData + offset
sankey.add(flows=[-0.25, 0.15, 0.1], fc='#37c959', label='two',
           orientations=[-1, -1, -1], prior=0, connect=(0, 0),
           transform = new_transform)

Чтобы создать новое преобразование, вспомогательная функция matplotlib.transforms.offset_copy() Также может быть полезно:

new_transform = offset_copy(ax.transData, fig=fig,
                            x = 0.05, y=0.10, units='inches')

Задача решена. Я написал подкласс Affine2DBase -class для преобразования координат на основе заданного объекта преобразования, например, объекта ax.transData. И это хорошо работает для моей программы... надеюсь, это поможет другим людям.

class coordinateTranslation(Affine2DBase):
    def __init__(self, dx, dy, transform, **kwargs):
        Affine2DBase.__init__(self,**kwargs)
        self._dx = dx
        self._dy = dy
        self._transform = transform
        self._mtx = None
        self._inverted = None
    def __repr__(self):
        return "coordinateTranslation(%r, %r)" % (self._dx, self._dy)
    def get_matrix(self):
        dx, dy = self._transform.transform((self._dx, self._dy))
        dx_zero, dy_zero = self._transform.transform((0, 0))
        dx -= dx_zero; dy -= dy_zero
        self._mtx = np.array([[1.0, 0.0, dx],
                              [0.0, 1.0, dy],
                              [0.0, 0.0, 1.0]], np.float_)
        self._inverted = None
        return self._mtx
    get_matrix.__doc__ = Affine2DBase.get_matrix.__doc__
Другие вопросы по тегам