matplotlib 散点图绘制

         最近SSD抖动测试需要绘制散点图,想用python来实现,通过google摸索,发现matplotlib模块很是强大,基本可以实现所以的图形绘制需求,这里做下matplotlib笔记记录。


  测试环境:
                    ubuntu 14.04 
                    安装: apt-get install python-matplotlib

  python版本:2.7

  问题需求: 

          fio  测试SSD随机/顺序 读/写 4个项目,每10S记录一次iops数据,每个项目5小时。 最后每个项目会有1800个数据。 需要将1800 * 4 个数据绘制在同一张图,直观的看出数值抖动性的变化!


以下就是实验效果(注时间问题,仅测试一个项目,其余项目数据为构造,仅测试图形绘制功能)


matplotlib 散点图绘制_第1张图片

代码以及解释如下:


#!/usr/bin/env python
#coding:utf-8
#dec:ssd_iops_jitter draw
#pylt ver1


import matplotlib
matplotlib.use('Agg')   #不加有报错
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

rr_file = 'random_read.jdata'
sr_file = 'seq_read.jdata'
rw_file = 'random_write.jdata'
sw_file = 'seq_write.jdata'

data_dt ={
          'rr':['+g','random_read_4k',rr_file],	   #字典方式存储散点图标,颜色;图示名称;数据文件
          'sr':['*b','seq_read_4k',sr_file],
          'rw':['3r','random_write_64k',rw_file],
          'sw':['2m','seq_write_64k',sw_file]
}

def get_file_data(filename):
          with open(filename,'r') as f:
    	         ct = f.read().split("\n")
          return ct

def get_ssd_name():
          with open('ssdname','r') as f:
               name = f.read().strip()
          return name

		  
def get_ymax(l):  #获取y轴最大值
    max_key = 0 
	for item in l:
	    if item > max_key:
		   max_key = item
    ymax = max_key + 10000
	return ymax
	
def get_ymin(l):  #获取y轴最小值
    min_key = 1000000
	for item in l:
	    if item < min_key:
		   min_key = item
	if min_key - 10000:
		   ymin = min_key - 5000
	else:
	       ymin = min_key
	return ymin
	
def plot_setting():
 
      s = [ 'rr', 'sr', 'rw', 'sw' ]
      max_list = []
      min_list = []
      for key in s:
                t = get_file_data(data_dt[key][2])
                x = [ int(value.split()[0]) for value in t if value ]
                y = [ int(value.split()[1]) for value in t if value ]
                ax.plot(x, y, data_dt[key][0],label=data_dt[key][1])   #绘制散点,x,y分别会x,y轴数据列表;第3,4个位置参数分别为散点图标,label名称
                max_list.append(max(y))
                min_list.append(min(y))

      y_max = get_ymax(max_list)
      y_min = get_ymin(min_list)
	 
	 
      #定义坐标轴与名称      
      plt.ylim(y_min,y_max)
      plt.xlim(0,18000)
      plt.ylabel("iops")
      plt.xlabel("time(ms)")
      
      #图示与字体设置
      plt.rc('font', size=8)
      plt.legend(loc=0, numpoints=1)
      leg = plt.gca().get_legend()
      ltext  = leg.get_texts()
      plt.setp(ltext, fontsize='small')
      #标题
      ax.set_title(get_ssd_name())
      plt.savefig('result/ssdTest.png')    			          

if __name__ == '__main__':
      plot_setting()


参考:

http://blog.csdn.net/kkxgx/article/details/6951959

http://sebug.net/paper/books/scipydoc/matplotlib_intro.html

http://matplotlib.org/users/legend_guide.html



你可能感兴趣的:(matplotlib 散点图绘制)