最近在写一篇文章的时候,文章对图片格式有要求:图中汉字用宋体六号、数字和英文字母用新罗马字体,这些都需要在一张图中表现出来。经过一番查找摸索,现归纳整理如下:
对坐标轴设置
现假设有如下要求:在一张图中的坐标轴用数字来表示刻度,还要用汉字来定义坐标轴含义,而且图中还有英文图例。
在一张图中(下图1所示),我们用python代码需要绘制出同时满足以上要求的图,就需要在程序中进行全局和局部的设置,以满足要求。
从图中可以看出,这张图满足了我们的要求,这张图是用python绘制的。下面就列出代码,关键点处会加以说明。
import matplotlib.pyplotas 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=[ifor iinrange(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']=False
plt.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()
第一张图的要求我们就用python绘制好了。
- 绘制混淆矩阵
有些中文期刊,图中要求不能出现英文,所以就需要将混淆矩阵的坐标轴标签设置为中文。下图2所示为混淆矩阵汉字为宋体,数字符号为新罗马字体
代码如下:
from __future__import print_functionfrom matplotlibimport pyplotas pltimport numpyas npimport itertoolsfrom sklearn.metricsimport confusion_matrix,accuracy_score#以下代码为绘制混淆矩阵的代码defplot_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']=False
thresh= cm.max()/2.for i, jin 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]> threshelse"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()#主函数defmain():#以下代码为读取.txt文件代码withopen('pred.txt','r')asfile:for lineinfile:
pred_label=[int(i)for iin line.split(',')[1:-2]]print(pred_label)withopen('true.txt','r')asfile:for lineinfile:
true_label=[int(i)for iin 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 为列表格式的文件,可以自己直接手写,也可以由程序直接导出。我在之前的文章tensorflow2.0自制神经网络数据集及预测结果(混淆矩阵)可视化 中有消息介绍,此处不做过多叙述。
本文到此结束,整理不易,喜欢的话点个赞呗