读取csv里面的文件数据画曲线
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import os
import matplotlib as mpl
# 可修改的配置参数
i = 6 # 文件索引,可以根据需求进行修改
# /home/featurize/work/1/邮件/实验图/1.csv
csv_file_path = r"/home/featurize/work/1/邮件/实验图/Fig/{}.csv".format(i) # CSV 文件路径,i 将会被替换
save_path_combined = r"/home/featurize/work/1/邮件/实验图/Fig/{}_1_acc_loss.svg".format(i) # 合并后的图像保存路径,文件名中的 2 会被 i 替换
save_dir = os.path.dirname(save_path_combined) # 获取保存文件的文件夹路径
if not os.path.exists(save_dir):
os.makedirs(save_dir) # 创建文件夹
# 图形大小、分辨率等
figure_size = (10, 12) # 图形大小,调整为适合上下排列的大小
dpi = 300 # 图像保存时的分辨率
alpha = 0.5 # 曲线透明度
line_style = '-' # 曲线样式
line_width = 2 # 曲线宽度
# 数据关键字(可修改)
loss_keyword = 'loss' # loss 数据的关键字
acc_keyword = 'acc' # acc 数据的关键字
# 读取 CSV 文件,不指定列名
data = pd.read_csv(csv_file_path, header=None)
# 自动检测 CSV 文件中是否存在 loss 或 acc 关键字
loss_found = False
acc_found = False
loss_col_idx, acc_col_idx = None, None
# 遍历所有列,找出包含 loss 或 acc 数据的列
for col_idx in range(data.shape[1]):
if data[col_idx].astype(str).str.contains(loss_keyword, case=False, na=False).any():
loss_found = True
loss_col_idx = col_idx
if data[col_idx].astype(str).str.contains(acc_keyword, case=False, na=False).any():
acc_found = True
acc_col_idx = col_idx
# 选择并生成单独的图像的函数
def plot_data(config, data1_x_col, data1_y_col, data2_x_col, data2_y_col, interval=1):
# 读取 CSV 文件,提取数据列
data = pd.read_csv(csv_file_path, header=None)
data1_x = data[data1_x_col].values # 第一组数据的 x 值
data1_y = data[data1_y_col].values # 第一组数据的 y 值
data2_x = data[data2_x_col].values # 第二组数据的 x 值
data2_y = data[data2_y_col].values # 第二组数据的 y 值
# 确保 X 值的最小值和最大值,生成均匀间隔的 X 值
x_min = min(min(data1_x), min(data2_x))
x_max = max(max(data1_x), max(data2_x))
# 使用 interval (间隔大小) 来生成均匀的 X 值
x_range = np.arange(x_min, x_max, interval) # 使用 np.arange 来确保均匀间隔的点
# 插值计算均匀 x 值对应的 y 值
data1_y_interp = np.interp(x_range, data1_x, data1_y)
data2_y_interp = np.interp(x_range, data2_x, data2_y)
# 绘制数据曲线
plt.plot(x_range, data1_y_interp, color=config["color_data1"], marker='o', linestyle=line_style,
alpha=alpha, label=config["label_data1"], linewidth=line_width)
plt.plot(x_range, data2_y_interp, color=config["color_data2"], marker='o', linestyle=line_style,
alpha=alpha, label=config["label_data2"], linewidth=line_width)
# 设置图表标题和标签
plt.xlabel(config["xlabel"])
plt.ylabel(config["ylabel"])
# 设置横坐标为整数格式(如果需要)
if config["x_ticks_integer"]:
plt.gca().xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{int(x)}'))
# 显示图例
if config["legend"]:
plt.legend()
# 显示网格
if config["grid"]:
plt.grid(True)
# 配置 loss 图像
config_loss = {
"xlabel": 'Epochs', # X轴标签
"ylabel": 'Loss', # Y轴标签
"x_ticks_integer": True, # 是否将横坐标显示为整数
"legend": True, # 是否显示图例
"grid": True, # 是否显示网格
# "color_data1": 'red', # 第一组数据曲线颜色
# "color_data2": 'blue', # 第二组数据曲线颜色
# "label_data1": 'Loss function curve using BiLSTM+BiGRU+DCNN+Word normalization', # 第一组数据标签
# "label_data2": 'Loss function curve using BiLSTM+BiGRU+DCNN' , # 第二组数据标签
#1. BiLSTM+BiGRU+DCNN+Word normalization (BBDWN)
#1. BiLSTM+BiGRU+DCNN (BBD)
#"label_data1": 'Loss function curve using BBD+WN', # 第一组数据标签
#"label_data2": 'Loss function curve using BBD' # 第二组数据标签
#BiLSTM+BiGRU+DCNN+Word normalization + Weightted word normalization (BBDWNWWN)
#BiLSTM+BiGRU+DCNN+Weightted word normalization (BBDWWN)
#
#第三张图片
# "color_data1": 'red', # 第一组数据曲线颜色
# "color_data2": 'blue', # 第二组数据曲线颜色
# "label_data2": 'Loss function curve using BBD', # 第一组数据标签
# "label_data1": 'Loss function curve using BBD+WN' # 第二组数据标签
#第四张图片
# "color_data1": 'red', # 第一组数据曲线颜色
# "color_data2": 'blue', # 第二组数据曲线颜色
# "label_data2": 'Loss function curve using BBD+WWN', # 第一组数据标签
# "label_data1": 'Loss function curve using BBD+ESE+WWN' # 第二组数据标签
#第五张图片
# "color_data2": 'red', # 第一组数据曲线颜色
# "color_data1": 'blue', # 第二组数据曲线颜色
# "label_data1": 'Loss function curve using BBD+ESE', # 第一组数据标签
# "label_data2": 'Loss function curve using BBD+ESE+WN' # 第二组数据标签
#第六张图片
"color_data2": 'red', # 第一组数据曲线颜色
"color_data1": 'blue', # 第二组数据曲线颜色
"label_data1": 'Loss function curve using BBD+WN', # 第一组数据标签
"label_data2": 'Loss function curve using BBD+WN+WWN' # 第二组数据标签
# "label_data1": 'Loss function curve using BiLSTM+BiGRU+DCNN+Emotion sequence encoding', # 第一组数据标签
# "label_data2": 'Loss function curve using BiLSTM+BiGRU+DCNN+Emotion sequence encoding+Word normalization' # 第二组数据标签
# "label_data2": 'Loss function curve using BiLSTM+DCNN', # 第一组数据标签
# "label_data1": 'Loss function curve using BiLSTM' # 第二组数据标签
# "label_data2": 'Loss function curve using BiLSTM+BiGRU+DCNN', # 第一组数据标签
# "label_data1": 'Loss function curve using BiLSTM+BiGRU+DCNN+Word normalization' # 第二组数据标签
# "label_data2": 'Loss function curve using BiLSTM+BiGRU+DCNN + Weightted word normalization', # 第一组数据标签
# "label_data1": 'Loss function curve using BiLSTM+BiGRU+DCNN+Word normalization+Weightted word normalization' # 第二组数据标签
}
# 配置 acc 图像
config_acc = {
"xlabel": 'Epochs', # X轴标签
"ylabel": 'Acc', # Y轴标签
"x_ticks_integer": True, # 是否将横坐标显示为整数
"legend": True, # 是否显示图例
"grid": True, # 是否显示网格
# "color_data1": 'blue', # 第一组数据曲线颜色
# "color_data2": 'red', # 第二组数据曲线颜色
# "color_data1": 'blue', # 第一组数据曲线颜色
# "color_data2": 'red', # 第二组数据曲线颜色
#第三张图片
# "color_data2": 'red', # 第一组数据曲线颜色
# "color_data1": 'blue', # 第二组数据曲线颜色
# "label_data1": 'Accuracy curve using BBD', # 第一组数据标签
# "label_data2": 'Accuracy curve using BBD+WN' # 第二组数据标签
# #第四张图片
# "color_data2": 'red', # 第一组数据曲线颜色
# "color_data1": 'blue', # 第二组数据曲线颜色
# "label_data1": 'Accuracy curve using BBD+WWN', # 第一组数据标签
# "label_data2": 'Accuracy curve using BBD+ESE+WWN' # 第二组数据标签
#第五张图片
# "color_data2": 'red', # 第一组数据曲线颜色
# "color_data1": 'blue', # 第二组数据曲线颜色
# "label_data1": 'Accuracy curve using BBD+ESE', # 第一组数据标签
# "label_data2": 'Accuracy curve using BBD+ESE+WN' # 第二组数据标签
#第六张图片
"color_data1": 'red', # 第一组数据曲线颜色
"color_data2": 'blue', # 第二组数据曲线颜色
"label_data2": 'Accuracy curve using BBD+WN', # 第一组数据标签
"label_data1": 'Accuracy curve using BBD+WN+WWN' # 第二组数据标签
# "label_data1": 'Loss function curve using BBBDWNWWN', # 第一组数据标签
# "label_data2": 'Loss function curve using BBBDWWN' # 第二组数据标签
# "label_data1": 'Accuracy curve using BiLSTM+BiGRU+DCNN+Word normalization', # 第一组数据标签
# "label_data2": 'Accuracy curve using BiLSTM+BiGRU+DCNN+Emotion sequence encoding+Word normalization' # 第二组数据标签
# "label_data1": 'Loss function curve using BiLSTM+BiGRU+DCNN+Emotion sequence encoding', # 第一组数据标签
# "label_data2": 'Loss function curve using BiLSTM+BiGRU+DCNN+Emotion sequence encoding+Weightted word normalization' # 第二组数据标签
# "label_data1": 'Loss function curve using BiLSTM+BiGRU+DCNN+Emotion sequence encoding', # 第一组数据标签
# "label_data2": 'Loss function curve using BiLSTM+BiGRU+DCNN+Emotion sequence encoding+Word normalization' # 第二组数据标签
# "label_data2": 'Loss function curve using BiLSTM+DCNN', # 第一组数据标签
# "label_data1": 'Loss function curve using BiLSTM' # 第二组数据标签
# "label_data1": 'Loss function curve using BiLSTM+BiGRU+DCNN', # 第一组数据标签
# "label_data2": 'Loss function curve using BiLSTM+BiGRU+DCNN+Word normalization' # 第二组数据标签
# "label_data1": 'Loss function curve using BiLSTM+BiGRU+DCNN + Weightted word normalization', # 第一组数据标签
# "label_data2": 'Loss function curve using BiLSTM+BiGRU+DCNN+Word normalization+Weightted word normalization' # 第二组数据标签
}
# 创建一个包含两个子图的图形,按顺序上下排列
# 设置全局字体为罗曼字体 (Times New Roman),并设置字体大小为 12pt
#mpl.rcParams['font.family'] = 'serif'
#mpl.rcParams['font.serif'] = ['Times New Roman'] # 或者可以替换为其他罗曼字体
mpl.rcParams['font.size'] = 20 # 设置字体大小为 12pt
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=figure_size, dpi=dpi)
# fig.patch.set_facecolor('white')
# ax1.set_facecolor('white')
# ax2.set_facecolor('white')
# 绘制 loss 图像到第一个子图
plt.sca(ax1)
if loss_found:
plot_data(config_loss, loss_col_idx + 1, loss_col_idx + 2, loss_col_idx + 3, loss_col_idx + 4, interval=0.5)
# 绘制 acc 图像到第二个子图
plt.sca(ax2)
if acc_found:
plot_data(config_acc, acc_col_idx + 1, acc_col_idx + 2, acc_col_idx + 3, acc_col_idx + 4, interval=0.5)
# fig.patch.set_facecolor('white') # 设置图形的背景颜色为白色
# 调整布局,避免标签重叠
plt.tight_layout()
# plt.savefig('H:\邮件\实验图\confusion_matrices_hd.svg', format='svg', dpi=300)
# plt.savefig(save_path_combined, format='svg', dpi=dpi, bbox_inches='tight', pad_inches=0.1)
# fig.patch.set_facecolor('white') # 设置图形的背景颜色为白色
# ax1.patch.set_facecolor('white') # 设置第一个子图的背景颜色
# ax2.patch.set_facecolor('white') # 设置第二个子图的背景颜色
plt.savefig(save_path_combined, format='svg', dpi=dpi, bbox_inches='tight', pad_inches=0.1)
# 展示合并后的图像
plt.show()