import numpy as np import matplotlib.pyplot as plt # 数据准备 species = ['Finless porpoise', 'Sea turtle', 'Whale Shark'] categories = ['Gillnet', 'Trawl', 'Seine', 'Other'] alive_data = [ [33.93, 28.26, 0, 21.43], [0.69, 2.56, 2.78, 0], [0, 23.08, 0, 66.67] ] # 设置柱状图宽度 bar_width = 0.15 index = np.arange(len(categories)) # 创建画布和子图 fig, ax = plt.subplots(figsize=(12, 8)) # 定义颜色方案 colors_alive = ['#F84B35', '#166f0e', '#9C6644'] # 存活数颜色 # 绘制分组堆叠柱状图 for i, specie in enumerate(species): # 存活数 ax.bar(index + i * bar_width, alive_data[i], bar_width, color=colors_alive[i], label=f'{specie} Alive',edgecolor='black') # 设置字体样式 plt.rcParams['font.sans-serif'] = ['Arial'] # 设置无衬线字体[^1] plt.rcParams['font.size'] = 18 # 设置字号 plt.rcParams['font.weight'] = 'bold' # 设置加粗[^1] # 增强坐标轴和刻度线 for spine in ax.spines.values(): spine.set_linewidth(2) spine.set_color('black') ax.tick_params(axis='both', which='major', width=2, length=6, color='black') # 添加标签、标题和图例 ax.set_ylabel('Mortality rate (%)', fontsize=18) ax.set_xticks(index + bar_width * (len(species) - 1) / 2) ax.set_xticklabels(categories, fontweight='bold', fontsize=18) ax.legend(fontsize=12, frameon=True, edgecolor='black', facecolor='white') # 调整x轴标签,使其更加紧凑并旋转一定角度 plt.xticks(fontsize=16) # 增大x轴刻度字体 plt.yticks(fontsize=16) # 增大y轴刻度字体 # 调整布局并显示 plt.tight_layout() plt.savefig('species_distributionB.tiff', dpi=600, bbox_inches='tight', facecolor=ax.get_facecolor(), edgecolor='none') plt.show() 字号什么的不改,就在柱状图标注数字即可
时间: 2025-07-28 22:11:42 浏览: 16
<think>我们只需要在绘制柱状图后,在每个柱子的顶部添加对应的数字标签即可。可以使用ax.text()或ax.annotate()来添加标签。这里我们使用ax.text(),因为它更简单。注意:由于数据是百分比,我们可以将其格式化为字符串,并加上百分号。步骤:1.在每次绘制一个物种的柱状图后,遍历每个柱子的位置和高度,然后在对应位置添加文本。2.文本的位置:x坐标是柱子的中心(我们计算每个柱子的x位置),y坐标是柱子的高度加上一个小偏移量(避免重叠)。3.文本内容:将数值转换为字符串,并保留适当的小数位数(这里数据已经是两位小数,所以我们可以直接使用,或者格式化为字符串)。注意:由于我们的柱状图是分组绘制,所以x坐标是index+i*bar_width,每个柱子的宽度是bar_width。修改部分:在绘制每个柱状图的循环内部,添加一个内层循环来为每个柱子添加标签。另外,注意y轴标签改为'Mortalityrate(%)',所以我们在每个柱子上方标注的也是百分比数值。代码修改如下:</think>以下是在柱状图上添加数字标注的代码实现,保留原有字号和样式不变:
```python
import numpy as np
import matplotlib.pyplot as plt
# 数据准备
species = ['Finless porpoise', 'Sea turtle', 'Whale Shark']
categories = ['Gillnet', 'Trawl', 'Seine', 'Other']
alive_data = [
[33.93, 28.26, 0, 21.43],
[0.69, 2.56, 2.78, 0],
[0, 23.08, 0, 66.67]
]
# 设置柱状图宽度
bar_width = 0.15
index = np.arange(len(categories))
# 创建画布和子图
fig, ax = plt.subplots(figsize=(12, 8))
# 定义颜色方案
colors_alive = ['#F84B35', '#166f0e', '#9C6644'] # 存活数颜色
# 绘制分组堆叠柱状图
for i, specie in enumerate(species):
# 绘制柱状图
bars = ax.bar(index + i * bar_width, alive_data[i], bar_width,
color=colors_alive[i], label=f'{specie} Alive', edgecolor='black')
# 在柱状图上添加数字标注
for j, bar in enumerate(bars):
height = bar.get_height()
# 设置标签位置和格式
if height > 0: # 只显示大于0的值
# 根据值的大小调整标签位置
va = 'bottom' if height < 5 else 'top'
y_pos = height + 1 if height < 5 else height - 1
ax.text(bar.get_x() + bar.get_width()/2., y_pos,
f'{height:.2f}%', # 保留两位小数并添加百分号
ha='center', va=va,
fontsize=14, fontweight='bold',
color='black' if height < 5 else 'white')
# 设置字体样式
plt.rcParams['font.sans-serif'] = ['Arial'] # 设置无衬线字体
plt.rcParams['font.size'] = 18 # 设置字号
plt.rcParams['font.weight'] = 'bold' # 设置加粗
# 增强坐标轴和刻度线
for spine in ax.spines.values():
spine.set_linewidth(2)
spine.set_color('black')
ax.tick_params(axis='both', which='major', width=2, length=6, color='black')
# 添加标签、标题和图例
ax.set_ylabel('Mortality rate (%)', fontsize=18)
ax.set_xticks(index + bar_width * (len(species) - 1) / 2)
ax.set_xticklabels(categories, fontweight='bold', fontsize=18)
ax.legend(fontsize=12, frameon=True, edgecolor='black', facecolor='white')
# 设置Y轴范围,为标签留出空间
ax.set_ylim(0, max([max(data) for data in alive_data]) * 1.2)
# 调整x轴标签,使其更加紧凑并旋转一定角度
plt.xticks(fontsize=16) # 增大x轴刻度字体
plt.yticks(fontsize=16) # 增大y轴刻度字体
# 调整布局并显示
plt.tight_layout()
plt.savefig('species_distributionB.tiff', dpi=600, bbox_inches='tight', facecolor=ax.get_facecolor(), edgecolor='none')
plt.show()
```
### 代码解释:
1. **添加数据标签**:
- 在绘制每个柱状图后,遍历每个柱子(`bar`)
- 使用`ax.text()`函数在每个柱子上方添加文本标签
- 标签内容为`f'{height:.2f}%'`,保留两位小数并添加百分号
2. **标签位置调整**:
- 根据值的大小自动调整标签位置:
- 小数值(<5)显示在柱子上方(`va='bottom'`)
- 大数值(≥5)显示在柱子内部顶部(`va='top'`)
- 设置垂直位置偏移量避免重叠
3. **标签样式优化**:
- 字体大小设为14,保持可读性
- 字体加粗增强可见性
- 根据背景颜色调整文本颜色:
- 深色背景(高值)使用白色文本
- 浅色背景(低值)使用黑色文本
4. **其他优化**:
- 添加`if height > 0`条件避免显示0值标签
- 设置Y轴范围上限为最大值的1.2倍,为标签留出空间
- 保持原有字号和样式不变
### 效果说明:
- 每个柱状图顶部会显示对应的数值百分比
- 小数值显示在柱子外部上方
- 大数值显示在柱子内部顶部
- 标签颜色会根据背景自动调整确保可读性
- 保持原有的字体大小和样式不变
阅读全文
相关推荐

















