[Python] 纯文本查看 复制代码
elif choice == '4':
# 映射 local_type_id 到 local_type_display_name 的字典
local_type_display_name_map = {
2073: '物理类',
2074: '历史类',
1: '理科',
2: '文科'
}
try:
local_type_id = int(local_type_id)
except ValueError:
print(f"Error: local_type_id 的值不正确: {local_type_id}")
local_type_id = None
# 获取 local_type_display_name
if local_type_id is not None:
local_type_display_name = local_type_display_name_map.get(local_type_id, '未知类型')
else:
local_type_display_name = '未知类型'
# 读取 Excel 文件
province_name = get_province_name(local_province_id)
csv_folder = os.path.join("csv", str(province_name))
os.makedirs(csv_folder, exist_ok=True)
filename = f"一分一段表_{local_type_display_name}_{province_name}_{year}.xlsx"
file_path = os.path.join(csv_folder, filename)
sheet_name = '一分一段表'
# 使用 pandas 读取数据
df = pd.read_excel(file_path, sheet_name=sheet_name)
# 提取数据
x = df.iloc[1:, 1].tolist() # 从第二行到最后一行的 B 列数据
y = df.iloc[1:, 2].tolist() # 从第二行到最后一行的 C 列数据
labels = df.iloc[1:, [1, 2, 3, 5, 7, 9]] # 从第二行到最后一行的 B、C、D、F、H、J 列数据
# 设置字体
plt.rcParams['font.sans-serif'] = ['DengXian'] # 使用 DengXian 字体
plt.rcParams['axes.unicode_minus'] = False
# 绘制图表
fig, ax = plt.subplots(figsize=(10, 6))
line, = ax.plot(x, y, color='#FF6F00', marker='o', linestyle='-') # 使用 PANTONE 1505 C 的颜色
# 设置标题和标签
plt_title_name = f"一分一段折线图 {local_type_display_name} {province_name} {year}"
plt.title(plt_title_name, fontsize=14, fontweight='bold')
plt.xlabel('分数', fontsize=12, fontweight='bold')
plt.ylabel('同位次人数', fontsize=12, fontweight='bold')
# 设置 X 轴刻度
x_ticks = [750, 687, 586, 485, 384, 283, 180, 80, 0]
ax.set_xticks(x_ticks)
ax.set_xticklabels(x_ticks)
# 设置 X 轴刻度从大到小显示
ax.invert_xaxis()
# 设置坐标轴范围
ax.set_xlim(750, 0) # X 轴范围从 750 到 0
ax.set_ylim(0, max(y) + 100) # 根据数据自动设置 Y 轴范围
ax.grid(True)
# 添加动态显示功能
cursor = mplcursors.cursor(line, hover=True)
annotations = []
@cursor.connect("add")
def on_add(sel):
index = sel.index
text = '\n'.join(f"{col}: {val}" for col, val in zip(labels.columns, labels.iloc[int(index)]))
annotation = sel.annotation
annotation.set(text=text, fontsize=10, color='white', fontweight='bold', bbox=dict(facecolor='#333333', alpha=0.8, edgecolor='none'))
annotation.set_visible(True)
annotations.append(annotation) # 保存注释对象以便后续操作
@cursor.connect("remove")
def on_remove(sel):
annotation = sel.annotation
annotation.set(text='', bbox=dict(facecolor='none', edgecolor='none'))
annotation.set_visible(False)
def on_click(event):
# 如果点击区域不在折线图上,则隐藏所有注释
if not (event.inaxes == ax and event.inaxes.get_lines() and event.inaxes.contains(event)[0]):
for annotation in annotations:
annotation.set_visible(False)
fig.canvas.draw()
# 绑定点击事件
fig.canvas.mpl_connect('button_press_event', on_click)
# 设置图形窗口标题
fig.canvas.manager.set_window_title(plt_title_name)
# 显示图表
plt.show()
os.system('cls' if os.name == 'nt' else 'clear')
break