下面的案例是繪出交易收盤走勢圖
簡單說明:整體代碼分為5個函數,最后給出了最后兩個函數運行的效果圖。前面每個函數都為下面的函數做准備。
函數btc_close_2017()、btc_close_2017_01()、btc_close_2017_02()函數為了顯示數據
函數btc_close_2017_03()、btc_close_2017_04()可視化數據
繪圖用到的函數以及參數說明未單獨列出都在程序里注釋說明。
整體代碼如下:
1 #交易收盤走勢圖:JSON格式 2 from __future__ import (absolute_import,division,print_function,unicode_literals) 3 import requests 4 5 def btc_close_2017(): 6 #實現兼容python 2.x和3.x的版本,要用到urlopen函數 7 try: 8 from urllib2 import urlopen 9 except ImportError: 10 from urllib.request import urlopen 11 12 導入json模塊 13 import json 14 15 json_url = "https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json" 16 #調用requests.get()方法向github服務器發送請求,返回結果存儲在req中 17 req = requests.get(json_url) 18 # 將數據寫入文件 19 with open('btc_close_2017_request.json','w') as f: 20 #req.text屬性可以直接讀取文件數據,返回格式為字符串 21 f.write(req.text) 22 #直接調用req.json就可將btc_close_2017.json文件轉換成python列表file_request 23 file_request = req.json 24 """ 25 response = urlopen(json_url) 26 req = response.read() 27 28 with open("btc_close_2017_urllib.json",'wb') as f: 29 f.write(req) 30 file_urllib = json.loads(req) 31 print(file_urllib) 32 """ 33 print(req.text) 34 35 import json 36 37 def btc_close_2017_01(): 38 filename = "btc_close_2017.json" 39 with open(filename) as f: 40 btc_data = json.load(f) 41 for btc_dict in btc_data: 42 date = btc_dict['date'] 43 month = btc_dict['month'] 44 week = btc_dict['week'] 45 weekday = btc_dict['weekday'] 46 close = btc_dict['close'] 47 print ("{} is month {} week{},{},the close price is {}RMB".format(date,month,week,weekday,close)) 48 49 # 將字符轉化為數字 50 def btc_close_2017_02(): 51 filename = "btc_close_2017.json" 52 with open(filename) as f: 53 btc_data = json.load(f) 54 for btc_dict in btc_data: 55 date = btc_dict['date'] 56 month = int(btc_dict['month']) 57 week = int(btc_dict['week']) 58 weekday = btc_dict['weekday'] 59 close = int(float(btc_dict['close'])) 60 print ("{} is month {} week{},{},the close price is {}RMB".format(date,month,week,weekday,close)) 61 62 import pygal 63 # 繪制收盤價折線圖 64 def btc_close_2017_03(): 65 filename = "btc_close_2017.json" 66 with open(filename) as f: 67 btc_data = json.load(f) 68 dates = [] 69 month = [] 70 week = [] 71 weekday = [] 72 close = [] 73 for btc_dict in btc_data: 74 dates.append(btc_dict['date']) 75 month.append(int(btc_dict['month'])) 76 week.append(int(btc_dict['week'])) 77 weekday.append(btc_dict['weekday']) 78 close.append(int(float(btc_dict['close']))) 79 80 line_chart = pygal.Line(x_label_rotation=20,show_minor_x_labels=False) 81 line_chart.title = "收盤價(¥)" 82 line_chart.x_labels = dates 83 N = 20 84 line_chart.x_labels_major = dates[::N] 85 line_chart.add("收盤價",close) 86 line_chart.render_to_file('收盤價折線圖.svg') 87 88 89 import math 90 #導入python標准庫中模塊itertools的函數groupby 91 from itertools import groupby 92 #計算收盤價均值 93 def draw_line(x_data,y_data,title,y_legend): 94 xy_map = [] 95 #將x軸,y軸數據合並排序再用groupby分組,分組之后求出均值 96 for x,y in groupby(sorted(zip(x_data,y_data)),key = lambda _:_[0]): 97 y_list = [v for _,v in y] 98 xy_map.append([x,sum(y_list)/len(y_list)]) 99 #將xy_map中x軸,y軸數據分離 100 x_unique,y_mean = [*zip(*xy_map)] 101 #實例化折線圖對象並畫圖 102 line_chart = pygal.Line() 103 line_chart.title = title 104 line_chart.x_labels = x_unique 105 line_chart.add(y_legend,y_mean) 106 line_chart.render_to_file(title+".svg") 107 return line_chart 108 109 def btc_close_2017_04(): 110 filename = "btc_close_2017.json" 111 with open(filename) as f: 112 btc_data = json.load(f) 113 dates = [] 114 month = [] 115 week = [] 116 weekday = [] 117 close = [] 118 for btc_dict in btc_data: 119 dates.append(btc_dict['date']) 120 month.append(int(btc_dict['month'])) 121 week.append(int(btc_dict['week'])) 122 weekday.append(btc_dict['weekday']) 123 close.append(int(float(btc_dict['close']))) 124 125 #x軸日期標簽旋轉20度,不用顯示x軸所有標簽 126 line_chart = pygal.Line(x_label_rotation=20,show_minor_x_labels=False) 127 line_chart.title = "收盤價對數變換(¥)" 128 line_chart.x_labels = dates 129 #x軸每隔20天顯示一次 130 N = 20 131 line_chart.x_labels_major = dates[::N] 132 #利用對數變換剔除非線性趨勢之后,整體上漲更接近線性增長 133 close_log = [math.log10(_) for _ in close] 134 line_chart.add("log收盤價",close_log) 135 line_chart.render_to_file('收盤價對數變換折線圖.svg') 136 137 # 收盤價月日均圖 138 idx_month = dates.index('2017-12-01') 139 line_chart_month = draw_line(month[:idx_month],close[:idx_month],'收盤價月日均圖','月日均值') 140 141 142 btc_close_2017_04() 143 """ 144 btc_close_2017_03() 145 btc_close_2017_02() 146 btc_close_2017_01() 147 """
收盤價折線圖如下:
收盤價對數變換折線圖如下:
收盤價月日均圖如下:
天氣變化折線圖程序如下(程序所用函數以及參數含義在注釋中已說明):
1 import csv 2 from matplotlib import pyplot as plt 3 from datetime import datetime 4 5 # filename = 'sitka_weather_07-2014.csv' 6 #要讀取的文件 7 filename = 'sitka_weather_2014.csv' 8 9 #打開文件並將文件結果對象存儲到f中 10 with open(filename) as f: 11 #創建一個與該文件相關聯的閱讀器(reader)對象,reader處理文件中以逗號分隔每一行的數據 12 reader = csv.reader(f) 13 #模塊csv包含函數next(),將閱讀器對象傳遞給它將返回文件的下一行 14 headr_row = next(reader) 15 16 dates,highs,lows = [],[],[] 17 for row in reader: 18 #datetime.strptime()設置時間日期 19 current_date = datetime.strptime(row[0],"%Y-%m-%d") 20 dates.append(current_date) 21 22 high = int(row[1]) 23 highs.append(high) 24 25 low = int(row[3]) 26 lows.append(low) 27 28 # 數據可視化 29 fig = plt.figure(dpi=128,figsize=(10,6)) 30 #紅色顯示最高氣溫,藍色顯示最低氣溫 31 plt.plot(dates,highs,c='red') 32 plt.plot(dates,lows,c = 'blue') 33 #向fill_between()函數傳遞一個x值:dates 兩個y值:highs,lows 中間填充色:blue 透明度:0.5 34 plt.fill_between(dates,highs,lows,facecolor = 'blue',alpha=0.5) 35 36 #設置圖形的格式 37 plt.title("Daily hight temperatures,July 2014",fontsize=10) 38 plt.xlabel('',fontsize=5) 39 #來繪制斜的日期標簽 40 fig.autofmt_xdate() 41 plt.ylabel("Temperature(F)",fontsize = 10) 42 plt.tick_params(axis='both',which='major',labelsize = 10) 43 plt.show()
效果圖如下: