最近須要對一些數據繪製函數圖,由於要求也不是很高,但願儘快出個圖看看,也懶得裝什麼專門的軟件,乾脆就用python的繪圖包matplotlib來作,方便快捷,畫出來的圖還不錯。下面簡單記錄一下。python
繪製圖形主要是兩步:1. 準備數據;2. 繪圖並顯示。如下是代碼,可很容易看到每一部分的功能linux
#!/usr/bin/env python # coding=utf-8 import platform import matplotlib from matplotlib.font_manager import * sysstr = platform.system() if(sysstr == "Windows"): # windows下中文字符處理 myfont = FontProperties(fname='C:\Windows\Fonts\simhei.ttf') #此處選合適的字體文件 else: # linux下中文字符處理 import sys reload(sys) sys.setdefaultencoding('utf-8') matplotlib.use('Agg') #若是在沒有安裝x11的服務器上,此句可輸出圖片並保存,不然可能報錯 myfont = FontProperties(fname='/usr/share/fonts/truetype/wqy/wqy-microhei.ttc') #此處選合適的字體文件 matplotlib.rcParams['axes.unicode_minus'] = False import matplotlib.pyplot as plt import numpy as np # 定義用到的變量 timebar = [] absolute = [] basevalue = 1000000.0 index = [] relativeMax = [] period = 30 idx = 0 #將變量從文件讀入,並放到合適的變量中 for line in open("pnl.txt",'r'): row = line.split('\t') timebar.append(int(row[0])) value = float(row[2])/basevalue absolute.append(value) if (idx % period == 0): #此處將該值進行週期性統計 index.append(idx) relativeMax.append(basevalue-min(absolute)) idx+=1 #畫圖 fig1 = plt.figure() plt.title("曲線",fontproperties=myfont) #整個座標圖的名稱 plt.xlabel('timebar') #x軸名稱 plt.ylabel('absolute') #y軸名稱 plt.plot(timebar,absolute) fig1.savefig("曲線.png") #保存圖片 plt.show() #顯示圖片 #將週期性統計結果寫入文件 with open("summary.txt",'w') as summaryFile: i = 0 for idx in index: output = "{0},{1:.2%},{2:.2%}\n".format(i,absolute[idx],relativeMax[i]) summaryFile.write(output) i+=1
其中,pnl.txt文件的形式以下:windows
1524096000 10000.154785 1010000.154785 1524182400 2988.606417 1012988.761203 1524268800 -3999.066491 1008989.694711 1524355200 -2212.860282 1006776.834429 ... ... ...
接下來看一個稍微複雜的例子服務器
# --*-- coding: utf-8 --*-- import os import numpy as np import time, datetime import math import matplotlib matplotlib.use('Agg') #import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdate """ 此處爲準備繪圖的數據用的代碼,略去 橫軸數據爲xxx(時間),縱軸數據有三組,分別是y1,y2,y3 如下代碼繪製雙y軸圖形,即不一樣曲線採用不一樣的y軸標記值 最終每幅圖上繪製三條曲線,y1和y2的讀數在左邊y軸,y3的讀數在右邊y軸 """ fig = plt.figure(figsize=(10.24,7.68)) # 設置圖片大小爲1024x768 x_start = 0 period = datetime.timedelta(days=30) # 按月繪製圖形 for idx in range(0, len(xxx)): if (xxx[idx] > xxx[x_start] + period): plt.xticks(xxx[x_start:idx-1:int((idx-1-x_start)/10)], rotation=30) # 設置x軸刻度間隔,而且將其旋轉30度,防止擠在一塊兒 ax1 = fig.add_subplot(1,1,1) # 在同一幅圖中增長子圖 ax1.xaxis.set_major_formatter(mdate.DateFormatter('%Y/%m/%d')) # 由於橫軸爲時間,設置時間顯示格式 ax1.plot(xxx[x_start:idx-1], y1[x_start:idx-1], 'g') ax1.plot(xxx[x_start:idx-1], y2[x_start:idx-1], 'b') ax1.set_ylabel('y1(green) or y2(blue)') ax2 = ax1.twinx() # 繪製雙y軸圖形的關鍵 ax2.plot(xxx[x_start:idx-1], y3[x_start:idx-1], 'r') ax2.set_ylabel('y3', color='red') filename = resultFile[0:-4] + "_" \ + xxx[x_start].strftime("%Y-%m-%d") + ".png" fig.savefig(filename) # 保存圖片 fig.clf() # 清除圖形,從新繪製 x_start = idx
繪製完成的圖片以下app