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()
aW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZAoKIyAxLiDlh4blpIfmlbDmja4KIyDlkoxQUFTkuIDmoLfnmoTnu5PmnoTvvJrooYzmmK/ogIPngrnvvIzliJfmmK/lubTku70KZGF0YSA9IHsKICAgICfogIPngrknOiBbJ+aWsOmZiOS7o+iwoicsICfpgZfkvKDkuI7lj5jlvIInLCAn56iz5oCB5LiO6LCD6IqCJywgJ+WfuuWboOW3peeoi+S4jueUn+eJqeaKgOacr+WuieWFqCcsICflhbbkvZnnu7zlkIjogIPngrknXSwKICAgICcyMDIz5bm0JzogWzI1LCAyMSwgMTYsIDksIDI5XSwKICAgICcyMDI05bm0JzogWzI2LCAyMiwgMTUsIDEwLCAyN10sCiAgICAnMjAyNeW5tCc6IFsyNiwgMjMsIDE2LCAxMSwgMjRdCn0KZGYgPSBwZC5EYXRhRnJhbWUoZGF0YSkKCiMgMi4g6K6+572u5Zu+6KGo6aOO5qC85ZKM6YWN6ImyCnBsdC5maWd1cmUoZmlnc2l6ZT0oMTIsIDYpKSAgIyDlrr3lsY/mr5TkvovvvIzpgILlkIjmqKrlkJHlsZXnpLoKY29sb3JzID0gWycjNGU3OWE3JywgJyNmMjhlMmInLCAnI2UxNTc1OSddICAjIOiTneOAgeapmeOAgee6ou+8jOWvueavlOaYjuaYvgoKIyAzLiDorr7nva7msLTlubPliIbnu4TmnaHlvaLlm74KeSA9IG5wLmFyYW5nZShsZW4oZGZbJ+iAg+eCuSddKSkgICMg56Gu5a6aeei9tOS9jee9rgpoZWlnaHQgPSAwLjI1ICAjIOafseWtkOeahOmrmOW6pu+8iOWOmuW6pu+8iQoKIyA0LiDnlLvlh7rkuInkuKrlubTku73nmoTmnaHlvaLvvIjnlKjlgY/np7vph4/miorlroPku6zlubbmjpLmlL7lnKjkuIDotbfvvIkKIyAyMDIz5bm077ya5b6A5bem5YGP56e75LiA5Liq5L2N572uCnBsdC5iYXJoKHkgLSBoZWlnaHQsIGRmWycyMDIz5bm0J10sIGhlaWdodD1oZWlnaHQsIGxhYmVsPScyMDIz5bm0JywgY29sb3I9Y29sb3JzWzBdKQojIDIwMjTlubTvvJrlsYXkuK0KcGx0LmJhcmgoeSwgZGZbJzIwMjTlubQnXSwgaGVpZ2h0PWhlaWdodCwgbGFiZWw9JzIwMjTlubQnLCBjb2xvcj1jb2xvcnNbMV0pCiMgMjAyNeW5tO+8muW+gOWPs+WBj+enu+S4gOS4quS9jee9rgpwbHQuYmFyaCh5ICsgaGVpZ2h0LCBkZlsnMjAyNeW5tCddLCBoZWlnaHQ9aGVpZ2h0LCBsYWJlbD0nMjAyNeW5tCcsIGNvbG9yPWNvbG9yc1syXSkKCiMgNS4g5re75Yqg5pWw5YC85qCH562+CmZvciBpLCB2IGluIGVudW1lcmF0ZShkZlsnMjAyM+W5tCddKToKICAgIHBsdC50ZXh0KHYgKyAwLjUsIGkgLSBoZWlnaHQsIGYne3Z9JScsIGhhPSdsZWZ0JywgdmE9J2NlbnRlcicsIGZvbnRzaXplPTkpCmZvciBpLCB2IGluIGVudW1lcmF0ZShkZlsnMjAyNOW5tCddKToKICAgIHBsdC50ZXh0KHYgKyAwLjUsIGksIGYne3Z9JScsIGhhPSdsZWZ0JywgdmE9J2NlbnRlcicsIGZvbnRzaXplPTkpCmZvciBpLCB2IGluIGVudW1lcmF0ZShkZlsnMjAyNeW5tCddKToKICAgIHBsdC50ZXh0KHYgKyAwLjUsIGkgKyBoZWlnaHQsIGYne3Z9JScsIGhhPSdsZWZ0JywgdmE9J2NlbnRlcicsIGZvbnRzaXplPTkpCgojIDYuIOWbvuihqOijhemlsO+8iOagh+mimOOAgeagh+etvuOAgeWbvuS+i+etie+8iQpwbHQueGxhYmVsKCfljaDmr5QgKCUpJywgZm9udHNpemU9MTIpCnBsdC50aXRsZSgnMjAyMy0yMDI15bm0IOmrmOiAg+eUn+eJqeaguOW/g+iAg+eCueWIhuWAvOWNoOavlOi2i+WKvycsIGZvbnRzaXplPTE0LCBwYWQ9MTUpCnBsdC55dGlja3MoeSwgZGZbJ+iAg+eCuSddLCBmb250c2l6ZT0xMSkgICMg5pu/5o2i5Li65Lit5paH6ICD54K55ZCN56ewCnBsdC5sZWdlbmQodGl0bGU9J+W5tOS7vScsIGxvYz0nbG93ZXIgcmlnaHQnLCBmb250c2l6ZT0xMCkKcGx0LmdyaWQoYXhpcz0neCcsIGxpbmVzdHlsZT0nLS0nLCBhbHBoYT0wLjMpICAjIOaYvuekuuerlue6v+e9keagvO+8jOaWueS+v+mYheivuwpwbHQueGxpbSgwLCAzNSkgICMg6aKE55WZ5LiA6YOo5YiG56m66Ze057uZ5qCH562+CgojIDcuIOaYvuekui/kv53lrZgKcGx0LnRpZ2h0X2xheW91dCgpCnBsdC5zaG93KCk=