Автоматическое размещение изображения поверх графика matplotlib - PullRequest
0 голосов
/ 16 июня 2020

У меня есть созданная мною карта 2D-данных, но я также хотел бы добавить на карту lo go. Я хочу, чтобы изображение автоматически позиционировалось в зависимости от размера созданной мной фигуры. Я могу сделать это вручную следующим образом:

im = Image.open('E:/Riskpulse_HD/Cefetra/Riskpulse_logo.png')
fig.set_dpi(150)
plt.figimage(im, xo=1000, yo=135)

Однако, если фигура меняет размеры из-за длинного заголовка, размера цветовой полосы и т. Д. c., Lo go будет в неправильном положении. Как я могу автоматизировать положение, чтобы оно всегда хорошо помещалось в правом нижнем углу? Для справки, все размеры фигур, которые я создаю, имеют размер (10,12).

Пример рисунка:

enter image description here

1 Ответ

0 голосов
/ 16 июня 2020

Вы можете получить размер изображения

im_width, im_height = im.size

print(im_width, im_height)

и размер графика

bbox = plt.gca().get_window_extent()

print(bbox.x0, bbox.y0, bbox.x1, bbox.y1)

и вычислить положение в правом нижнем углу

plt.figimage(im, xo=bbox.x1-im_width, yo=bbox.y0)

В конце концов вам может понадобиться поля

margin_x = 20
margin_y = 20

plt.figimage(im, xo=bbox.x1-im_width-margin_x, yo=bbox.y0+margin_y)

EDIT: Я добавил функцию, которая перемещает изображение в угол при изменении размера окна.

Код:

import matplotlib.pyplot as plt
from PIL import Image

# --- functions ---

def on_resize(event):
    #print(event)

    bbox = plt.gca().get_window_extent()
    print(bbox.x0, bbox.y0, bbox.x1, bbox.y1)

    logo.ox = bbox.x1-im_width-margin_x
    logo.oy = bbox.y0+margin_y

# --- main ---

plt.plot([1,2,3], [1,2,3])

im = Image.open('square-1.png')
im_width, im_height = im.size
print(im_width, im_height)

bbox = plt.gca().get_window_extent()
print(bbox.x0, bbox.y0, bbox.x1, bbox.y1)

margin_x = 20
margin_y = 20
logo = plt.figimage(im, xo=bbox.x1-im_width-margin_x, yo=bbox.y0+margin_y)

# connect function which will move image when window is resized
plt.gcf().canvas.mpl_connect('resize_event', on_resize)

plt.show()

Результат:

enter image description here

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