#将字体放到某个路径下,下载的字体simsun支持中文
font = FontProperties(fname=“/usr/share/fonts/chinese/simsun.ttc”,size=15)
我的字体文件在
“D:\中文字体TTF源文件\中文字体TTF源文件\simhei.ttf”
帮我解决乱码问题
import os
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import logging
import argparse
import glob
from datetime import datetime
from matplotlib.font_manager import FontProperties# 配置日志记录
logging.basicConfig(filename='plot_error_log.txt', level=logging.ERROR,format='%(asctime)s:%(levelname)s:%(message)s')def load_proportion_data(file_path):"""加载统计结果的 Excel 文件。参数:- file_path (str): Excel 文件的路径。返回:- DataFrame: 包含统计比例的数据。"""try:proportion_df = pd.read_excel(file_path, index_col=0)print(f"成功加载统计结果文件:{file_path}")return proportion_dfexcept FileNotFoundError:logging.error(f"文件未找到:{file_path}")print(f"错误:文件未找到 - {file_path}")except Exception as e:logging.error(f"读取文件 {file_path} 时出错:{e}")print(f"错误:读取文件时出错 - {e}")return Nonedef plot_proportion(proportion_df, font_path, output_path=None):"""绘制堆积柱状图,展示各活动类型下教学倾向的比例分布。参数:- proportion_df (DataFrame): 包含统计比例的数据,行索引为活动类型,列为教学倾向类别。- font_path (str): 字体文件的路径,用于支持中文显示。- output_path (str, 可选): 图表保存路径。如果提供,将保存图表而不显示。"""try:# 检查字体文件是否存在if not os.path.exists(font_path):logging.error(f"字体文件未找到:{font_path}")print(f"错误:字体文件未找到 - {font_path}")return# 设置中文字体font_prop = FontProperties(fname=font_path)# 设置绘图风格sns.set(style="whitegrid")# 绘制堆积柱状图ax = proportion_df.plot(kind='bar', stacked=True, figsize=(16, 12), colormap='tab20')# 设置轴标签和标题,应用中文字体plt.xlabel('活动类型', fontproperties=font_prop, fontsize=24)plt.ylabel('教学倾向比例', fontproperties=font_prop, fontsize=24)plt.title('各活动类型下教学倾向的比例分布', fontproperties=font_prop, fontsize=30)# 设置图例,应用中文字体plt.legend(title='教学倾向', title_fontsize=18, fontsize=16, prop=font_prop, bbox_to_anchor=(1.05, 1), loc='upper left')# 调整刻度标签字体大小,应用中文字体plt.xticks(fontsize=18, fontproperties=font_prop)plt.yticks(fontsize=18, fontproperties=font_prop)# 添加数据标签(可选)# 注意:`ax.bar_label` 需要 Matplotlib 3.4.0 及以上版本try:for container in ax.containers:ax.bar_label(container, fmt='%.2f', label_type='center', fontsize=10, fontproperties=font_prop)except AttributeError:logging.warning("Matplotlib 版本过低,无法使用 'ax.bar_label' 添加数据标签。")print("警告:Matplotlib 版本过低,无法添加数据标签。")plt.tight_layout()if output_path:plt.savefig(output_path, bbox_inches='tight')print(f"图表已保存为:{output_path}")else:plt.show()except Exception as e:logging.error(f"绘制图表时出错:{e}")print(f"错误:绘制图表时出错 - {e}")def get_latest_temp_file(folder_path):"""获取指定文件夹中最新的以 'temp' 开头的 Excel 文件。参数:- folder_path (str): 文件夹路径。返回:- str or None: 最新文件的路径,如果未找到则返回 None。"""temp_files = glob.glob(os.path.join(folder_path, 'temp*.xlsx'))if not temp_files:# 如果没有以 'temp' 开头的文件,尝试寻找特定文件名temp_files = glob.glob(os.path.join(folder_path, 'temp_proportion.xlsx'))if not temp_files:return Nonelatest_file = max(temp_files, key=os.path.getmtime)return latest_filedef parse_arguments():parser = argparse.ArgumentParser(description="读取统计结果并绘制图表。")parser.add_argument('--input', type=str, default=None, help="输入的 Excel 文件路径。")parser.add_argument('--output', type=str, default=None, help="输出的图表文件路径。")parser.add_argument('--auto', action='store_true', help="自动选择最新的 temp 文件。")return parser.parse_args()def main():args = parse_arguments()if args.auto:# 使用自动选择最新的 temp 文件folder_path = r'D:\BaiduSyncdisk\硕士毕业相关\毕业论文数据\test'temp_excel_path = get_latest_temp_file(folder_path)if temp_excel_path is None:print(f"错误:没有找到任何以 'temp' 开头的 Excel 文件。")returnprint(f"使用最新的统计结果文件:{temp_excel_path}")else:# 使用指定的输入文件if args.input:temp_excel_path = args.inputelse:# 如果未指定输入文件且未使用自动模式,提示用户print("错误:未指定输入文件路径。请使用 --input 参数或启用 --auto 模式。")return# 设置字体文件路径font_path = r'D:\中文字体TTF源文件\中文字体TTF源文件\simhei.ttf'# 检查字体文件是否存在if not os.path.exists(font_path):logging.error(f"字体文件未找到:{font_path}")print(f"错误:字体文件未找到 - {font_path}")return# 检查统计结果文件是否存在if not os.path.exists(temp_excel_path):print(f"错误:统计结果文件不存在 - {temp_excel_path}")return# 加载统计结果proportion_df = load_proportion_data(temp_excel_path)if proportion_df is not None:# 绘制图表plot_proportion(proportion_df, font_path, output_path=args.output)if __name__ == "__main__":main()