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

如何在seaborn/matplotlib柱状图中使用图片作为xtick标签

实现方案:将柱状图X轴刻度替换为对应小物体图片

前置依赖

  • 提前准备好im数组,按索引对应你要展示的64x64图片,支持PIL Image对象或者numpy数组格式
  • 依赖库:matplotlib、seaborn、pillow(可选,用于读取本地图片文件)

完整实现代码

import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import numpy as np
from PIL import Image

# ---------------------- 数据&图片准备 ----------------------
# 替换为你的实际频次统计数据,对应类别1到N的出现次数
freq_data = [12, 25, 18, 30, 22]
class_count = len(freq_data)

# 初始化im数组,占位让索引从1开始,符合你im[1]对应类别1的要求
im = [None]
for i in range(1, class_count+1):
    # 替换为你自己的图片读取逻辑,示例为随机色块占位
    # im.append(np.array(Image.open(f"你的图片路径_{i}.png")))
    im.append(np.random.randint(0, 256, (64,64,3), dtype=np.uint8))

# ---------------------- 绘制基础柱状图 ----------------------
sns.set_style("whitegrid")
fig, ax = plt.subplots(figsize=(10, 6))
sns.barplot(x=np.arange(1, class_count+1), y=freq_data, ax=ax)

# ---------------------- 替换X轴刻度为图片 ----------------------
# 隐藏原有文本刻度
ax.set_xticklabels([])
# 遍历每个类别位置挂载对应图片
for x_pos in range(1, class_count+1):
    # 调整zoom参数控制图片显示大小
    img_box = OffsetImage(im[x_pos], zoom=0.5)
    img_box.image.axes = ax
    # 调整xybox第二个参数控制图片和X轴的间距,负数代表向下偏移
    ab = AnnotationBbox(img_box, (x_pos-1, 0),
                        xybox=(0, -35),
                        xycoords='data',
                        boxcoords="offset points",
                        pad=0,
                        frameon=False)
    ax.add_artist(ab)

# 调整底部边距,给图片预留足够显示空间
plt.subplots_adjust(bottom=0.22)
plt.show()

常见适配调整

  • 图片尺寸不合适:修改OffsetImage的zoom参数,数值越大图片显示越大
  • 图片和X轴间距不合适:修改xybox的第二个数值,数值越小(越负)图片离X轴越远
  • 使用matplotlib原生bar而非seabornbarplot:去掉x_pos-1的偏移,直接填写x_pos即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:36:04