174 lines
5.9 KiB
Python
174 lines
5.9 KiB
Python
import os
|
||
import pandas as pd
|
||
import matplotlib.pyplot as plt
|
||
from mpl_toolkits.mplot3d import Axes3D
|
||
import numpy as np
|
||
|
||
def save_to_xlsx(project_name, file_name, data):
|
||
folder_path = f'Result/{project_name}'
|
||
os.makedirs(folder_path, exist_ok=True)
|
||
data.to_excel(f'{folder_path}/{file_name}.xlsx', index=True)
|
||
print("Save successed to " + f'{folder_path}/{file_name}.xlsx')
|
||
save_to_pic(project_name=project_name, file_name=file_name)
|
||
return
|
||
|
||
def save_to_pic(project_name, file_name):
|
||
os.makedirs(f'Result/{project_name}', exist_ok=True)
|
||
if file_name == 'pca_2d':
|
||
draw_pca_2d(f'Result/{project_name}/{file_name}.xlsx')
|
||
print("Save successed to " + f'Result/{project_name}/{file_name}.png')
|
||
elif file_name == 'pca_3d':
|
||
draw_pca_3d(f'Result/{project_name}/{file_name}.xlsx')
|
||
print("Save successed to " + f'Result/{project_name}/{file_name}.png')
|
||
elif file_name == 'acc_and_loss':
|
||
draw_epoch_data(f'Result/{project_name}/{file_name}.xlsx')
|
||
draw_last_epoch_bar_chart(f'Result/{project_name}/{file_name}.xlsx')
|
||
print("Save successed to line graph and bar graph")
|
||
elif file_name == 'cm':
|
||
draw_and_save_cm(f'Result/{project_name}/{file_name}.xlsx')
|
||
print("Save successed cm")
|
||
elif file_name == 'cmn':
|
||
draw_and_save_cm(f'Result/{project_name}/{file_name}.xlsx')
|
||
print("Save successed cmn")
|
||
else:
|
||
print("unknow picture type")
|
||
|
||
|
||
def draw_pca_2d(file_path):
|
||
df = pd.read_excel(file_path)
|
||
plt.figure(figsize=(8, 6))
|
||
plt.scatter(df['PC1'], df['PC2'], c=df['labels'], cmap='viridis', edgecolor='k', alpha=0.6)
|
||
plt.xlabel('PC1')
|
||
plt.ylabel('PC2')
|
||
plt.title('2D PCA')
|
||
plt.colorbar(label='Labels')
|
||
plt.savefig(file_path.replace('.xlsx', '.png'))
|
||
plt.close()
|
||
|
||
def draw_pca_3d(file_path):
|
||
df = pd.read_excel(file_path)
|
||
fig = plt.figure(figsize=(8, 6))
|
||
ax = fig.add_subplot(111, projection='3d')
|
||
scatter = ax.scatter(df['PC1'], df['PC2'], df['PC3'], c=df['labels'], cmap='viridis', edgecolor='k', alpha=0.6)
|
||
ax.set_xlabel('PC1')
|
||
ax.set_ylabel('PC2')
|
||
ax.set_zlabel('PC3')
|
||
ax.set_title('3D PCA')
|
||
fig.colorbar(scatter, ax=ax, label='Labels')
|
||
plt.savefig(file_path.replace('.xlsx', '.png'))
|
||
|
||
def draw_epoch_data(file_path):
|
||
df = pd.read_excel(file_path)
|
||
epochs = df['epoch']
|
||
train_loss = df['train_loss']
|
||
train_accuracy = df['train_accuracy'] * 100
|
||
test_accuracy = df['test_accuracy'] * 100
|
||
f1_score = df['f1_score']
|
||
precision = df['precision']
|
||
recall = df['recall']
|
||
|
||
fig, axs = plt.subplots(2, 3, figsize=(18, 12))
|
||
|
||
# 折线图:训练损失
|
||
axs[0, 0].plot(epochs, train_loss, 'b-', label='Train Loss')
|
||
axs[0, 0].set_xlabel('Epoch')
|
||
axs[0, 0].set_ylabel('Loss')
|
||
axs[0, 0].set_title('Training Loss over Epochs')
|
||
axs[0, 0].legend()
|
||
|
||
# 折线图:训练准确率和测试准确率
|
||
axs[0, 1].plot(epochs, train_accuracy, 'g-', label='Train Accuracy')
|
||
axs[0, 1].plot(epochs, test_accuracy, 'r-', label='Test Accuracy')
|
||
axs[0, 1].set_xlabel('Epoch')
|
||
axs[0, 1].set_ylabel('Accuracy (%)')
|
||
axs[0, 1].set_title('Train and Test Accuracy over Epochs')
|
||
axs[0, 1].legend()
|
||
|
||
# 折线图:F1 Score
|
||
axs[0, 2].plot(epochs, f1_score, 'm-', label='F1 Score')
|
||
axs[0, 2].set_xlabel('Epoch')
|
||
axs[0, 2].set_ylabel('F1 Score')
|
||
axs[0, 2].set_title('F1 Score over Epochs')
|
||
axs[0, 2].legend()
|
||
|
||
# 折线图:Precision
|
||
axs[1, 0].plot(epochs, precision, 'c-', label='Precision')
|
||
axs[1, 0].set_xlabel('Epoch')
|
||
axs[1, 0].set_ylabel('Precision')
|
||
axs[1, 0].set_title('Precision over Epochs')
|
||
axs[1, 0].legend()
|
||
|
||
# 折线图:Recall
|
||
axs[1, 1].plot(epochs, recall, 'y-', label='Recall')
|
||
axs[1, 1].set_xlabel('Epoch')
|
||
axs[1, 1].set_ylabel('Recall')
|
||
axs[1, 1].set_title('Recall over Epochs')
|
||
axs[1, 1].legend()
|
||
|
||
# 空白或额外的图表空间(如果需要)
|
||
axs[1, 2].axis('off')
|
||
|
||
plt.tight_layout()
|
||
plt.savefig(file_path.replace('.xlsx', '_epoch.png'))
|
||
plt.close()
|
||
|
||
def draw_last_epoch_bar_chart(file_path):
|
||
df = pd.read_excel(file_path)
|
||
last_epoch_data = df.iloc[-1]
|
||
|
||
metrics = ['train_loss', 'train_accuracy', 'test_accuracy', 'f1_score', 'precision', 'recall']
|
||
values = [last_epoch_data[metric] for metric in metrics]
|
||
labels = ['Train Loss', 'Train Accuracy', 'Test Accuracy', 'F1 Score', 'Precision', 'Recall']
|
||
|
||
# 调整数值格式
|
||
values[1] *= 100 # Train Accuracy
|
||
values[2] *= 100 # Test Accuracy
|
||
|
||
plt.figure(figsize=(10, 6))
|
||
plt.bar(labels, values, color=['blue', 'green', 'red', 'magenta', 'cyan', 'yellow'])
|
||
plt.xlabel('Metrics')
|
||
plt.ylabel('Values')
|
||
plt.title('Last Epoch Metrics')
|
||
plt.ylim(bottom=0)
|
||
|
||
# 添加数值标签
|
||
for i, value in enumerate(values):
|
||
plt.text(i, value + 0.01, f'{value:.2f}', ha='center')
|
||
|
||
plt.tight_layout()
|
||
plt.savefig(file_path.replace('.xlsx', '_last_epoch_bar.png'))
|
||
plt.close()
|
||
|
||
def draw_and_save_cm(file_path):
|
||
# 读取 Excel 文件
|
||
df_cm = pd.read_excel(file_path)
|
||
|
||
# 获取标签(假设 DataFrame 的列为类别标签)
|
||
labels = df_cm.columns[1:].tolist()
|
||
|
||
# 获取混淆矩阵和归一化混淆矩阵的数值
|
||
cm = df_cm.values[:, 1:]
|
||
|
||
# 创建一个图像和子图
|
||
fig, axs = plt.subplots(1, 2, figsize=(12, 6))
|
||
|
||
# 绘制普通混淆矩阵
|
||
axs[0].imshow(cm, interpolation='nearest', cmap='Blues')
|
||
axs[0].set_title('Confusion Matrix')
|
||
axs[0].set_xlabel('Predicted')
|
||
axs[0].set_ylabel('True')
|
||
axs[0].set_xticks(np.arange(len(labels)))
|
||
axs[0].set_yticks(np.arange(len(labels)))
|
||
axs[0].set_xticklabels(labels)
|
||
axs[0].set_yticklabels(labels)
|
||
|
||
# 添加数值标签
|
||
for i in range(len(labels)):
|
||
for j in range(len(labels)):
|
||
axs[0].text(j, i, f'{cm[i, j]}', ha='center', va='center')
|
||
|
||
# 调整布局并保存图像
|
||
plt.tight_layout()
|
||
plt.savefig(file_path.replace('.xlsx', '.png'))
|
||
plt.close()
|