У меня есть несколько графиков разного размера (например, figsize=(4,4), figsize=(20,20), figsize=(10,5)).
Цель
Моя цель - вставить логотип/водяной знак и понять, как настроить:
- Размер (как уменьшить или увеличить без искажения исходных пропорций)
- Расположение (как разместить в центре, сверху/снизу/слева/справа)
исходя из конкретной фигуры и осей, которые я собираюсь рисовать, и я хотел бы сделать через figure.figimage
и не используя zoomed_inset_axes
Я создал:
- следующие примеры;
- ряд вопросов, которые я прочитал на StackOverflow, которые я нашел полезными, но я все еще застрял;
- ряд личных соображений;
Пример
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")
но это не повлияет на ось только изображение внутри