IT小春子 2024-03-18 17:50 采纳率: 72.7%
浏览 5
已结题

python为什么生成的多关键词的折线图y没有显示对应的精准刻度呢?

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')

当前代码运行效果

img

  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-03-22 08:26
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    问题分析:

    1. 目前的代码中,y轴的刻度是根据数据动态确定的,但是没有对刻度进行精确的设置,导致刻度可能不够清晰。
    2. 需要将y轴的范围设置为所有关键词对应数值的最大值,以保证所有关键词的折线图都能够完整显示在图表中。
      解决方案:
    3. 首先,计算出所有关键词对应数值的最大值,作为y轴的上限。
    4. 设置y轴的刻度范围为从0到最大值,并保证刻度清晰可读。
    5. 对于y轴的标签,可以根据实际情况进行适当调整,以确保清晰度。
      具体实现如下所示:
      pythonCopy code
      # 计算所有关键词对应数值的最大值
      max_value = df.iloc[:, 1:].max().max()  # 从第二列开始考虑所有数值列
      # 创建一个画布并设置子图数量为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轴范围设置为从0到最大值
      ax.set_ylim(0, max_value)
      # 设置X轴刻度为整数
      ax.xaxis.set_major_locator(ticker.MultipleLocator(1))
      ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%d'))
      # 添加图例
      ax.legend(title="关键词")
      # 设置标题
      ax.set_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')
      
      在上述代码中,我们首先计算了所有关键词对应数值的最大值,并将y轴的范围设置为从0到最大值。然后根据实际情况调整了y轴的刻度,确保刻度清晰可读。最后保存了调整后的Word文档。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月16日
  • 已采纳回答 5月8日
  • 创建了问题 3月18日

悬赏问题

  • ¥15 需要写计算过程,求解答
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 C++行情软件的tick数据如何高效的合成K线
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。
  • ¥20 在easyX库下编写C语言扑克游戏跑的快,能实现简单的人机对战