import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# 1. 准备数据
# 和PPT一样的结构：行是考点，列是年份
data = {
    '考点': ['新陈代谢', '遗传与变异', '稳态与调节', '基因工程与生物技术安全', '其余综合考点'],
    '2023年': [25, 21, 16, 9, 29],
    '2024年': [26, 22, 15, 10, 27],
    '2025年': [26, 23, 16, 11, 24]
}
df = pd.DataFrame(data)

# 2. 设置图表风格和配色
plt.figure(figsize=(12, 6))  # 宽屏比例，适合横向展示
colors = ['#4e79a7', '#f28e2b', '#e15759']  # 蓝、橙、红，对比明显

# 3. 设置水平分组条形图
y = np.arange(len(df['考点']))  # 确定y轴位置
height = 0.25  # 柱子的高度（厚度）

# 4. 画出三个年份的条形（用偏移量把它们并排放在一起）
# 2023年：往左偏移一个位置
plt.barh(y - height, df['2023年'], height=height, label='2023年', color=colors[0])
# 2024年：居中
plt.barh(y, df['2024年'], height=height, label='2024年', color=colors[1])
# 2025年：往右偏移一个位置
plt.barh(y + height, df['2025年'], height=height, label='2025年', color=colors[2])

# 5. 添加数值标签
for i, v in enumerate(df['2023年']):
    plt.text(v + 0.5, i - height, f'{v}%', ha='left', va='center', fontsize=9)
for i, v in enumerate(df['2024年']):
    plt.text(v + 0.5, i, f'{v}%', ha='left', va='center', fontsize=9)
for i, v in enumerate(df['2025年']):
    plt.text(v + 0.5, i + height, f'{v}%', ha='left', va='center', fontsize=9)

# 6. 图表装饰（标题、标签、图例等）
plt.xlabel('占比 (%)', fontsize=12)
plt.title('2023-2025年 高考生物核心考点分值占比趋势', fontsize=14, pad=15)
plt.yticks(y, df['考点'], fontsize=11)  # 替换为中文考点名称
plt.legend(title='年份', loc='lower right', fontsize=10)
plt.grid(axis='x', linestyle='--', alpha=0.3)  # 显示竖线网格，方便阅读
plt.xlim(0, 35)  # 预留一部分空间给标签

# 7. 显示/保存
plt.tight_layout()
plt.show()