从一个已经存在的matplotlib图开始,我通过在底部附加一个小轴来添加一个页脚.我们的 idea 是用任意数量的徽标填充这个页脚.我想把标志并排(由用户控制垫参数分开),使他们填补了页脚的高度,从而计算其宽度,以保持锁定的纵横比.

这是一个独立的MRE,总结了我的方法

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()

它产生了

enter image description here

然而,我必须明确地设置zoompos,以便数字占据正确的空间. 有没有一种方法可以自动计算这些参数,使数字自动放置在彼此旁边,他们填补页脚轴?或者也许有更好的方法?

我看到了许多定义带有不同行和列的子图来放置图形的示例,但我已经有了轴.我还没有找到任何方法来将已经存在的轴分割成相同宽度的任意数量的插入轴.

-编辑

在Jody Klymak令人惊叹的回答的基础上展开,这是我的最终版本.一旦你有了一个通用的轴来放置徽标(我仍然使用make_axes_locatableappend_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

    # set the limits, otherwise the focus in on the last image
    ax.set_xlim(0, left)
    ax.set_ylim(0, h)
    # anchor the fixed aspect-ratio axes on the left.
    ax.set_anchor('W')

用作

add_logos(ax_footer, ["../input/logos/Logonuovo.png",
                      "../input/logos/earth_networks_logo.png"])

推荐答案

这需要一些簿记,buffer是硬连接的,但它以一种相对简单的方式将图像堆叠在一起.做ax_footer.set_axis_on(),以便更清楚地看到正在发生的事情.但基本上,这会将所有徽标放在一个轴上,并使用imshowextent关键字参数来适当地放置它们.

请注意,对于不同大小的徽标,这是相对健壮的.如果你想让徽标垂直对齐,你也可以这么做.

有一些方法可以用HPacker等来做到这一点,但在我看来,这些方法都不必要地复杂.

from matplotlib.image import imread as read_png
import matplotlib.cbook as cbook
import matplotlib.pyplot as plt
import numpy as np

fig, axs = plt.subplot_mosaic([['a'], ['b']], height_ratios=[1, 0.3],
                              figsize=(4, 4), layout='constrained')

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

ax = axs['a']
cs = ax.contourf(X, Y, z, cmap='PuBu_r')
ax.set_axis_off()

ax_footer = axs['b']
ax_footer.set_axis_off()

nlogo = 3
left = 0
buffer = 30
maxy = -100

for i in range(nlogo):
    logo = cbook.get_sample_data('grace_hopper.jpg')
    imdata = read_png(logo)[:-(i*80+1), :]

    w = imdata.shape[1]
    h = imdata.shape[0]

    ax_footer.imshow(imdata, extent=[left, left + w, 0, h])

    left = left + w + buffer
    maxy = np.max([maxy, h])

# set the limits, otherwise the focus in on the last image
ax_footer.set_xlim(0, left)
ax_footer.set_ylim(0, maxy)

# anchor the fixed aspect-ratio axes on the left.
ax_footer.set_anchor('W')

plt.show()

enter image description here

Python相关问答推荐

只需使用Python在图像中保留 colored颜色 范围区域

try 使用tensorFlow.keras.models时optree Import错误

在Python中,什么表达相当于0x1.0p-53?

如何在vercel中指定Python运行时版本?

过滤绕轴旋转的螺旋桨

如何在Python中使用ijson解析SON期间检索文件位置?

具有症状的分段函数:如何仅针对某些输入值定义函数?

剧作家Python没有得到回应

如何自动抓取以下CSV

如何访问所有文件,例如环境变量

如何获取TFIDF Transformer中的值?

Pandas—合并数据帧,在公共列上保留非空值,在另一列上保留平均值

avxspan与pandas period_range

如何设置视频语言时上传到YouTube与Python API客户端

索引到 torch 张量,沿轴具有可变长度索引

不能使用Gekko方程'

将pandas导出到CSV数据,但在此之前,将日期按最小到最大排序

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

Python Pandas—时间序列—时间戳缺失时间精确在00:00

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?