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

Python水平条形图末尾加国旗仅显最后一个,求排查问题

问题分析与解决方案

你遇到的水平条形图仅显示最后一个国家国旗的问题,核心原因是国旗位置与条形重叠导致遮挡,同时可能存在资源路径或位置匹配的隐性问题。以下是具体分析和修正方案:

错误原因

  1. 国旗与条形重叠:原代码将国旗放置在条形的末端区域(x-w到x),若条形颜色与国旗颜色相近,会直接导致国旗被条形遮挡,无法正常显示。
  2. 资源路径隐患:如果部分国家的国旗文件路径错误(如文件缺失、文件名大小写不匹配),会导致这些国旗无法加载,仅最后一个能正常显示。

修正后的代码

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from pycountry import countries

def pos_image(x, y, country_name, bar_height, ax):
    # 获取国家alpha2代码并转为小写
    country_code = countries.get(country_name).alpha2.lower()
    # 国旗文件路径(确保iso-flag-png文件夹存在,文件命名正确)
    img_path = f"iso-flag-png/{country_code}.png"
    try:
        im = mpimg.imread(img_path)
    except FileNotFoundError:
        print(f"警告:未找到{country_name}的国旗文件 {img_path}")
        return
    # 使用图片实际宽高比计算国旗宽度,避免变形
    img_ratio = im.shape[1] / im.shape[0]
    flag_width = bar_height * img_ratio
    # 将国旗放置在条形右侧外部,避免覆盖条形
    ax.imshow(im,
              extent=(x, x + flag_width, y, y + bar_height),
              zorder=2)

plt.style.use('seaborn')
fig, ax = plt.subplots()

liste_pays = [('France', 10), ('USA', 9), ('Spain', 5), ('Italy', 5)]

# 拆分国家名称和对应数值
country_names = [item[0] for item in liste_pays]
values = [item[1] for item in liste_pays]

bar_height = .8
# 绘制水平条形图
bars = ax.barh(y=country_names, width=values, height=bar_height, zorder=1)

# 为每个条形添加对应国旗
for bar, country, val in zip(bars, country_names, values):
    bar_y = bar.get_y()
    pos_image(val, bar_y, country, bar_height, ax)

# 扩展x轴范围,确保所有国旗完全显示
max_val = max(values)
# 计算最大国旗宽度,预留足够显示空间
max_flag_ratio = max([mpimg.imread(f"iso-flag-png/{countries.get(c).alpha2.lower()}.png").shape[1]/mpimg.imread(f"iso-flag-png/{countries.get(c).alpha2.lower()}.png").shape[0] for c in country_names])
ax.set_xlim(0, max_val + bar_height * max_flag_ratio)

plt.show()

关键修正点

  • 国旗位置调整:将extent参数的x范围改为(x, x + flag_width),把国旗移到条形右侧的外部区域,彻底避免与条形重叠。
  • 动态宽高比:根据国旗图片的实际宽高比计算显示宽度,保证国旗不会拉伸变形。
  • 错误排查:添加try-except捕获文件缺失异常,方便快速定位资源问题。
  • 轴范围扩展:手动调整x轴最大值,确保所有国旗都能完整显示在图表中。
  • 代码可读性优化:拆分变量、明确命名,避免元组元素混淆导致的位置错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:13:13