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 相关文章推荐
python使用内存zipfile对象在内存中打包文件示例
Apr 30 Python
Python实现Linux下守护进程的编写方法
Aug 22 Python
Python中的赋值、浅拷贝、深拷贝介绍
Mar 09 Python
Python3.2模拟实现webqq登录
Feb 15 Python
Django项目中用JS实现加载子页面并传值的方法
May 28 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
在Python中实现替换字符串中的子串的示例
Oct 31 Python
python3实现zabbix告警推送钉钉的示例
Feb 20 Python
Python获取浏览器窗口句柄过程解析
Jul 25 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 Python
快速解决pymongo操作mongodb的时区问题
Dec 05 Python
python 实现图片裁剪小工具
Feb 02 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
索尼ICF-SW100收音机评测
2021/03/02 无线电
删除及到期域名的查看(抢域名必备哦)
2008/05/14 PHP
PHP Memcached应用实现代码
2010/02/08 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
PHP中require和include路径问题详解
2014/12/25 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
javascript抽象工厂模式详细说明
2014/12/16 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
在JavaScript中正确引用bind方法的应用
2015/05/11 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
javascript正则表达式定义(语法)总结
2016/01/08 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
js函数和this用法实例分析
2020/03/13 Javascript
使用 UniApp 实现小程序的微信登录功能
2020/06/09 Javascript
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
python字符串替换的2种方法
2014/11/30 Python
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
Python中作用域的深入讲解
2018/12/10 Python
Python命令行click参数用法解析
2019/12/19 Python
有机童装:Toby Tiger
2018/05/23 全球购物
我爱我校演讲稿
2014/05/21 职场文书
禁毒宣传工作方案
2014/05/23 职场文书
2014年中秋寄语
2014/08/11 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
公司开业的祝贺语大全(60条)
2019/07/05 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
Apache压力测试工具的安装使用
2021/03/31 Servers