Вставьте и измените размер логотипа водяного знака на разных графиках из URL-адреса в Matplotlib

У меня есть несколько графиков разного размера (например, figsize=(4,4), figsize=(20,20), figsize=(10,5)).

Цель

Моя цель - вставить логотип/водяной знак и понять, как настроить:

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

исходя из конкретной фигуры и осей, которые я собираюсь рисовать, и я хотел бы сделать через figure.figimage и не используя zoomed_inset_axes

Я создал:

  1. следующие примеры;
  2. ряд вопросов, которые я прочитал на StackOverflow, которые я нашел полезными, но я все еще застрял;
  3. ряд личных соображений;

Пример

import matplotlib as mpl
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes
from mpl_toolkits.axes_grid1.inset_locator import mark_inset

#Importing png from URL and creating the timeseries to plot
logo =plt.imread("https://upload.wikimedia.org/wikipedia/en/thumb/c/c6/University_Roma_Tre_logo.svg/440px-University_Roma_Tre_logo.svg.png")
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2010', periods=1000)).cumsum()

#first example.
title = 'Random Time Series Plot with Watermark'

ax = ts.plot(figsize=(14, 8))
ax.set_title(title, fontsize=20)
ax.figure.figimage(logo, 100, 100, alpha=.15, zorder=1)
axins = zoomed_inset_axes(ax,0.5, loc=1)  # zoom = 6
axins.imshow(logo,  interpolation="nearest",
             origin="upper")

Первый вывод

Здесь логотип слишком большой, а оси вставки явно имеют ось

#second example

ax2 = ts.plot(figsize=(5,5))
ax2.set_title(title, fontsize=20)
ax2.figure.figimage(logo, 100, 100, alpha=.15, zorder=1)
axins2 = zoomed_inset_axes(ax2,0.5, loc=1)  
axins2.imshow(logo,  interpolation="nearest",
             origin="upper")

Второй вывод

введите здесь описание изображения

#third example

ax3 = ts.plot(figsize=(20,5))
ax3.set_title(title, fontsize=20)
ax3.figure.figimage(logo, 0, max(ts), alpha=.15, zorder=1)
axins3 = zoomed_inset_axes(ax3,1, loc=1)  
axins3.imshow(logo,interpolation="nearest",origin="upper")

Третий вывод

введите здесь описание изображения

Связанные вопросы

Как добавить и изменить размер изображения в matplotlib график? Ответ был просто комментарием к другим связанным вопросам

Встраивание небольших графиков внутрь подграфиков в matplotlib Очень интересно, Я обнаружил, как работает inset_locator и inset_locator.zoomed_inset_axes, но я может применяться только к осям, но не к изображениям. Я думал сделать xticks и ytikcs белым цветом, но я думаю, что это неправильный способ действия.

Прочитайте еще раз документацию по gridspec

Рассмотрение

- С помощью zoomed_inset_axes(ax3,1, loc=1) я могу определить уровень масштабирования, с помощью loc от 1 до 4 я могу определить местоположение (внизу справа 1, внизу слева 2, вверху слева 3, вверху справа 4

- Размещая изображение через zoomed_inset_axes, по умолчанию также будут отображаться оси x, y.

-Я не уверен в интерполяции, я прочитал документацию, но все еще проблемы с пониманием. Эмпирически, если я избегаю интерполяции, изображение становится менее зернистым.

  • Я могу установить альфа-значение вставленного изображения через

     axins2.imshow(logo, alpha=.15, 
              origin="upper")
    

но это не повлияет на ось только изображение внутри

введите здесь описание изображения


person Andrea Ciufo    schedule 14.02.2021    source источник