如何在已有Matplotlib轴中自动并排放置Logo并适配Footer高度?
需求说明
我们基于已有的Matplotlib图形,在底部添加了一个Footer轴,希望实现:
- Logo并排摆放,间距支持用户自定义
- Logo填充Footer轴的高度,同时保持自身宽高比不变
当前实现的可复现代码
from matplotlib.image import imread as read_png import matplotlib.cbook as cbook import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.axes_grid1 import make_axes_locatable from matplotlib.offsetbox import AnnotationBbox, OffsetImage fig = plt.figure(1, figsize=(6, 6)) ax = plt.gca() ax.set_axis_off() X, Y = np.meshgrid(np.linspace(-3.0, 3.0, 100), np.linspace(-2.0, 2.0, 100)) Z1 = np.exp(-X**2 - Y**2) Z2 = np.exp(-(X * 10)**2 - (Y * 10)**2) z = Z1 * 30 + 50 * Z2 cs = ax.contourf(X, Y, z, cmap='PuBu_r') ax_divider = make_axes_locatable(ax) ax_footer = ax_divider.append_axes( "bottom", size="10%", pad=0.1) ax_footer.set_axis_off() def add_logo(ax, logo, zoom, pos): img_logo = OffsetImage(read_png(logo), zoom=zoom) logo_ann = AnnotationBbox( img_logo, pos, xycoords='axes fraction', frameon=False, box_alignment=(0, 0.25)) at = ax.add_artist(logo_ann) return at add_logo(ax_footer, cbook.get_sample_data('grace_hopper.jpg'), zoom=0.07, pos=(0, 0)) add_logo(ax_footer, cbook.get_sample_data('grace_hopper.jpg'), zoom=0.07, pos=(0.2, 0)) plt.show()
当前实现需要手动设置zoom和pos参数才能让Logo适配Footer空间,无法自动完成排版。请问是否可以自动计算参数实现Logo自动并排并填满Footer轴?或者有更优的实现方案?
此前见过通过定义行列子图放置图片的示例,但我们已有现成的轴,未找到将已有轴拆分为等宽内嵌轴的方法。
最终实现方案(基于社区回答整理)
只要有用于放置Logo的通用轴(仍可通过make_axes_locatable和append_axes创建),即可使用以下函数实现自动排版:
def add_logos(ax, logos, x_padding=10): left = 0 for _, logo in enumerate(logos): imdata = read_png(logo) w = imdata.shape[1] h = imdata.shape[0] ax.imshow(imdata, extent=[left, left + w, 0, h]) left = left + w + x_padding # 设置轴范围,避免仅聚焦最后一张图片 ax.set_xlim(0, left) ax.set_ylim(0, h) # 将固定宽高比的轴锚定在左侧 ax.set_anchor('W')
使用示例
add_logos(ax_footer, ["../input/logos/Logonuovo.png", "../input/logos/earth_networks_logo.png"])
内容的提问来源于stack exchange,提问作者Droid
相关产品推荐
相关产品推荐

