You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python在Matplotlib中实现图片叠加彩色方块行效果?

问题描述

我想生成一张JPG格式的图片,结构为上方是原图,下方是一排带独立颜色的方块调色板。目前已写出实现彩色方块行的代码,但不知道如何在调色板上方添加原图。

现有代码

palette, scores = ['#272727', '#fafafa', '#1a1a1a', '#979797', '#a1473d'], [0.75, 0.16, 0.05, 0.04, 0.0]

fig = plt.figure(figsize=(5,1))
ax = fig.add_subplot()
ax.axes.xaxis.set_visible(False)
ax.axes.yaxis.set_visible(False)

for i, color in enumerate(palette):
    x = i/len(palette)
    rect = Rectangle((x, 0), .20, 1, facecolor=color)
    ax.add_patch(rect)

plt.savefig(os.path.join(save_dir, f'{id+1}.png'))

当前效果

仅显示下方的彩色调色板方块,无上方原图。

目标效果

上方展示原图,下方对应显示调色板方块,整体为一张竖向组合图片。


解决方案

通过Matplotlib的子图布局,将画布分为上下两个区域,分别放置原图和调色板,修改后的代码如下:

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import os
from PIL import Image

# 调色板数据
palette, scores = ['#272727', '#fafafa', '#1a1a1a', '#979797', '#a1473d'], [0.75, 0.16, 0.05, 0.04, 0.0]
image_path = "你的原图路径.jpg"  # 替换为实际原图路径
save_dir = "保存目录"  # 替换为实际保存目录
id = 0  # 根据实际场景调整

# 设置画布尺寸,可根据原图比例微调,示例中总高度为5(原图占4,调色板占1)
fig = plt.figure(figsize=(5, 5))

# 上方子图:显示原图
ax_img = fig.add_subplot(2, 1, 1)
ax_img.imshow(Image.open(image_path))
ax_img.axis('off')  # 隐藏坐标轴

# 下方子图:绘制调色板
ax_palette = fig.add_subplot(2, 1, 2)
ax_palette.axis('off')

palette_num = len(palette)
for i, color in enumerate(palette):
    x = i / palette_num
    # 用1/palette_num作为方块宽度,确保铺满子图宽度
    rect = Rectangle((x, 0), 1/palette_num, 1, facecolor=color)
    ax_palette.add_patch(rect)

# 自动调整子图间距,避免内容重叠
plt.tight_layout()

# 保存为JPG格式
plt.savefig(os.path.join(save_dir, f'{id+1}.jpg'), format='jpg', dpi=100)
plt.close()

关键调整点

  • 用add_subplot(2,1,1)和add_subplot(2,1,2)创建上下分栏的子图布局。
  • 借助PIL库读取原图,通过imshow()在上方子图展示。
  • 调整调色板方块宽度为1/调色板颜色数量,保证方块刚好铺满下方子图宽度,消除空隙。
  • 调用tight_layout()自动优化子图间距,避免原图和调色板挤压。

内容的提问来源于stack exchange,提问作者stwhite

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:27:32