import numpy as np import matplotlib.pyplot as plt 数据准备 species = [‘Finless porpoise’, ‘Sea turtle’, ‘Whale Shark’] categories = [‘Gillnet’, ‘Trawl’, ‘Seine’, ‘Other’] alive_data = [ [37, 33, 10, 11], [143, 152, 35, 17], [2, 10, 3, 1] ] dead_data = [ [19, 13, 0, 3], [1, 4, 1, 0], [0, 3, 0, 2] ] 设置柱状图宽度 bar_width = 0.15 index = np.arange(len(categories)) 创建画布和子图 fig, ax = plt.subplots(figsize=(12, 8)) 定义颜色方案 colors_alive = [‘#F84B35’, ‘#166f0e’, ‘#9C6644’] # 存活数颜色 colors_dead = [‘#B80002’, ‘#60928F’, ‘#B08968’] # 死亡数颜色 绘制分组堆叠柱状图 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’) # 死亡数 ax.bar(index + i * bar_width, dead_data[i], bar_width, bottom=alive_data[i], color=colors_dead[i], label=f’{specie} Dead’,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(‘Counts’, 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_distribution.tiff’, dpi=600, bbox_inches=‘tight’, facecolor=ax.get_facecolor(), edgecolor=‘none’) plt.show() 报道数,和死亡数,分别做两个柱状图,水平排列
时间: 2025-07-28 16:12:49 浏览: 7
<think>我们需要绘制两个柱状图,分别表示存活数和死亡数,并且水平排列。这意味着我们将有两个子图,一个用于存活数据,一个用于死亡数据,它们在同一行上(水平排列)。思路:1.创建两个子图,水平排列(即1行2列)。2.在每个子图上分别绘制三种物种在四种渔具类型下的数据(存活数据和死亡数据分开在两个图中)。3.每个子图都是一个堆叠柱状图吗?不,根据要求,我们分别做两个柱状图,一个展示存活数,一个展示死亡数。但注意,每个图中都有三个物种(Finlessporpoise,Seaturtle,WhaleShark)和四种渔具类型(Gillnet,Trawl,Seine,Other)。因此,每个子图内应该是分组柱状图(每个渔具类型下,三种物种并排显示)。但是,原代码中每个物种的存活和死亡是堆叠在一起的(在同一根柱子上堆叠),现在要求分开两个图,那么每个图只展示一种状态(存活或死亡),但每个图中要展示三个物种在不同渔具类型下的数据。因此,我们调整:图1:存活数,展示三种物种在四种渔具类型下的存活数量(用分组柱状图,即每个渔具类型下有三个柱子,分别代表三个物种)。图2:死亡数,同理。然而,原数据中alive_data和dead_data都是列表的列表,其中每个子列表对应一个物种在四种渔具类型下的数据(存活或死亡)。所以,在第一个图中,我们要绘制的是:对于渔具类型0(Gillnet):三个物种的存活数分别是alive_data[0][0],alive_data[1][0],alive_data[2][0]对于渔具类型1(Trawl):三个物种的存活数分别是alive_data[0][1],alive_data[1][1],alive_data[2][1]以此类推。同样,死亡图类似。因此,我们需要将数据重新组织一下,以便于在两个图中分别绘制。我们可以这样组织:存活图的数据:实际上就是alive_data,但注意alive_data是一个3行4列的矩阵(3物种,4渔具)。但是我们在绘制分组柱状图时,需要的是按渔具类型分组,每组有三个物种的数据。所以我们需要将alive_data转置一下,或者按列来取。另一种方法是:我们不需要转置,因为我们可以直接使用每个渔具类型下三个物种的数据。我们可以用numpy数组来操作。步骤:1.将alive_data和dead_data转换为numpy数组。2.创建1行2列的子图布局。3.设置柱状图的宽度和位置索引。4.分别绘制两个子图。注意:由于每个渔具类型下有三个物种,所以每个渔具类型的位置上要画三个柱子(并排),因此需要设置每个物种的柱子的偏移。具体实现:对于第一个子图(存活数):index=np.arange(len(categories))#4个渔具类型的位置bar_width=0.25#每个物种的柱子宽度,假设三个物种并排,宽度可以设置小一点foriinrange(len(species)):#绘制第i个物种在四个渔具类型上的存活数ax1.bar(index+i*bar_width,[alive_data[i][j]forjinrange(len(categories))],bar_width,label=species[i],color=colors_alive[i],edgecolor='black')同理,第二个子图(死亡数)类似。但是注意,原代码中存活和死亡的颜色是分开的,现在每个图中只展示一种状态,所以我们可以直接使用原来存活数的颜色来表示每个物种(在存活图中),而死亡图中我们可以使用原来死亡数的颜色,或者为了区分物种,我们也可以使用与存活图相同的颜色方案(但这样可能混淆),或者使用不同的颜色方案?这里为了区分物种,建议在存活图和死亡图中,同一种物种使用同一种颜色(但用不同深浅?)。不过原题没有要求,我们可以按照原代码中存活数的颜色作为存活图中各物种的颜色,死亡图中各物种的颜色则使用原死亡数的颜色。但注意:原代码中存活数的颜色有三种,死亡数的颜色也有三种。所以我们在存活图中使用colors_alive,在死亡图中使用colors_dead。另外,由于每个子图都是独立的分组柱状图,所以每个子图都需要自己的图例(或者我们可以将图例放在外面统一表示)。下面我们开始写代码。我们将使用subplots来创建1行2列的两个子图。注意:设置字体、坐标轴等样式。另外,原代码中保存为tiff格式,我们也同样保存。由于原代码中设置了一些全局字体,我们同样设置。步骤:1.导入库2.数据准备3.创建画布和两个子图(水平排列,1行2列)4.设置柱状图宽度和索引5.定义颜色6.在第一个子图上绘制存活数据(分组柱状图)7.在第二个子图上绘制死亡数据(分组柱状图)8.设置每个子图的标题、坐标轴标签、图例等9.调整布局并保存注意:原代码中设置坐标轴宽度、刻度等,我们也同样设置。代码实现如下:</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 = [
[37, 33, 10, 11],
[143, 152, 35, 17],
[2, 10, 3, 1]
]
dead_data = [
[19, 13, 0, 3],
[1, 4, 1, 0],
[0, 3, 0, 2]
]
# 设置柱状图宽度
bar_width = 0.2
index = np.arange(len(categories))
# 创建画布和子图 (1行2列水平排列)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 8), sharey=True)
# 定义颜色方案
colors = ['#1f77b4', '#ff7f0e', '#2ca02c'] # 统一颜色方案
# 绘制存活数据柱状图 (左侧)
for i, specie in enumerate(species):
ax1.bar(index + i * bar_width, alive_data[i], bar_width,
color=colors[i], label=specie, edgecolor='black')
# 绘制死亡数据柱状图 (右侧)
for i, specie in enumerate(species):
ax2.bar(index + i * bar_width, dead_data[i], bar_width,
color=colors[i], label=specie, edgecolor='black')
# 设置字体样式
plt.rcParams['font.sans-serif'] = ['Arial'] # 设置无衬线字体
plt.rcParams['font.size'] = 14
plt.rcParams['font.weight'] = 'bold'
# 增强坐标轴和刻度线
for ax in [ax1, ax2]:
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.grid(axis='y', linestyle='--', alpha=0.7)
# 设置标题和标签
ax1.set_title('Alive Counts', fontsize=16, fontweight='bold', pad=15)
ax2.set_title('Dead Counts', fontsize=16, fontweight='bold', pad=15)
ax1.set_ylabel('Counts', fontsize=14, fontweight='bold')
ax1.set_xticks(index + bar_width)
ax1.set_xticklabels(categories, fontweight='bold', fontsize=12)
ax2.set_xticks(index + bar_width)
ax2.set_xticklabels(categories, fontweight='bold', fontsize=12)
# 添加图例
handles, labels = ax1.get_legend_handles_labels()
fig.legend(handles, labels, loc='upper center',
ncol=3, fontsize=12, frameon=True,
edgecolor='black', facecolor='white',
bbox_to_anchor=(0.5, 0.05))
# 调整布局
plt.tight_layout()
plt.subplots_adjust(bottom=0.15) # 为底部图例留出空间
# 保存图像
plt.savefig('species_distribution_horizontal.tiff',
dpi=600, bbox_inches='tight',
facecolor='white', edgecolor='none')
plt.show()
```
### 代码解释:
1. **子图布局**:
- 使用 `plt.subplots(1, 2)` 创建水平排列的两个子图
- `sharey=True` 确保两个子图共享Y轴刻度
2. **数据分离**:
- 左侧子图 (`ax1`) 只显示存活数据 (`alive_data`)
- 右侧子图 (`ax2`) 只显示死亡数据 (`dead_data`)
3. **颜色方案**:
- 使用统一的颜色方案表示物种 (蓝、橙、绿)
- 同一物种在两个图表中使用相同颜色便于比较
4. **布局优化**:
- 共享Y轴减少重复标签
- 图例放置在图表底部中央位置
- 添加网格线提高可读性
- 调整底部边距为图例留出空间
5. **视觉增强**:
- 添加黑色边框的柱状图
- 加粗坐标轴和刻度线
- 使用无衬线字体提高可读性
- 添加图表标题明确区分存活/死亡数据
### 效果说明:
生成的图表将水平排列两个柱状图:
- 左侧:显示各物种在不同渔具中的存活数量
- 右侧:显示各物种在不同渔具中的死亡数量
- 相同物种在两个图表中使用相同颜色
- Y轴刻度在两个图表中保持一致便于比较
这种布局便于直观比较同一物种在不同渔具中的存活/死亡情况,以及不同渔具对物种生存的影响差异。
阅读全文