利用matplotlib繪製圖形

最近須要對一些數據繪製函數圖,由於要求也不是很高,但願儘快出個圖看看,也懶得裝什麼專門的軟件,乾脆就用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

相關文章
相關標籤/搜索