如何用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
相关产品推荐
相关产品推荐

