python为什么生成的多关键词的折线图y没有显示对应的精准刻度呢?
想实现:所有关键词对应的数值 取最大值来确定y的最大值,然后将y从0到最大值进行数值标注,让关键词对应的折线图都显示在对应区域……
import matplotlib.pyplot as plt
from collections import defaultdict
from matplotlib.font_manager import FontProperties as FP
import re
from docx import Document
from docx.shared import Inches
import pandas as pd
import matplotlib.ticker as ticker
# 确保已安装 SimHei 字体,并替换下面的路径为实际字体文件路径
noto_font = FP(fname="path/to/simhei.ttf") # 更改为 SimHei 字体的实际路径
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用 SimHei 字体
keywords = ["年份", "留置", "结案", "审结", "办结率", "生活记录", "组织记录", "政治纪律"]
text = "2019年,留置1.5人,结案15件,审结20件,办结率50%,政治纪律12件,生活记录13件,组织记录14件,其他信息。2020年,留置2.5人,结案25件,审结30件,办结率70.23%,政治纪律22件,生活记录23件,组织记录24件,其他信息。2021年,留置2.5人,结案25件,审结40件,办结率65.37%,政治纪律22件,生活记录23件,组织记录24件,其他信息。2022年,留置2.5人,结案25件,审结50件,办结率70%,政治纪律22件,生活记录23件,组织记录24件,其他信息。2023年,留置12人,结案35件,审结62件,办结率90%,政治纪律32件,生活记录43件,组织记录54件,其他信息。"
pattern = r"(\d{4})年,留置([\d.]+)人,结案([\d.]+)件,审结([\d.]+)件,办结率([\d.]+)%,政治纪律([\d.]+)件,生活记录([\d.]+)件,组织记录([\d.]+)件"
matches = re.findall(pattern, text)
data_list = []
for match in matches:
year = int(match[0])
data = {
'年份': year,
'留置': float(match[1]),
'结案': int(match[2]),
'审结': int(match[3]),
'办结率': float(match[4]) / 100, # 直接除以100转换为小数
'政治纪律': int(match[5]),
'生活记录': int(match[6]),
'组织记录': int(match[7])
}
data_list.append(data)
df = pd.DataFrame(data_list)
# 修改这一行:判断办结率为整数百分比时只显示整数部分,否则显示两位小数的百分比
df['办结率'] = df['办结率'].apply(lambda x: f"{int(x * 100)}%" if round(x * 100) == x * 100 else f"{x * 100:.2f}%")
# 其他列,如果是整数则显示整数,否则显示原有数值
for col in df.columns:
if col != '办结率':
df[col] = df[col].apply(lambda x: int(x) if int(x) == x else str(x))
# 将数据帧输出为 Word 文档中的表格
doc = Document()
table = doc.add_table(rows=1, cols=len(keywords))
header_row = table.rows[0]
for i, keyword in enumerate(keywords):
header_row.cells[i].text = keyword
for i, row in df.iterrows():
data_row = table.add_row()
for j, value in enumerate(row):
data_row.cells[j].text = str(value) # 确保将值转换为字符串
# 保存 Word 文档
doc.save('output1202表格图整数小数多值折线图.docx')
# 创建一个画布并设置子图数量为1(即一张图)
fig, ax = plt.subplots()
for keyword in keywords[1:]: # 跳过第一个“年份”关键词
if keyword != "办结率": # 去掉办结率
values_for_keyword = df[keyword].values.tolist() # 获取对应关键词的所有年份数据
years = df['年份'].astype(int).values.tolist()
ax.plot(years, values_for_keyword, marker='o', linestyle='-', label=keyword)
ax.set_xlabel('年份')
ax.set_ylabel('数量') # 根据实际情况调整y轴标签
ax.set_title('按年份的关键指标变化情况')
# 设置X轴刻度为整数
ax.xaxis.set_major_locator(ticker.MultipleLocator(1)) # 设置主刻度间隔为1年
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%d')) # 设置刻度标签为整数形式
# 添加图例
ax.legend(title="关键词")
# 将图表保存为图片
fig.savefig('multi_line_chart.png', dpi=300)
# 将图片插入到Word文档中
image = doc.add_picture('multi_line_chart.png', width=Inches(6))
# 最后保存Word文档
doc.save('output1202表格图整数小数多值折线图.docx')
当前代码运行效果