下面的案例是绘出交易收盘走势图
简单说明:整体代码分为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()
效果图如下: