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

如何在Plotly及raceplotly条形图中为分类添加图片?

在raceplotly动态条形图中为分类添加对应图片

raceplotly本身没有直接提供添加图片的内置参数,但它基于Plotly构建,我们可以通过修改其生成的Figure对象,手动添加图片注释来实现需求。以下是具体实现步骤:

步骤1:准备包含图片链接的数据集

首先确保你的数据中新增一列(比如IMAGE_URL),存储每个分类(如游戏名称)对应的图片地址。支持两种类型的图片:

  • 公开可访问的在线图片URL
  • 本地图片需转换为Base64编码格式(示例代码见下文)

步骤2:修改raceplotly生成的Figure对象

生成基础动态条形图后,获取其Figure对象,遍历每个帧添加图片注释,并调整布局适配图片显示:

import plotly.graph_objects as go
from raceplotly.plots import barplot
import base64

# 处理本地图片为Base64编码(如果使用在线图片可跳过此函数)
def get_base64_image(img_path):
    with open(img_path, 'rb') as img_file:
        return f'data:image/png;base64,{base64.b64encode(img_file.read()).decode()}'

# 假设你的数据集data已包含CONCEPT_NAME、MATCH_COUNT、WEEK列,新增IMAGE_URL列
# 示例:给每个游戏匹配对应图片(本地图片需提前转换,在线图片直接填URL)
data['IMAGE_URL'] = data['CONCEPT_NAME'].apply(
    lambda x: get_base64_image(f'./game_images/{x}.png')  # 替换为你的图片路径或在线URL
)

# 初始化raceplot并生成基础Figure
my_raceplot = barplot(data,
                      item_column='CONCEPT_NAME',
                      value_column='MATCH_COUNT',
                      time_column='WEEK')

fig = my_raceplot.plot(title='Top 10 GAMES BY MP MATCH COUNT',
                       item_label='Top 10 GAME',
                       value_label='MP MATCH COUNT',
                       frame_duration=800)

# 建立分类与图片的映射字典
item_img_map = data.set_index('CONCEPT_NAME')['IMAGE_URL'].to_dict()

# 更新初始帧的图片注释
initial_bars = fig.data[0]
fig.annotations = []
for idx, item in enumerate(initial_bars.y):
    img_url = item_img_map.get(item)
    if not img_url:
        continue
    fig.annotations.append({
        'x': 0,  # 图片位置(条形左侧,可根据需求调整为values[idx]放在右侧)
        'y': idx,
        'xref': 'x',
        'yref': 'y',
        'showarrow': False,
        'img': {'src': img_url, 'width': 30, 'height': 30},  # 调整图片尺寸
        'xanchor': 'right',
        'yanchor': 'middle'
    })

# 更新每个动画帧的图片注释
for frame in fig.frames:
    frame.annotations = []
    frame_bars = frame.data[0]
    for idx, item in enumerate(frame_bars.y):
        img_url = item_img_map.get(item)
        if not img_url:
            continue
        frame.annotations.append({
            'x': 0,
            'y': idx,
            'xref': 'x',
            'yref': 'y',
            'showarrow': False,
            'img': {'src': img_url, 'width': 30, 'height': 30},
            'xanchor': 'right',
            'yanchor': 'middle'
        })

# 调整X轴范围,给左侧图片留出显示空间(根据你的数据调整偏移量)
fig.layout.xaxis.range = [fig.layout.xaxis.range[0] - 6000, fig.layout.xaxis.range[1]]

fig.show()

关键说明

  • 图片位置:代码中默认将图片放在条形左侧(x=0),如果需要放在条形右侧,可将x值改为对应条形的数值(frame_bars.x[idx]),同时将xanchor设为left。
  • 图片尺寸:通过width和height参数调整图片大小,适配你的图表布局。
  • 本地图片处理:使用get_base64_image函数将本地图片转换为Plotly支持的Base64格式,避免跨域问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:20:33