这是我的代码
import matplotlib.pyplot as plt
fig = plt.Figure()
ax = fig.axes[0]
ax.barh(bar_y_corodinates_list, bar_lengths_list, tick_label=countries_list)
这是我想添加标志的地方,即小图像
就像我传递 Y 轴标签的国家/地区列表一样 我想传递光盘中标志图像的路径列表。 我在 文档 中找不到任何开箱即用的选项。 是否可以 ?
Matplotlib 不直接支持在条形图上添加图像作为标记。但是,可以通过覆盖轴上的图像来实现此目的。以下是如何操作:
import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
# 示例数据
bar_y_corodinates_list = [1, 2, 3, 4, 5]
bar_lengths_list = [10, 5, 8, 12, 6]
countries_list = ['美国', '中国', '日本', '德国', '英国']
flag_paths = ['us.png', 'china.png', 'japan.png', 'germany.png', 'uk.png'] # 将其替换为的标志文件路径
fig, ax = plt.subplots()
ax.barh(bar_y_corodinates_list, bar_lengths_list, tick_label=countries_list)
# 循环遍历每个条形并在其右侧添加标志
for i, path in enumerate(flag_paths):
# 加载图像
img = plt.imread(path)
imagebox = OffsetImage(img, zoom=0.1) # 调整缩放以适应的标志大小
ab = AnnotationBbox(imagebox, (bar_lengths_list[i], bar_y_corodinates_list[i]),
xycoords='data',
frameon=False,
box_alignment=(1,0.5)) # (1,0.5) 将图像放置在条的右侧并垂直居中
ax.add_artist(ab)
plt.show()
此代码执行以下操作:
-
导入必要的库:
导入
plt
用于绘图,导入OffsetImage
和AnnotationBbox
用于在轴上放置图像。 -
加载标志图像:
在
flag_paths
列表中,提供每个国家/地区的标志图像的路径。 - 循环遍历每个条形:
-
使用
plt.imread
加载当前条形的标志图像。 -
使用
OffsetImage
创建一个图像框,并使用zoom
参数调整图像大小。 -
使用
AnnotationBbox
创建一个注释框,该框将图像框放置在指定位置(在此例中,在条形的右侧)。 -
xycoords='data'
确保使用数据坐标放置图像。 -
box_alignment=(1,0.5)
将图像水平放置在右侧(1),并垂直居中(0.5)。 -
使用
ax.add_artist
将注释框添加到轴。 -
显示绘图:
plt.show()
显示生成的条形图,其中包含在每个条形右侧的标志。
请记住,需要将
flag_paths
列表中的示例标志文件名替换为实际标志文件的路径。可能还需要根据图像的大小和条形图的尺寸调整
zoom
参数。