本篇文章给大家分享的是有关Python可视化的折线图是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
摘要: 利用matplotlib绘制横轴为日期格式的折线图时,存在不少技巧。本文借助Tushare包返回的股票数据,介绍日期型折线图绘制的方法。
回顾:
Python数据处理分析(1):日期型数据处理
折线图绘制的数据源,采用Tushare包获取上市公司基本数据表,格式如下:
1import pandas as pd2data = pd.read('get_stock_basics.csv',encoding = 'utf8')3print(data.head())45ts_code symbol name list_status list_date is_hs6000001.SZ 1 平安银行 L 19910403 S7000002.SZ 2 万科A L 19910129 S8000004.SZ 4 国农科技 L 19910114 N9000005.SZ 5 世纪星源 L 19901210 N
然后利用resample
和to.period
方法汇总各年度的上市公司数量数据,格式为Pandas.Series数组。
1# 汇总各年上市公司数量 2data = data.set_index(['list_date']) 3data = data.resample('AS').count()['ts_code'] 4data = data.to_period('A') 5print(data.head()) 6print(data.tail()) 7# 结果如下: 8list_date 91990 7101991 4111992 37121993 106131994 9914...15list_date162014 124172015 223182016 227192017 438202018 78
首先,我们可以直接利用pandas的数组Series绘制折线图:
1import matplotlib.pyplot as plt 2plt.style.use('ggplot') # 设置绘图风格 3fig = plt.figure(figsize = (10,6)) # 设置图框的大小 4ax1 = fig.add_subplot(1,1,1) 5data.plot() # 绘制折线图 6 7# 设置标题及横纵坐标轴标题 8colors1 = '#6D6D6D' #设置标题颜色为灰色 9plt.title('历年中国内地上市公司数量变化',color = colors1,fontsize = 18)10plt.xlabel('年份')11plt.ylabel('数量(家)')12plt.show()
可以发现,图中存在两个问题:一是缺少数值标签,二是横坐标年份被自动分割了。我们希望能够添加上数值标签,然后坐标轴显示每一年的年份值。接下来,需要采用新的方法重新绘制折线图。
1# 创建x,y轴标签 2x = np.arange(0,len(data),1) 3 ax1.plot(x,data.values, #x、y坐标 4 color = '#C42022', #折线图颜色为红色 5 marker = 'o',markersize = 4 #标记形状、大小设置 6 ) 7ax1.set_xticks(x) # 设置x轴标签为自然数序列 8ax1.set_xticklabels(data.index) # 更改x轴标签值为年份 9plt.xticks(rotation=90) # 旋转90度,不至太拥挤1011for x,y in zip(x,data.values):12 plt.text(x,y + 10,'%.0f' %y,ha = 'center',color = colors1,fontsize = 10 )13 # '%.0f' %y 设置标签格式不带小数14# 设置标题及横纵坐标轴标题15plt.title('历年中国内地上市公司数量变化',color = colors1,fontsize = 18)16plt.xlabel('年份')17plt.ylabel('数量(家)')18# plt.savefig('stock.png',bbox_inches = 'tight',dpi = 300)19plt.show()
完善后的折线图如下:
可以看到,x轴逐年的数据都显示并且数值标签也添加上了。
上面介绍了一元折线图的绘制,当需要绘制多元折线图时,方法也很简单,只要重复绘图函数即可。这里我们以二元折线图为例,绘制国内两家知名地产公司万科和保利地产2017年的市值变化对比折线图。
数据源仍然采用tushare包的pro.daily_basic()
接口,该接口能够返回股票的每日股市数据,其中包括每日市值total_mv
。我们需获得的两只股票分别是万科地产(000002.SZ)和保利地产(600048.SH),下面就来获取两只股票2017年的市值数据。
1import tushare as ts 2ts.set_token('你的token') # 官网注册后可以获得 3pro = ts.pro_api() 4def get_stock(): 5 lst = [] 6 ts_codes = ['000002.SZ', '600048.SH'] 7 for ts_code in ts_codes: 8 data = pro.daily_basic( 9 ts_code=ts_code, start_date='20170101', end_date='20180101')10 print(lst)11 reutrn lst12 # 结果如下,total_mv为当日市值(万元):13 #万科地产数据14 ts_code trade_date close … total_mv circ_mv150 000002.SZ 20171229 31.06 … 3.43E+07 3.02E+07161 000002.SZ 20171228 30.7 … 3.39E+07 2.98E+07172 000002.SZ 20171227 30.79 … 3.40E+07 2.99E+07183 000002.SZ 20171226 30.5 … 3.37E+07 2.96E+07194 000002.SZ 20171225 30.37 … 3.35E+07 2.95E+072021 #保利地产数据22 ts_code trade_date close … total_mv circ_mv230 600048.SH 20171229 14.15 … 1.68E+07 1.66E+07241 600048.SH 20171228 13.71 … 1.63E+07 1.61E+07252 600048.SH 20171227 13.65 … 1.62E+07 1.60E+07263 600048.SH 20171226 13.85 … 1.64E+07 1.63E+07274 600048.SH 20171225 13.55 … 1.61E+07 1.59E+07
下面对数据作进一步修改,从DataFrame中提取total_mv列,index设置为日期,再利用resample和pd.to_period方法按月汇总市值数据。
1data['trade_date'] = pd.to_datetime(data['trade_date']) 2# 设置index为日期 3data = data.set_index(data['trade_date']).sort_index(ascending=True) 4# 按月汇总和显示 5data = data.resample('m') 6data = data.to_period() 7# 市值改为亿元 8market_value = data['total_mv']/10000 910# 二者结果分别如下,万科地产:112017-01 2291.973270122017-02 2286.331037132017-03 2306.894790142017-04 2266.337906152017-05 2131.053098162017-06 2457.716659172017-07 2686.982164182017-08 2524.462077192017-09 2904.085487202017-10 2976.999550212017-11 3263.374043222017-12 3317.10747423# 保利地产:242017-01 1089.008286252017-02 1120.023350262017-03 1145.731640272017-04 1153.760435282017-05 1108.230609292017-06 1157.276044302017-07 1244.966905312017-08 1203.580209322017-09 1290.706606332017-10 1244.438756342017-11 1336.661916352017-12 1531.150616
利用上面的Series数据就可以作图了。
1# 设置绘图风格 2plt.style.use('ggplot') 3fig = plt.figure(figsize = (10,6)) 4colors1 = '#6D6D6D' #标题颜色 5 6# data1万科,data2保利 7data1 = lst[0] 8data2 = lst[1] 9# 绘制第一条折线图10data1.plot(11color = '#C42022', #折线图颜色12marker = 'o',markersize = 4, #标记形状、大小设置13label = '万科'14)15# 绘制第二条折线图16data2.plot(17color = '#4191C0', #折线图颜色18marker = 'o',markersize = 4, #标记形状、大小设置19label = '保利'20)21# 还可以绘制更多条22# 设置标题及横纵坐标轴标题23plt.title('2017年万科与保利地产市值对比',color = colors1,fontsize = 18)24plt.xlabel('月份')25plt.ylabel('市值(亿元)')26plt.savefig('stock1.png',bbox_inches = 'tight',dpi = 300)27plt.legend() # 显示图例28plt.show()
绘图结果如下:
如果想添加数值标签,则可以使用下面的代码:
1# 绘制第一条折线图 2# 创建x,y轴标签 3x = np.arange(0,len(data1),1) 4ax1.plot(x,data1.values, #x、y坐标 5color = '#C42022', #折线图颜色红色 6marker = 'o',markersize = 4, #标记形状、大小设置 7label = '万科' 8) 9ax1.set_xticks(x) # 设置x轴标签10ax1.set_xticklabels(data1.index) # 设置x轴标签值11# plt.xticks(rotation=90)12for x,y in zip(x,data1.values):13 plt.text(x,y + 10,'%.0f' %y,ha = 'center',color = colors1,fontsize = 10 )14 # '%.0f' %y 设置标签格式不带小数1516# 绘制第二条折线图17x = np.arange(0,len(data2),1)1819ax1.plot(x,data2.values, #x、y坐标20color = '#4191C0', #折线图颜色蓝色21marker = 'o',markersize = 4, #标记形状、大小设置22label = '保利'23)24ax1.set_xticks(x) # 设置x轴标签25ax1.set_xticklabels(data2.index) # 设置x轴标签值26# plt.xticks(rotation=90)27for x,y in zip(x,data2.values):28 plt.text(x,y + 10,'%.0f' %y,ha = 'center',color = colors1,fontsize = 10 )29 # '%.0f' %y 设置标签格式不带小数3031# 设置标题及横纵坐标轴标题32plt.title('2017年万科与保利地产市值对比',color = colors1,fontsize = 18)33plt.xlabel('月份')34plt.ylabel('市值(亿元)')3536plt.savefig('stock1.png',bbox_inches = 'tight',dpi = 300)37plt.legend() # 显示图例38plt.show()
结果如下图所示:
可以看到,两只股票市值从2017年初开始一直在上涨,万科的市值是保利的2倍左右。
以上就是Python可视化的折线图是怎样的,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:http://blog.itpub.net/69900353/viewspace-2222530/