本文是python应用的入门级别的基础学习文章,数据处理以最直观的方式实现,以后可以考虑优化。对于chartdirector的使用可以参看官网的英文说明文档,非常详细简明易懂。
需要处理的数据格式如下:
user1=({'eth0_outMbitps': 4.4299999999999997, 'eth1_outMbitps': 9.9700000000000006, 'eth0_outPacketps': 2207.7800000000002, 'swap_usedpct': 0.0, 'memory_usedpct': 6.6900000000000004, 'disk_writeMBps': 14.09, 'cpu_usedpct': 0.10000000000000001, 'disk_readMBps': 0.0, 'eth1_outPacketps': 3044.75, 'datetime': '20140202.00', 'load1m': 1.04, 'eth0_inMbitps': 1.78, 'eth1_inMbitps': 2.5600000000000001, 'eth1_inPacketps': 3292.6199999999999, 'eth0_inPacketps': 2662.5700000000002, 'ipaddress': '10.1.16.210'},{'eth0_outMbitps': 4.4199999999999999, 'eth1_outMbitps': 7.6900000000000004, 'eth0_outPacketps': 2205.6700000000001, 'swap_usedpct': 0.0, 'memory_usedpct': 6.6799999999999997, 'disk_writeMBps': 10.029999999999999, 'cpu_usedpct': 0.070000000000000007, 'disk_readMBps': 0.0, 'eth1_outPacketps': 2097.5, 'datetime': '20140202.01', 'load1m': 0.79000000000000004, 'eth0_inMbitps': 1.77,'eth1_inMbitps': 1.75, 'eth1_inPacketps': 2248.6700000000001, 'eth0_inPacketps': 2655.8200000000002, 'ipaddress': '10.1.16.210'},{'eth0_outMbitps': 4.4699999999999998, 'eth1_outMbitps': 5.5300000000000002, 'eth0_outPacketps': 2435.2800000000002, 'swap_usedpct': 0.0, 'memory_usedpct': 6.6900000000000004, 'disk_writeMBps': 17.73, 'cpu_usedpct': 0.14999999999999999, 'disk_readMBps': 0.0, 'eth1_outPacketps': 2477.4699999999998, 'datetime': '20140202.02', 'load1m': 0.60999999999999999, 'eth0_inMbitps': 10.539999999999999, 'eth1_inMbitps': 2.3300000000000001, 'eth1_inPacketps': 2583.77, 'eth0_inPacketps': 3365.5700000000002, 'ipaddress': '10.1.16.210'})
user2=({'eth0_outMbitps': 5.4299999999999997, 'eth1_outMbitps': 8.9700000000000006, 'eth0_outPacketps': 2218.7800000000002, 'swap_usedpct': 0.0, 'memory_usedpct': 7.6900000000000004, 'disk_writeMBps': 15.09, 'cpu_usedpct': 0.20000000000000001, 'disk_readMBps': 0.0, 'eth1_outPacketps': 3244.75, 'datetime': '20140202.00', 'load1m': 1.14, 'eth0_inMbitps': 2.78, 'eth1_inMbitps': 2.6600000000000001, 'eth1_inPacketps': 3292.6539999999999, 'eth0_inPacketps': 2462.5700000000002, 'ipaddress': '10.1.16.210'},{'eth0_outMbitps': 8.4199999999999999, 'eth1_outMbitps': 6.6900000000000004, 'eth0_outPacketps': 2215.6700000000001, 'swap_usedpct': 0.0, 'memory_usedpct': 7.6799999999999997, 'disk_writeMBps': 11.029999999999999, 'cpu_usedpct': 0.170000000000000007, 'disk_readMBps': 0.0, 'eth1_outPacketps': 2127.5, 'datetime': '20140202.01', 'load1m': 0.88000000000000004, 'eth0_inMbitps': 1.47,'eth1_inMbitps': 1.15, 'eth1_inPacketps': 2448.6700000000001, 'eth0_inPacketps': 2685.8200000000002, 'ipaddress': '10.1.16.210'},{'eth0_outMbitps': 5.4699999999999998, 'eth1_outMbitps': 6.5300000000000002, 'eth0_outPacketps': 2135.2800000000002, 'swap_usedpct': 0.0, 'memory_usedpct': 5.6900000000000004, 'disk_writeMBps': 13.93, 'cpu_usedpct': 0.18999999999999999, 'disk_readMBps': 0.0, 'eth1_outPacketps': 2577.4699999999998, 'datetime': '20140202.02', 'load1m': 0.80999999999999999, 'eth0_inMbitps': 10.739999999999999, 'eth1_inMbitps': 2.7700000000000001, 'eth1_inPacketps': 2589.77, 'eth0_inPacketps': 3305.5700000000002, 'ipaddress': '10.1.16.210'})
这是usr1和usr2的本机计算机的数据,现在要做的是以时间datetime为X轴,以其中某项值如eth0_outMbitps为Y轴,用折线图方式对比所有用户在不同时间段内的某项性能值的变化趋势。说明:每个user的数据一个元组,元组里有多个字典代表每一个时间段内的所有性能数据。
分析:因为所有用户的datetime都是一样的,因此可以直接提取作为X轴,然后再分别提取某项的所有数据就分别保存图像就可以,思路非常简单清晰,因为这就是入门级别的,呵呵。
直接上代码:
# -*- coding:utf-8 -*-
#---------------------------------------
# 程序:数据图像化
# 版本:0.1
# 作者:chenyuezi
# 日期:2014-03-12
# 语言:Python 2.6.6
#---------------------------------------
import sys
import ast
sys.path.append('/usr/lib/python2.6/site-packages/chartdirector') #动态加载模块,先去官网下载chartdirector,然后按照教程安装放置
from pychartdir import *
import re
#制作图表类
class MakeChart:
#初始化
def __init__(self,filename):
self.init_tmp_data() #初始化临时表
self.orgin_list() #初始化总数据表
self.get_color_list() #初始化所有的颜色列表
self.symbol_list=[CircleSymbol,DiamondSymbol,SquareSymbol,Cross2Shape(),GlassSphere2Shape] #形状图标list
self.symbol_index=0 #标志应该使用的形状图标
self.filename=filename
self.time_list=[] #x轴时间列表
self.time_flag=0 #标记,因为用户的所有时间段都是一样的,只需一个用户的所有时间段就可以
self.get_file_data() #读取文本数据进行处理
self.save_photos() #获取完所有数据就保存
#获取文本数据
def get_file_data(self):
with open(self.filename,'r') as f:
lines=f.readlines() #获取一个list数据
for line in lines:
self.init_tmp_data() #开始前先清空数据
index=line.find("=")
user=line[:index] #获取用户名称
real_data=line[index+2:-2] #获取一个用户所有时间段的数据
tmp=re.compile('{.*?}').findall(real_data)
for item in tmp: #获取一个时间段的数据
dict_item=ast.literal_eval(item)
#获取X轴的时间列表
if self.time_flag
self.time_flag += 1
# 1.对于eth0_outMbitps
self.tmp_outMbitps0.append(dict_item['eth0_outMbitps'])
# 2.对于eth1_outMbitps
self.tmp_outMbitps1.append(dict_item['eth1_outMbitps'])
# 3.对于eth0_outPacketps
self.tmp_outPacketps0.append(dict_item['eth0_outPacketps'])
# 4.对于swap_usedpct
self.tmp_swapusedpct.append(dict_item['swap_usedpct'])
# 5.对于memory_usedpct
self.tmp_memoryusedpct.append(dict_item['memory_usedpct'])
# 6.对于disk_writeMBps
self.tmp_diskwriteMBps.append(dict_item['disk_writeMBps'])
# 7.对于cpu_usedpct
self.tmp_cpuusedpct.append(dict_item['cpu_usedpct'])
# 8.对于disk_readMBps
self.tmp_diskreadMBps.append(dict_item['disk_readMBps'])
# 9.对于eth1_outPacketps
self.tmp_outPacketps1.append(dict_item['eth1_outPacketps'])
# 10.对于load1m
self.tmp_load1m.append(dict_item['load1m'])
# 11.对于eth0_inMbitps
self.tmp_inMbitps0.append(dict_item['eth0_inMbitps'])
# 12.对于eth1_inMbitps
self.tmp_inMbitps1.append(dict_item['eth1_inMbitps'])
# 13.对于eth1_inPacketps
self.tmp_inPacketps1.append(dict_item['eth1_inPacketps'])
# 14.对于eth0_inPacketps
self.tmp_inPacketps0.append(dict_item['eth0_inPacketps'])
#把临时数据保存到总数据中
self.all_outMbitps0.append([user,self.tmp_outMbitps0]) #1
self.all_outMbitps1.append([user,self.tmp_outMbitps1]) #2
self.all_outPacketps0.append([user,self.tmp_outPacketps0]) #3
self.all_swapusedpct.append([user,self.tmp_swapusedpct]) #4
self.all_memoryusedpct.append([user,self.tmp_memoryusedpct]) #5
self.all_diskwriteMBps.append([user,self.tmp_diskwriteMBps]) #6
self.all_cpuusedpct.append([user,self.tmp_cpuusedpct]) #7
self.all_diskreadMBps.append([user,self.tmp_diskreadMBps]) #8
self.all_outPacketps1.append([user,self.tmp_outPacketps1]) #9
self.all_load1m.append([user,self.tmp_load1m]) #10
self.all_inMbitps0.append([user,self.tmp_inMbitps0]) #11
self.all_inMbitps1.append([user,self.tmp_inMbitps1]) #12
self.all_inPacketps1.append([user,self.tmp_inPacketps1]) #13
self.all_inPacketps0.append([user,self.tmp_inPacketps0]) #14
#调度所有数据
def save_photos(self):
#生成一项性能指标图像
self.change_photo(self.all_outMbitps0,"eth0_outMbitps") #1
self.change_photo(self.all_outMbitps1,"eth1_outMbitps") #2
self.change_photo(self.all_outPacketps0,"eth0_outPacketps") #3
self.change_photo(self.all_swapusedpct,"swap_usedpct") #4
self.change_photo(self.all_memoryusedpct,"memory_usedpct") #5
self.change_photo(self.all_diskwriteMBps,"disk_writeMBps") #6
self.change_photo(self.all_cpuusedpct,"cpu_usedpct") #7
self.change_photo(self.all_diskreadMBps,"disk_readMBps") #8
self.change_photo(self.all_outPacketps1,"eth1_outPacketps") #9
self.change_photo(self.all_load1m,"load1m") #10
self.change_photo(self.all_inMbitps0,"eth0_inMbitps") #11
self.change_photo(self.all_inMbitps1,"eth1_inMbitps") #12
self.change_photo(self.all_inPacketps1,"eth1_inPacketps") #13
self.change_photo(self.all_inPacketps0,"eth0_inPacketps") #14
#将数据转化为图像保存 all_data:一张表的数据,save_name:保存的图片名称
def change_photo(self,all_data,save_name):
#保存数据的字典
my_data=dict(all_data) #转换为字典
# The labels for the chart
labels =self.time_list #获取X轴时间列表
# Create a XYChart object of size 600 x 300 pixels, with a pale red (ffdddd)
# background, black border, 1 pixel 3D border effect and rounded corners.
c = XYChart(600, 300, 0xffdddd, 0x000000, 1)
c.setRoundedFrame()
# Set the plotarea at (55, 58) and of size 520 x 195 pixels, with white (ffffff)
# background. Set horizontal and vertical grid lines to grey (cccccc).
c.setPlotArea(55, 58, 520, 195, 0xffffff, -1, -1, 0xcccccc, 0xcccccc)
# Add a legend box at (55, 32) (top of the chart) with horizontal layout. Use 9 pts
# Arial Bold font. Set the background and border color to Transparent.
c.addLegend(55, 32, 0, "arialbd.ttf", 9).setBackground(Transparent)
# Add a title box to the chart using 15 pts Times Bold Italic font. The title is in
# CDML and includes embedded images for highlight. The text is white (ffffff) on a
# dark red (880000) background, with soft lighting effect from the right side.
c.addTitle("<*block,valign=absmiddle*><*img=star.png*><*img=star.png*> "+save_name+" <*img=star.png*><*img=star.png*><*/*>", "timesbi.ttf", 15, 0xffffff).setBackground(0x880000, -1, softLighting(Right))
# Y轴标题
c.yAxis().setTitle("Value")
# x轴坐标
c.xAxis().setLabels(labels)
# X轴标题
c.xAxis().setTitle("<*block,valign=absmiddle*><*img=clock.png*> Time <*/*>")
# Set the axes width to 2 pixels
c.xAxis().setWidth(2)
c.yAxis().setWidth(2)
# 增加一条曲线
layer = c.addSplineLayer()
# Set the default line width to 2 pixels
layer.setLineWidth(2)
# my_data为y轴传来的列表数组
color_index=0 #设置不同颜色下标
for k in my_data.keys():
#color_index/len(self.color_list) 当前的数据量如果超过颜色列表就选择改变形状来唯一标识每一个用户,可以表示的用户总数为len(symbal)*len(color_list)
layer.addDataSet(my_data.get(k),hex(self.color_list[color_index]), k).setDataSymbol(self.symbol_list[color_index/len(self.color_list)], 9,hex(self.color_list[len(self.color_list)-color_index-1])) #hex(self.color_list[self.color_index])
color_index = color_index+1
# Add a custom CDML text at the bottom right of the plot area as the logo
c.addText(575, 250,"<*block,valign=absmiddle*><*img=small_molecule.png*> <*block*><*font=timesbi.ttf,size=10,color=804040*>right\nconnor<*/*>").setAlignment(BottomRight)
# Output the chart
c.makeChart(save_name+".png")
#初始化或清空临时保存的变量
def init_tmp_data(self):
self.tmp_outMbitps0=[] #一张表的数据
self.tmp_outMbitps1=[]
self.tmp_outPacketps0=[]
self.tmp_swapusedpct=[]
self.tmp_memoryusedpct=[]
self.tmp_diskwriteMBps=[]
self.tmp_cpuusedpct=[]
self.tmp_diskreadMBps=[]
self.tmp_outPacketps1=[]
self.tmp_load1m=[]
self.tmp_inMbitps0=[]
self.tmp_inMbitps1=[]
self.tmp_inPacketps1=[]
self.tmp_inPacketps0=[]
#初始化保存的变量
def orgin_list(self):
self.all_outMbitps0=[] #所有的表数据
self.all_outMbitps1=[]
self.all_outPacketps0=[]
self.all_swapusedpct=[]
self.all_memoryusedpct=[]
self.all_diskwriteMBps=[]
self.all_cpuusedpct=[]
self.all_diskreadMBps=[]
self.all_outPacketps1=[]
self.all_load1m=[]
self.all_inMbitps0=[]
self.all_inMbitps1=[]
self.all_inPacketps1=[]
self.all_inPacketps0=[]
#获取所有的颜色列表
def get_color_list(self):
#颜色的列表
self.color_list=[0xB3D52B,0x00FF99,0xFF6600,0xFF9900,0xFFCC00,0xFFFF00,0xCCFF00,0x99FF00,0x66FF00,0x33FF00,0x00FF00,0x00FF33,0x00FF66,0x00FFCC,0x00FFFF,0x00CCFF,0x0099FF,0x0066FF,0x0033FF,0x0000FF,0x3300FF,0x6600FF,0x9900FF,0xCC00FF,0xFF00FF,0xFF00CC,0xFF0099,0xFF0066,0xFF0033,
0xF70909,0xF73809,0xF76809,0xF79709,0xF7C709,0xF7F709,0xC7F709,0x97F709,0x68F709,0x38F709,0x09F709,0x09F738,0x09F768,0x09F797,0x09F7C7,0x09F7F7,0x09C7F7,0x0997F7,0x0968F7,0x0938F7,0x0909F7,0x3809F7,0x6809F7,0x9709F7,0xC709F7,0xF709F7,0xF709C7,0xF70997,0xF70968,0xF70938,
0xEE1111,0xEE3D11,0xEE6911,0xEE9611,0xEEC211,0xEEEE11,0xC2EE11,0x96EE11,0x69EE11,0x3DEE11,0x11EE11,0x11EE3D,0x11EE69,0x11EE96,0x11EEC2,0x11EEEE,0x11C2EE,0x1196EE,0x1169EE,0x113DEE,0x1111EE,0x3D11EE,0x6911EE,0x9611EE,0xC211EE,0xEE11EE,0xEE11C2,0xEE1196,0xEE1169,0xEE113D,
0xE61A1A,0xE6421A,0xE66B1A,0xE6941A,0xE6BD1A,0xE6E61A,0xBDE61A,0x94E61A,0x6BE61A,0x42E61A,0x1AE61A,0x1AE642,0x1AE66B,0x1AE694,0x1AE6BD,0x1AE6E6,0x1ABDE6,0x1A94E6,0x1A6BE6,0x1A42E6,0x1A1AE6,0x421AE6,0x6B1AE6,0x941AE6,0xBD1AE6,0xE61AE6,0xE61ABD,0xE61A94,0xE61A6B,0xE61A42,
0xDD2222,0xDD4822,0xDD6D22,0xDD9222,0xDDB822,0xDDDD22,0xB8DD22,0x92DD22,0x6DDD22,0x48DD22,0x22DD22,0x22DD48,0x22DD6D,0x22DD92,0x22DDB8,0x22DDDD,0x22B8DD,0x2292DD,0x226DDD,0x2248DD,0x2222DD,0x4822DD,0x6D22DD,0x9222DD,0xB822DD,0xDD22DD,0xDD22B8,0xDD2292,0xDD226D,0xDD2248,
0xD52B2B,0xD54D2B,0xD56F2B,0xD5912B,0xD5B32B,0xD5D52B,0xFF0000,0x91D52B,0x6FD52B,0x4DD52B,0x2BD52B,0x2BD54D,0x2BD56F,0x2BD591,0x2BD5B3,0x2BD5D5,0x2BB3D5,0x2B91D5,0x2B6FD5,0x2B4DD5,0x2B2BD5,0x4D2BD5,0x6F2BD5,0x912BD5,0xB32BD5,0xD52BD5,0xD52BB3,0xD52B91,0xD52B6F,0xD52B4D,
0xCC3333,0xCC5233,0xCC7033,0xCC8F33,0xCCAE33,0xCCCC33,0xAECC33,0x8FCC33,0x70CC33,0x52CC33,0x33CC33,0x33CC52,0x33CC70,0x33CC8F,0x33CCAE,0x33CCCC,0x33AECC,0x338FCC,0x3370CC,0x3352CC,0x3333CC,0x5233CC,0x7033CC,0x8F33CC,0xAE33CC,0xCC33CC,0xCC33AE,0xCC338F,0xCC3370,0xCC3352,
0xC43C3C,0xC4573C,0xC4723C,0xC48D3C,0xC4A93C,0xC4C43C,0xA9C43C,0x8DC43C,0x72C43C,0x57C43C,0x3CC43C,0x3CC457,0x3CC472,0x3CC48D,0x3CC4A9,0x3CC4C4,0x3CA9C4,0x3C8DC4,0x3C72C4,0x3C57C4,0x3C3CC4,0x573CC4,0x723CC4,0x8D3CC4,0xA93CC4,0xC43CC4,0xC43CA9,0xC43C8D,0xC43C72,0xC43C57,
0xBB4444,0xBB5C44,0xBB7444,0xBB8C44,0xBBA344,0xBBBB44,0xA3BB44,0x8CBB44,0x74BB44,0x5CBB44,0x44BB44,0x44BB5C,0x44BB74,0x44BB8C,0x44BBA3,0x44BBBB,0x44A3BB,0x448CBB,0x4474BB,0x445CBB,0x4444BB,0x5C44BB,0x7444BB,0x8C44BB,0xA344BB,0xBB44BB,0xBB44A3,0xBB448C,0xBB4474,0xBB445C,
0xB34D4D,0xB3614D,0xB3764D,0xB38A4D,0xB39E4D,0xB3B34D,0x9EB34D,0x8AB34D,0x76B34D,0x61B34D,0x4DB34D,0x4DB361,0x4DB376,0x4DB38A,0x4DB39E,0x4DB3B3,0x4D9EB3,0x4D8AB3,0x4D76B3,0x4D61B3,0x4D4DB3,0x614DB3,0x764DB3,0x8A4DB3,0x9E4DB3,0xB34DB3,0xB34D9E,0xB34D8A,0xB34D76,0xB34D61,
0xAA5555,0xAA6655,0xAA7755,0xAA8855,0xAA9955,0xAAAA55,0x99AA55,0x88AA55,0x77AA55,0x66AA55,0x55AA55,0x55AA66,0x55AA77,0x55AA88,0x55AA99,0x55AAAA,0x5599AA,0x5588AA,0x5577AA,0x5566AA,0x5555AA,0x6655AA,0x7755AA,0x8855AA,0x9955AA,0xAA55AA,0xAA5599,0xAA5588,0xAA5577,0xAA5566,
0xA25E5E,0xA26B5E,0xA2795E,0xA2875E,0xA2945E,0xA2A25E,0x94A25E,0x87A25E,0x79A25E,0x6BA25E,0x5EA25E,0x5EA26B,0x5EA279,0x5EA287,0x5EA294,0x5EA2A2,0x5E94A2,0x5E87A2,0x5E79A2,0x5E6BA2,0x5E5EA2,0x6B5EA2,0x795EA2,0x875EA2,0x945EA2,0xA25EA2,0xA25E94,0xA25E87,0xA25E79,0xA25E6B,
0x996666,0x997166,0x997B66,0x998566,0x998F66,0x999966,0x8F9966,0x859966,0x7B9966,0x719966,0x669966,0x669971,0x66997B,0x669985,0x66998F,0x669999,0x668F99,0x668599,0x667B99,0x667199,0x666699,0x716699,0x7B6699,0x856699,0x8F6699,0x996699,0x99668F,0x996685,0x99667B,0x996671,
0x916F6F,0x91766F,0x917D6F,0x91836F,0x918A6F,0x91916F,0x8A916F,0x83916F,0x7D916F,0x76916F,0x6F916F,0x6F9176,0x6F917D,0x6F9183,0x6F918A,0x6F9191,0x6F8A91,0x6F8391,0x6F7D91,0x6F7691,0x6F6F91,0x766F91,0x7D6F91,0x836F91,0x8A6F91,0x916F91,0x916F8A,0x916F83,0x916F7D,0x916F76,
0x887777,0x887B77,0x887E77,0x888277,0x888577,0x888877,0x858877,0x828877,0x7E8877,0x7B8877,0x778877,0x77887B,0x77887E,0x778882,0x778885,0x778888,0x778588,0x778288,0x777E88,0x777B88,0x777788,0x7B7788,0x7E7788,0x827788,0x857788,0x887788,0x887785,0x887782,0x88777E,0x88777B,
0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080,0x808080
];
if __name__=='__main__':
my_chart=MakeChart('data.txt') #data.txt里面的内容就是本文开头列出的数据
程序运行的结果如下: