python绘制双Y轴折线图以及单Y轴双变量柱状图的实例


Posted in Python onJuly 08, 2019

近来实验室的师姐要发论文,由于论文交稿时间临近,有一些杂活儿需要处理,作为实验室资历最浅的一批,我这个实习生也就责无旁贷地帮忙当个下手。今天师姐派了一个小活,具体要求是:

给一些训练模型的迭代次数,训练精度的数据,让我做成图表形式展示出来,一方面帮助检查模型训练时的不足,另一方面来看样本数目和预测精度之间的联系,数据具体格式如下:

Iteration 1500

label train test  right acc

12  143 24  24  1.0

160 92  16  15  0.9375

100 12  2   0   0.0

142 0   0   0   0.0

152 0   0   0   0.0

110 10  2   0   0.0

170 12  2   2   1.0

42  421 70  63  0.9

31  43  8   5   0.625

22  132 22  18  0.818181818182

60  51  9   8   0.888888888889

51  916 153 143 0.934640522876

131 82  14  11  0.785714285714

53  84  14  10  0.714285714286

70  9   2   2   1.0

21  531 89  89  1.0

120 1   1   1   1.0

11  454 76  71  0.934210526316

90  1   1   1   1.0

32  39  7   6   0.857142857143

41  151 25  14  0.56

132 0   0   0   0.0

151 43  7   6   0.857142857143

43  8   2   1   0.5

80  7   2   1   0.5

141 96  16  16  1.0

44  67  12  2   0.166666666667

right: 509     accuracy:0.883680555556

我的任务就是以label为自变量,绘制出它和train及acc之间的关系。

接到这个任务后,最直观的感受就是常规的洗数据,于是我先把这些数据放在txt文件中存储下来,由于每个数据之间的间隔大于一个空格,我想当然地写个正则匹配脚本将数据间的大空格转换为一个逗号(转换为逗号的目的是这样可以直接转换为CSV表格文件,然而在本次任务中貌似意义不大….)

#**********************Python 3.6.1***************************#
#*      将txt文本数据中的过长的空格更为一个逗号      *#
#*****************  Author LQ ******************************#
#********************** 2018/4/4 ****************************#
 
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
import os #os模块与文本操作直接相关的模块
#*********下面三句代码作用不详,就是为了防止出现编码问题*********
import importlib
import sys
importlib.reload(sys)
#****************************************************
PATTERN = '\s+'#匹配出文本中的长空格
class Cleaner:
  #初始化
  def __init__(self):
    os.chdir('D:\\Learning\\Machine_Learning\\实习\\师姐论文实验') #改变工作目录到txt文件对应的目录
    self.content = open("acc-onlyRealImage-Iter2500.txt")
  
  def grab_content(self):
    line=self.content.readline()
    pre=re.compile(PATTERN)
    while line:  
      line_1=pre.sub(',',line) #将文本的长空格转换为逗号后,利于转成CSV格式,然后label按照升序排列
      self.Write_content(line_1)
      line = self.content.readline() 
 
  def Write_content(self,line_1):
    path='acc-onlyRealImage-Iter2500-after.txt'
    f=open(path,'a')
    f.write('\n'+line_1)
 
  def run(self): 
    self.grab_content()
 
 
if __name__ == '__main__':
  cleaner = Cleaner()  
  cleaner.run()

数据清洗完成后,自然就是绘图了,逛了一些博客后,着手写个脚本,第一版是绘制出label和train及acc的双Y轴折线图,脚本较为简单,就是调用别人造的轮子,直接附上代码:

#**********************Python 3.6.1***************************#
#*           绘制出双Y轴折线图           *#
#*****************  Author LQ ******************************#
#********************** 2018/4/4 ****************************#
 
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
import os #os模块与文本操作直接相关的模块
import matplotlib.pyplot as plt
import numpy as np
#*********下面三句代码作用不详,就是为了防止出现编码问题*********
import importlib
import sys
importlib.reload(sys)
#****************************************************
font2 = {'family' : 'Times New Roman', 
     'weight' : 'normal', 
     'size'  : 18, 
    }
 
class Drawing:
  #初始化
  def __init__(self):
    os.chdir('D:\\Learning\\Machine_Learning\\实习\\师姐论文实验') #改变工作目录到指定文件目录
    self.content = open("acc-onlyRealImage-Iter2200-after.txt")
    self.content1 = open("acc-onlyRealImage-Iter2500-after.txt")
 
  def grab_content(self):
    lines=self.content.readlines()
    lines_1=self.content1.readlines()
    x_1 = [line.strip().split(',')[0] for line in lines ]#字段以逗号分隔,这里取得是第4列
    y_train_1=[line.strip().split(',')[1] for line in lines ]
    y_train_2=[line.strip().split(',')[1] for line in lines_1 ]
    y_acc_1=[line.strip().split(',')[4] for line in lines ]
    y_acc_2=[line.strip().split(',')[4] for line in lines_1 ]
    x = list(range(len(x_1)))
    y_acc=[]
    y_acc1=[]
    y_train=[]
    y_train1=[]
    for i in range(len(y_acc_1)):
      y_acc.append(float(y_acc_1[i]))
      y_acc1.append(float(y_acc_2[i]))
      y_train.append(int(y_train_1[i]))
      y_train1.append(int(y_train_2[i]))
    
    #plt.xticks(x, x_1,rotation=0)
    fig,left_axis=plt.subplots() 
    
    p1, =left_axis.plot(x, y_train,'ro-')
    right_axis = left_axis.twinx() 
    p2, =right_axis.plot(x, y_acc,'bo-')                                                    
    plt.xticks(x, x_1,rotation=0) #设置x轴的显示形式
 
    #设置左坐标轴以及右坐标轴的范围、精度
    left_axis.set_ylim(0,1201) 
    left_axis.set_yticks(np.arange(0,1201,200)) 
    right_axis.set_ylim(0,1.01) 
    right_axis.set_yticks(np.arange(0,1.01,0.20)) 
 
    #设置坐标及标题的大小、颜色
    left_axis.set_title('RealAndSimulation-Iter6600',font2)
    left_axis.set_xlabel('Labels',font2)
    left_axis.set_ylabel('Number of training sets',font2,color='r')
    left_axis.tick_params(axis='y', colors='r') 
    right_axis.set_ylabel('Accuracy',font2,color='b') 
    right_axis.tick_params(axis='y', colors='b') 
    plt.show()
 
  def run(self): 
    self.grab_content()
 
if __name__ == '__main__':
  Drawing = Drawing()  
  Drawing.run()

python绘制双Y轴折线图以及单Y轴双变量柱状图的实例

绘制出的图形如上所示,其实看起来也还不错,不过师姐表示有点乱,建议做个柱形的看看,于是继续撸代码:

#**********************Python 3.6.1***************************#
#*           绘制单Y轴双变量柱状图          *#
#*****************  Author LQ ******************************#
#********************** 2018/4/4 ****************************#
 
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
import os #os模块与文本操作直接相关的模块
import matplotlib.pyplot as plt
import numpy as np
#*********下面三句代码作用不详,就是为了防止出现编码问题*********
import importlib
import sys
importlib.reload(sys)
#****************************************************
font2 = {'family' : 'Times New Roman',  #设置字体
     'weight' : 'normal', 
     'size'  : 18, 
    }
 
class Drawing:
  #初始化
  def __init__(self):
    os.chdir('D:\\Learning\\Machine_Learning\\实习\\师姐论文实验') #改变工作目录到指定文件的目录
    self.content = open("acc-onlyRealImage-Iter2200-after.txt")
    self.content1 = open("acc-onlyRealImage-Iter2500-after.txt")
  
  def autolabel(self,rects,y): #在柱状图上面添加 数值
    i=0
    for rect in rects:
      #读出列表存储的value值
      value=y[i] 
      x_1 = rect.get_x() + rect.get_width()/2
      y_1 = rect.get_height()
      #x_1,y_1对应柱形的横、纵坐标
      i+=1
      plt.text(x_1, y_1, value, ha='center', va='bottom',fontdict={'size': 8}) #在fontdict中设置字体大小
      rect.set_edgecolor('white')
 
  def Pictures(self):
    lines=self.content.readlines()
    lines_1=self.content1.readlines()
    x_1 = [line.strip().split(',')[0] for line in lines ]#字段以逗号分隔,这里取得是第1列
    y_train_1=[line.strip().split(',')[1] for line in lines ]
    y_train_2=[line.strip().split(',')[1] for line in lines_1 ]
    y_acc_1=[line.strip().split(',')[4] for line in lines ]
    y_acc_2=[line.strip().split(',')[4] for line in lines_1 ]
    x = list(range(len(x_1)))
    y_acc=[]
    y_acc1=[]
    y_train=[]
    y_train1=[]
    for i in range(len(y_acc_1)):
      y_acc.append(float(y_acc_1[i]))
      y_acc1.append(float(y_acc_2[i]))
      y_train.append(int(y_train_1[i]))
      y_train1.append(int(y_train_2[i]))
    plt.xticks(x, x_1,rotation=0) #设置X轴坐标值为label值
 
    for i in range(len(x)): #调整柱状图的横坐标,使得打印出来的图形看起来更加舒服 
      x[i] = x[i] -0.2 
    a=plt.bar(x, y_train,width=0.4,label='iter2200',fc = 'b') 
    #a=plt.bar(x, y_acc,width=0.4,label='iter2200',fc = 'b') 
    for i in range(len(x)): 
      x[i] = x[i] + 0.4 
    b=plt.bar(x, y_train1, width=0.4, label='iter2500',fc = 'r')
    #b=plt.bar(x, y_acc1, width=0.4, label='iter2500',fc = 'r')
    plt.xlabel('Labels',font2) 
    #设置Y轴值的范围
    plt.ylim((0, 1000))
    #设置Y轴的刻度值
    plt.yticks(np.arange(0,1001, 200))
    #plt.ylim((0, 1.1))
    #plt.yticks(np.arange(0,1.1, 0.2)) 
    #plt.ylabel('Accuracy',font2)
    plt.ylabel('Number of training sets',font2) #字体的格式在font2中有设置
    self.autolabel(a,y_train_1) #为柱形图打上数值标签
    self.autolabel(b,y_train_2)
    #self.autolabel(a,y_acc_1)
    #self.autolabel(b,y_acc_2)
    #plt.title("RealAndSimulation",font2)
    plt.title("OnlyRealImage",font2)
    plt.legend()
    plt.show()
 
  def run(self): 
    self.Pictures()
 
if __name__ == '__main__':
  Draw = Drawing()  
  Draw.run()

呈现的效果如下,此处因为对于双柱形图通常采用同一Y轴坐标系,所以此处选择的是比对不同迭代次数:

python绘制双Y轴折线图以及单Y轴双变量柱状图的实例

python绘制双Y轴折线图以及单Y轴双变量柱状图的实例

此处为了方便实验结果的观测,在每个柱形上面均打印出了对应的数值,至此,这部分的任务ending,难度不是很大,不过需要自己耐心编写脚本,调试出好的结果~

以上这篇python绘制双Y轴折线图以及单Y轴双变量柱状图的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
把项目从Python2.x移植到Python3.x的经验总结
Apr 20 Python
使用Python生成url短链接的方法
May 04 Python
Python3读取文件常用方法实例分析
May 22 Python
python删除过期文件的方法
May 29 Python
Python处理JSON数据并生成条形图
Aug 05 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
python+matplotlib绘制3D条形图实例代码
Jan 17 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
PHP统计代码行数的小代码
Sep 19 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
Django继承自带user表并重写的例子
Nov 18 Python
Python图像处理库PIL的ImageFont模块使用介绍
Feb 26 Python
简单了解python的内存管理机制
Jul 08 #Python
python用for循环求和的方法总结
Jul 08 #Python
python面试题之列表声明实例分析
Jul 08 #Python
python 一个figure上显示多个图像的实例
Jul 08 #Python
Python3实现汉语转换为汉语拼音
Jul 08 #Python
python如何爬取网站数据并进行数据可视化
Jul 08 #Python
Django后台admin的使用详解
Jul 08 #Python
You might like
东芝TOSHIBA RP-F11电路分析
2021/03/02 无线电
PHP exif扩展方法开启详解
2014/07/28 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
PDO::prepare讲解
2019/01/29 PHP
jQuery Ajax之load()方法
2009/10/12 Javascript
让你的网站可编辑的实现js代码
2009/10/19 Javascript
JavaScript CSS修改学习第五章 给“上传”添加样式
2010/02/19 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
2013/02/04 Javascript
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
js获取GridView中行数据的两种方法 分享
2013/07/13 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
简单的JavaScript互斥锁分享
2014/02/02 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
bootstrap多种样式进度条展示
2016/12/20 Javascript
jsonp跨域请求详解
2017/07/13 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
Python抓取京东图书评论数据
2014/08/31 Python
Django Admin实现上传图片校验功能
2016/03/06 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
python中的 zip函数详解及用法举例
2020/02/16 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
Python如何自动获取目标网站最新通知
2020/06/18 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
美国Randolph太阳镜官网:美国制造的飞行员太阳镜和射击眼镜
2018/06/15 全球购物
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
上海雨人软件技术开发有限公司测试题
2015/07/14 面试题
无犯罪记录证明样本
2015/06/16 职场文书
MySQL中一条update语句是如何执行的
2022/03/16 MySQL