首页 >> 大全

python matplotlib绘图、混淆矩阵 汉字字体、数字、英文字母的设置

2023-06-22 大全 42 作者:考证青年

最近在写一篇文章的时候,文章对图片格式有要求:图中汉字用宋体六号、数字和英文字母用新罗马字体,这些都需要在一张图中表现出来。经过一番查找摸索,现归纳整理如下:

坐标轴设置

现假设有如下要求:在一张图中的坐标轴用数字来表示刻度,还要用汉字来定义坐标轴含义,而且图中还有英文图例。

在一张图中(下图1所示),我们用代码需要绘制出同时满足以上要求的图,就需要在程序中进行全局和局部的设置,以满足要求。

从图中可以看出,这张图满足了我们的要求,这张图是用绘制的。下面就列出代码,关键点处会加以说明。

import matplotlib.pyplot as plt #这行代码必不可少,就不多说了
#下面以字典的形式将对应的点列出,这是我自己跑了几个模型的准确率和验证准确率的值,总共是50个epoch,部分数据被我删除了(处于保密),你们可以自己随便写一些数值,将其补全
mobilenet={ 'acc':[0.5204,0.8537,0.8873,0.9041,0.9281,0.9329,0.9496,0.9472,0.9664,0.9712,0.9736,0.9544,0.9616,0.9640,0.9928,0.9808,0.9640,0.9712,0.9688,0.9784,0.9496,0.9808,0.9688,0.9640,0.9856,0.9664,0.9664,0.9712,0.9964,0.9808,0.9736,0.9784,0.9736,0.9880,0.9808,0.9928,0.9880,0.9880,0.9808,0.9928,0.9976,0.9952,0.9856,0.9856,0.9952,0.9808,0.9856,0.9904,0.9928,0.9836],'val_acc':[0.3741,0.3741,0.4388,0.5504,0.5252,0.4892,0.6338,0.5180,0.4676,0.4964,0.6475,0.7122,0.6619,0.6691,0.6547,0.6331,0.6835,0.7291,0.8417,0.7410,0.7770,0.7163,0.6901,0.7338,0.7842,0.7986,0.7842,0.7626,0.8345,0.9137,0.9256,0.9065,0.8777,0.8921,0.8058,0.7626,0.7852,0.8129,0.8561,0.9137,0.9137,0.9065,0.9353,0.9496,0.9353,0.9640,0.9568,0.9424,0.9237,0.9320]}
xception={        'acc': [],     'val_acc':[]
NASNetMobile={    'acc': [],     'val_acc':[]
desnet121={       'acc': [],     'val_acc':[]            
VGG19={           'acc': [],     'val_acc':[]
resnet101={       'acc': [],     'val_acc':[]
#字典创建好以后就取出字典的值,将其付给一个变量(这部分对吗应给能看懂吧,要是看不懂,就要好好补一下基础知识了)
res50_acc=resnet101['acc']
res50_val_acc=resnet101['val_acc']
vgg19_acc=VGG19['acc']
vgg19_val_acc=VGG19['val_acc']
des121_acc=desnet121['acc']
des121_val_acc=desnet121['val_acc']
#接下来就开始绘图了
epoch = [i for i in range(50)]
plt.plot(epoch,res50_acc, 'r.-',linewidth=1.2, label='ResNet101_acc')
plt.plot(epoch, res50_val_acc, 'r-',linewidth=1.2, label='ResNet101_val_acc')
#在plt.plot()函数里面设置了坐标轴变量、曲线类型、线宽、曲线标签等
plt.plot(epoch, vgg19_acc, 'g.--',linewidth=1.2,label='VGG19_acc')
plt.plot(epoch, vgg19_val_acc, 'g--',linewidth=1.2, label='VGG19_val_acc')plt.plot(epoch,des121_acc,'b.:' ,linewidth=1.2, label='DesNet201_acc')
plt.plot(epoch, des121_val_acc,'b:' ,linewidth=1.2, label='DesNet201_val_acc')#以下两行设置全局字体,在本例中,坐标轴刻度和图例均用新罗马字体来表示
plt.rcParams['font.sans-serif']=['TimesNewRoman'] # ['SimSun']宋体;['SimHei']黑体,有很多自己都可以设置
plt.rcParams['axes.unicode_minus'] = Falseplt.xlabel('训练回合',fontsize=9.5,fontfamily="SimSun")#设置坐标轴标签,标签大小,局部字体设置,本例设置为宋体
plt.ylabel('准确率',fontsize=9.5,fontfamily="SimSun")
plt.legend(loc='best',fontsize=7.5,frameon=True)#图例设置,函数中的参数loc除了取best(自动将图例放到合适的位置)外,还可以认为设置,比如右上角时:loc='upper right',左下角时:loc='lower left',
#还有upper left、lower right、center left、center right、lower center、upper center等
plt.show()

第一张图的要求我们就用绘制好了。

绘制混淆矩阵

有些中文期刊,图中要求不能出现英文,所以就需要将混淆矩阵的坐标轴标签设置为中文。下图2所示为混淆矩阵汉字为宋体,数字符号为新罗马字体

代码如下:

from __future__ import print_function
from matplotlib import pyplot as plt
import numpy as np
import itertools
from sklearn.metrics import confusion_matrix,accuracy_score#以下代码为绘制混淆矩阵的代码
def plot_confusion_matrix(y_true, y_pred, title="混淆矩阵",cmap=plt.cm.Blues, save_flg=False):#classes = [str(i) for i in range(7)]classes=['<5%','5%','7%','9%','11%','13%','15%']labels = range(7)cm = confusion_matrix(y_true, y_pred, labels=labels)plt.figure(figsize=(5, 4))plt.imshow(cm, interpolation='nearest', cmap=cmap)plt.title(title, fontsize=7.5,fontfamily="SimSun")plt.colorbar()tick_marks = np.arange(len(classes))plt.xticks(tick_marks, classes, fontsize=7.5)plt.yticks(tick_marks, classes, fontsize=7.5)plt.rcParams['font.sans-serif']=['TimesNewRoman']        plt.rcParams['axes.unicode_minus'] =Falsethresh = cm.max() / 2.for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):plt.text(j, i, cm[i, j],horizontalalignment="center",color="white" if cm[i, j] > thresh else "black")plt.ylabel('真实值', fontsize=7.5,fontfamily="SimSun")plt.xlabel('预测值', fontsize=7.5,fontfamily="SimSun")if save_flg:plt.savefig("./confusion_matrix.png")plt.show()
#主函数
def main():#以下代码为读取.txt文件代码 with open('pred.txt', 'r') as file:for line in file:pred_label = [int(i) for i in line.split(',')[1:-2]]print(pred_label)with open('true.txt', 'r') as file:for line in file:true_label = [int(i) for i in line.split(',')[1:-2]]print(true_label)#直接打印测试准确率print('accuracy_score:',accuracy_score(true_label, pred_label))#调用混淆矩阵,生成可视化图plot_confusion_matrix(true_label,pred_label, save_flg=True)if __name__ =='__main__':main()

主函数main()中的pred.txt和true.txt 为列表格式的文件,可以自己直接手写,也可以由程序直接导出。我在之前的文章.0自制神经网络数据集及预测结果(混淆矩阵)可视化 中有消息介绍,此处不做过多叙述。

本文到此结束,整理不易,喜欢的话点个赞呗

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了