最近在写论文,本来用visio画图,然后发现用latex显示的visio图不够精美,查了资料,发现有很多精美的制作图片的软件,所以选用python来画图,正好可以学习下python语法。

python主要是用matplot和numpy这两个库来画图,后一个库主要是用作处理数字。不废话,上代码:

import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = True
plt.rcParams['mathtext.default'] = 'bf'
# plt.rcParams['lines.linewidth'] = 2
plt.rcParams['font.size'] = 12
time = []  # time
x = []  # x axis
job1 = []  # job1
job2 = []  # job2
job3 = []  # job3
job4 = []  # job4
job5 = []  # job5
job6 = []  # job6
file = open('F:\\test\\HYAS')
for line in file:
    line_split = line.strip('\n').split(',')
    time.append(long(line_split[0]))
    x.append(0)
    size = len(line_split) - 1
    for i in range(size):
        items = line_split[i + 1].split(':')
        if int(items[0]) == 1:
            job1.append(float(items[1]))
        if int(items[0]) == 2:
            job2.append(float(items[1]))
        if int(items[0]) == 3:
            job3.append(float(items[1]))
        if int(items[0]) == 4:
            job4.append(float(items[1]))
        if int(items[0]) == 5:
            job5.append(float(items[1]))
        if int(items[0]) == 6:
            job6.append(float(items[1]))
    while len(job1) < len(time):
        job1.append(0)
    while len(job2) < len(time):
        job2.append(0)
    while len(job3) < len(time):
        job3.append(0)
    while len(job4) < len(time):
        job4.append(0)
    while len(job5) < len(time):
        job5.append(0)
    while len(job6) < len(time):
        job6.append(0)
realtime = []
temp = time[0]
for item in time:
    realtime.append(float(item - temp) / 1000000000)
for i in range(len(job1)):
    job2[i] += job1[i]
for i in range(len(job2)):
    job3[i] += job2[i]
for i in range(len(job3)):
    job4[i] += job3[i]
for i in range(len(job4)):
    job5[i] += job4[i]
for i in range(len(job5)):
    job6[i] += job5[i]
print time
print realtime
print job1
print sum(job6)/len(job6)
plt1, = plt.plot(realtime, job6, color='magenta')
plt2, = plt.plot(realtime, job5, color='yellow')
plt3, = plt.plot(realtime, job4, color='black')
plt4, = plt.plot(realtime, job3, color='blue')
plt5, = plt.plot(realtime, job2, color='green')
plt6, = plt.plot(realtime, job1, color='red')
plt.fill_between(realtime, x, job1, facecolor='red')
plt.fill_between(realtime, job1, job2, facecolor='green')
plt.fill_between(realtime, job2, job3, facecolor='blue')
plt.fill_between(realtime, job3, job4, facecolor='black')
plt.fill_between(realtime, job4, job5, facecolor='yellow')
plt.fill_between(realtime, job5, job6, facecolor='magenta')
# # plt.fill_between(x,y,t,facecolor="b")
plt.xlabel('Time(s)',fontsize=16)
plt.ylabel('Memory(G)',fontsize=16)
plt.xlim(0, 600)
plt.ylim(0, 62)
# plt.legend([plt1, plt2, plt3, plt4, plt5, plt6], ['job6', 'job5', 'job4', 'job3', 'job2', 'job1'])  # make legend
leg=plt.legend([plt1,plt2,plt3,plt4,plt5,plt6],['job6','job5','job4','job3','job2','job1'])
leg.get_frame().set_alpha(0.2)
plt.show()

上述代码(该代码源于我实现的Hadoop调度器模块中统计内存利用)可以用来画带填充的折线图,只是初步的python画图,至于一些坐标轴建立,多个子图的画法还没完全懂,后面继续研究。 上面程序的示意图如下: