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__