Matplotlib
Matplotlib是一个强大的Python绘图和数据可视化的工具包
安装:pip install matplotlib
引用:import matplotlib.pyplot as plt
绘图函数:plt.plot()
显示图像:plt.show()
In [4]: import matplotlib.pyplot as plt In [5]: plt.plot([1,2,3,4],[2,1,7,6]) Out[5]: [<matplotlib.lines.Line2D at 0x1caf8fd0>] In [6]: plt.show()
Matplotlib-plot函数
plot函数:绘制点图或线图
- 线性linestyle (-, -., --, ..)
- 点型marker (v, ^, s, H, +, x, D, o等)
- 颜色color (b,g,r,y,k,w等)
In [8]: plt.plot([1,2,3,4],[2,1,7,6]) #实线折线图 Out[8]: [<matplotlib.lines.Line2D at 0xb98bd30>] In [9]: plt.show() In [10]: plt.plot([1,2,3,4],[2,1,7,6],'o--') #圆点虚线折线图 Out[10]: [<matplotlib.lines.Line2D at 0xb921930>] In [11]: plt.show() In [12]: plt.plot([1,2,3,4],[2,1,7,6],'o--y') #圆点虚线黄色折线图 Out[12]: [<matplotlib.lines.Line2D at 0xba9d530>] In [13]: plt.show() In [14]: plt.plot([1,2,3,4],[2,1,7,6],color='red') #红线折线图 Out[14]: [<matplotlib.lines.Line2D at 0x6dc3a10>] In [15]: plt.show()
show多条线,如果show之前设置多条线,那么此时调用就会show这一组线
In [21]: plt.plot([1,2,3,4],[7,5,8,9],color='red') Out[21]: [<matplotlib.lines.Line2D at 0xb8d82b0>] In [22]: plt.plot([1,2,3,4],[2,1,7,6],color='black',marker='o') Out[22]: [<matplotlib.lines.Line2D at 0xb8d4c70>] In [23]: plt.show()
Matplotlib-图像标注
- 设置图像标题 plt.title()
- 设置x轴名称 plt.xlabel()
- 设置y轴名称 plt.ylabel()
- 设置x轴范围 plt.xlim()
- 设置y轴范围 plt.ylim()
- 设置x轴刻度 plt.xticks()
- 设置y轴刻度 plt.yticks()
- 设置曲线图例 plt.legend()
In [39]: plt.plot([1,2,3,4],[2,1,7,6], color='black', marker='o')
Out[39]: [<matplotlib.lines.Line2D at 0x17bb7f98>]
In [40]: plt.plot([1,2,3,4],[7,5,8,9], color='red')
Out[40]: [<matplotlib.lines.Line2D at 0x17c07940>]
In [41]: plt.title('test title')
Out[41]: Text(0.5, 1.0, 'test title')
In [42]: plt.xlabel('x zhou title')
Out[42]: Text(0.5, 0, 'x zhou title')
In [43]: plt.ylabel('y zhou title')
Out[43]: Text(0, 0.5, 'y zhou title')
In [44]: plt.xlim(0,6)
Out[44]: (0, 6)
In [45]: plt.ylim(0,10)
Out[45]: (0, 10)
In [46]: plt.show()

指定刻度名
In [47]: plt.plot([1,2,3,4],[2,1,7,6], color='black', marker='o') Out[47]: [<matplotlib.lines.Line2D at 0x17befdd8>] In [48]: plt.plot([1,2,3,4],[7,5,8,9], color='red') Out[48]: [<matplotlib.lines.Line2D at 0x1a934710>] In [50]: plt.xticks(np.arange(0,5,2), ['a','b']) #刻度范围为一个可迭代的数据,规定刻度间距,其中第二个列表为指定刻度名称,在柱状图用常用 Out[50]: ([<matplotlib.axis.XTick at 0x1aa18438>, <matplotlib.axis.XTick at 0x1a9a5d30>, <matplotlib.axis.XTick at 0x1a9a5a58>], <a list of 2 Text xticklabel objects>) In [51]: plt.show()

增加图例
In [52]: plt.plot([1,2,3,4],[2,1,7,6], color='black', marker='o',label='Line A') Out[52]: [<matplotlib.lines.Line2D at 0x1aa49320>] In [53]: plt.plot([1,2,3,4],[7,5,8,9], color='red', label='Line B') Out[53]: [<matplotlib.lines.Line2D at 0x1ab10898>] In [54]: plt.legend() Out[54]: <matplotlib.legend.Legend at 0x1ab55400> In [55]: plt.show()

pandas与Matplotlib结合
In [56]: df = pd.read_csv('111.csv', parse_dates=['date'], index_col='date')[['open','close','high','low']]
In [57]: df.plot()
Out[57]: <matplotlib.axes._subplots.AxesSubplot at 0x1abf1860>
In [58]: plt.show()

Matplotlib-画布与图
上面的画的都是单图,如果想呈现多个图进行对比,那么就要用画布了,画布你就想象成一块黑板,然后把这块分割成多个区域,每个区域内都画个图,在这里叫子图
- 画布:figure fig = plt.figure()
- 图: subplot ax1 = fig.add_subplot(2,2,1)
- 调节子图间距:subplots_adjust(left, bottom, right,top), wspace, hspace)
In [20]: fig = plt.figure() In [21]: ax1 = fig.add_subplot(2,2,1) #分成两行两列 占第一份 In [22]: ax1.plot([1,2,3,4],[5,6,7,8]) #给第一张图加数据 Out[22]: [<matplotlib.lines.Line2D at 0x32bdd10>] In [23]: ax2 = fig.add_subplot(2,2,3) #占第三份 In [24]: fig.show()

In [29]: fig = plt.figure() In [30]: ax1 = fig.add_subplot(2,1,1) #分成两行一列 占第一份 In [31]: ax2 = fig.add_subplot(2,1,2) #占第二份 In [32]: fig.show()

柱状图 plt.bar()
In [83]: data = [32, 48, 21, 100] In [84]: labels = ['Jan', 'Feb', 'Mar', 'Apr'] In [85]: plt.bar(np.arange(len(data)), data, color='red') Out[85]: <BarContainer object of 4 artists> In [86]: plt.xticks(np.arange(len(data)), labels) Out[86]: ([<matplotlib.axis.XTick at 0x1b97a390>, <matplotlib.axis.XTick at 0x1c4b3d68>, <matplotlib.axis.XTick at 0x1c4b3358>, <matplotlib.axis.XTick at 0x1c5062e8>], <a list of 4 Text xticklabel objects>) In [87]: plt.show()

饼图 plt.pie()
- labels 每块饼的名称
- autopct 按照格式显示数据
- explode 突出某块饼
In [39]: plt.pie([10,20,30,40],labels=['a','b','c','d'],autopct='%.2f%%',explode=[0,0,0.1,0])
Out[39]:
([<matplotlib.patches.Wedge at 0x109d2970>,
<matplotlib.patches.Wedge at 0x109d2430>,
<matplotlib.patches.Wedge at 0x109d21b0>,
<matplotlib.patches.Wedge at 0x32a8b10>],
[Text(1.04616,0.339919,'a'),
Text(0.339919,1.04616,'b'),
Text(-1.14127,0.37082,'c'),
Text(0.339919,-1.04616,'d')],
[Text(0.570634,0.18541,'10.00%'),
Text(0.18541,0.570634,'20.00%'),
Text(-0.66574,0.216312,'30.00%'),
Text(0.18541,-0.570634,'40.00%')])
In [40]: plt.axis('equal') #让饼图平铺 不是斜的
Out[40]:
(-1.2128537683838656,
1.105374020036155,
-1.1179348077041187,
1.1179347975732619)
In [41]: plt.show()

k线图
matplotlib.finanace子包有许多绘制金融相关图的函数接口(如果matplotlib模块没有finance,可以下载这个mpl_finance)
绘制k线图:matplotlib.finanace.candlestick_ochl函数

- ax 画布子图实例
- quotes 序列(时间,开,关,高,低,…)的值,其中时间必须是date2num类型,from matplotlib.dates import date2num
In [21]: import matplotlib.pyplot as plt
In [22]: import mpl_finance as fin
#用于把dataframe对象里的时间对象转换成python的时间对象
In [23]: from matplotlib.dates import date2num
In [24]: df = pd.read_csv('111.csv',parse_dates=['date'], index_col=['date'])[['open','close','high','low']]
In [25]: df
Out[25]:
open close high low
date
2016-03-08 29.022 29.321 29.368 28.094
2016-03-09 28.872 29.396 29.462 28.347
2016-03-10 29.022 28.797 29.312 28.759
2016-03-11 28.638 29.078 29.134 28.544
2016-03-14 29.031 29.143 29.574 28.947
2016-03-15 29.087 29.378 29.499 28.712
2016-03-16 29.134 30.099 30.221 29.087
2016-03-17 30.071 29.977 30.324 29.865
2016-03-18 30.277 30.090 30.371 29.865
2016-03-21 30.343 30.755 31.663 30.202
2016-03-22 30.586 30.071 30.951 29.977
2016-03-23 30.249 30.221 30.689 30.052
2016-03-24 30.043 29.790 30.061 29.743
2016-03-25 29.799 30.033 30.727 29.640
2016-03-28 30.071 29.471 30.305 29.368
2016-03-29 29.612 29.275 29.752 29.172
2016-03-30 29.602 29.968 30.033 29.527
2016-03-31 30.061 29.799 30.146 29.705
2016-04-01 29.818 29.902 29.940 29.237
2016-04-05 29.696 29.977 30.165 29.509
2016-04-06 29.771 29.734 29.940 29.640
2016-04-07 29.874 29.387 29.940 29.378
2016-04-08 29.228 29.190 29.293 29.078
2016-04-11 29.340 29.518 29.827 29.340
2016-04-12 29.499 29.556 29.743 29.415
2016-04-13 29.790 29.893 30.221 29.715
2016-04-14 30.052 29.996 30.333 29.865
2016-04-15 30.005 29.968 30.071 29.865
2016-04-18 29.790 29.780 30.061 29.518
2016-04-19 29.977 29.912 30.015 29.743
... ... ... ... ...
2018-09-03 61.980 62.109 62.376 61.495
2018-09-04 62.228 64.159 64.287 61.921
2018-09-05 63.772 62.178 64.000 62.178
2018-09-06 62.100 61.320 62.520 61.010
2018-09-07 61.880 62.780 63.500 61.600
2018-09-10 62.600 62.030 62.870 61.600
2018-09-11 62.000 61.680 62.580 61.250
2018-09-12 61.310 60.600 61.460 60.280
2018-09-13 61.780 62.400 62.400 61.010
2018-09-14 62.570 63.300 63.760 62.420
2018-09-17 62.300 62.510 63.180 62.250
2018-09-18 62.150 64.120 64.300 62.100
2018-09-19 64.090 65.150 65.800 63.810
2018-09-20 65.200 64.800 65.560 64.610
2018-09-21 65.280 67.490 67.500 64.970
2018-09-25 66.900 67.190 67.730 66.480
2018-09-26 67.230 67.960 69.000 66.830
2018-09-27 67.730 67.200 67.750 66.860
2018-09-28 67.500 68.500 69.100 67.440
2018-10-08 66.800 64.780 66.840 64.710
2018-10-09 64.630 65.000 65.380 64.330
2018-10-10 65.090 64.650 65.580 64.200
2018-10-11 62.100 61.850 63.200 61.380
2018-10-12 62.500 63.870 64.250 62.300
2018-10-15 63.900 63.200 64.440 63.090
2018-10-16 63.350 64.000 65.180 63.330
2018-10-17 65.170 64.160 65.320 62.410
2018-10-18 63.490 62.450 63.520 62.250
2018-10-19 61.990 65.620 66.100 61.880
2018-10-22 66.010 66.990 67.650 65.620
[641 rows x 4 columns]
#由于构筑蜡烛图的时候,第二参数必须要转入一个列表,列表第一个为是时间,而且必须要求为python里的时间戳对象
In [26]: df['time'] = date2num(df.index.to_pydatetime()) #series对象不支持转成时间戳对象,而索引可以
In [27]: df
Out[27]:
open close high low time
date
2016-03-08 29.022 29.321 29.368 28.094 736031.0
2016-03-09 28.872 29.396 29.462 28.347 736032.0
2016-03-10 29.022 28.797 29.312 28.759 736033.0
2016-03-11 28.638 29.078 29.134 28.544 736034.0
2016-03-14 29.031 29.143 29.574 28.947 736037.0
2016-03-15 29.087 29.378 29.499 28.712 736038.0
2016-03-16 29.134 30.099 30.221 29.087 736039.0
2016-03-17 30.071 29.977 30.324 29.865 736040.0
2016-03-18 30.277 30.090 30.371 29.865 736041.0
2016-03-21 30.343 30.755 31.663 30.202 736044.0
2016-03-22 30.586 30.071 30.951 29.977 736045.0
2016-03-23 30.249 30.221 30.689 30.052 736046.0
2016-03-24 30.043 29.790 30.061 29.743 736047.0
2016-03-25 29.799 30.033 30.727 29.640 736048.0
2016-03-28 30.071 29.471 30.305 29.368 736051.0
2016-03-29 29.612 29.275 29.752 29.172 736052.0
2016-03-30 29.602 29.968 30.033 29.527 736053.0
2016-03-31 30.061 29.799 30.146 29.705 736054.0
2016-04-01 29.818 29.902 29.940 29.237 736055.0
2016-04-05 29.696 29.977 30.165 29.509 736059.0
2016-04-06 29.771 29.734 29.940 29.640 736060.0
2016-04-07 29.874 29.387 29.940 29.378 736061.0
2016-04-08 29.228 29.190 29.293 29.078 736062.0
2016-04-11 29.340 29.518 29.827 29.340 736065.0
2016-04-12 29.499 29.556 29.743 29.415 736066.0
2016-04-13 29.790 29.893 30.221 29.715 736067.0
2016-04-14 30.052 29.996 30.333 29.865 736068.0
2016-04-15 30.005 29.968 30.071 29.865 736069.0
2016-04-18 29.790 29.780 30.061 29.518 736072.0
2016-04-19 29.977 29.912 30.015 29.743 736073.0
... ... ... ... ... ...
2018-09-03 61.980 62.109 62.376 61.495 736940.0
2018-09-04 62.228 64.159 64.287 61.921 736941.0
2018-09-05 63.772 62.178 64.000 62.178 736942.0
2018-09-06 62.100 61.320 62.520 61.010 736943.0
2018-09-07 61.880 62.780 63.500 61.600 736944.0
2018-09-10 62.600 62.030 62.870 61.600 736947.0
2018-09-11 62.000 61.680 62.580 61.250 736948.0
2018-09-12 61.310 60.600 61.460 60.280 736949.0
2018-09-13 61.780 62.400 62.400 61.010 736950.0
2018-09-14 62.570 63.300 63.760 62.420 736951.0
2018-09-17 62.300 62.510 63.180 62.250 736954.0
2018-09-18 62.150 64.120 64.300 62.100 736955.0
2018-09-19 64.090 65.150 65.800 63.810 736956.0
2018-09-20 65.200 64.800 65.560 64.610 736957.0
2018-09-21 65.280 67.490 67.500 64.970 736958.0
2018-09-25 66.900 67.190 67.730 66.480 736962.0
2018-09-26 67.230 67.960 69.000 66.830 736963.0
2018-09-27 67.730 67.200 67.750 66.860 736964.0
2018-09-28 67.500 68.500 69.100 67.440 736965.0
2018-10-08 66.800 64.780 66.840 64.710 736975.0
2018-10-09 64.630 65.000 65.380 64.330 736976.0
2018-10-10 65.090 64.650 65.580 64.200 736977.0
2018-10-11 62.100 61.850 63.200 61.380 736978.0
2018-10-12 62.500 63.870 64.250 62.300 736979.0
2018-10-15 63.900 63.200 64.440 63.090 736982.0
2018-10-16 63.350 64.000 65.180 63.330 736983.0
2018-10-17 65.170 64.160 65.320 62.410 736984.0
2018-10-18 63.490 62.450 63.520 62.250 736985.0
2018-10-19 61.990 65.620 66.100 61.880 736986.0
2018-10-22 66.010 66.990 67.650 65.620 736989.0
[641 rows x 5 columns]
In [28]: fig = plt.figure()
In [29]: ax = fig.add_subplot(1,1,1) #创建子图实例,传入第一参数
In [30]: arr = df[['time','open','close','high','low']].values #获取序列化值,传入第二参数
In [31]: fin.candlestick_ochl(ax,arr) #把子图和数据传入
In [33]: fig.show()

tushare介绍-财经数据获取
一个自动获取财经数据的模块,需要下载pandas requests beautifulsoup4模块才能使用
获取到数据就是df对象
使用指南 http://tushare.org/
pip install tushare
In [1]: import tushare as ts
In [2]: ts.get_k_data('601318')
Out[2]:
date open close high low volume code
0 2015-08-07 31.956 32.483 32.819 31.774 1524162.0 601318
1 2015-08-10 32.589 33.634 33.969 32.177 2198393.0 601318
2 2015-08-11 33.451 33.423 34.209 33.260 1664871.0 601318
3 2015-08-12 33.068 32.388 33.317 32.368 1333463.0 601318
4 2015-08-13 32.311 32.656 32.857 32.110 1100029.0 601318
5 2015-08-14 32.761 32.483 32.838 32.397 1155956.0 601318
6 2015-08-17 32.023 31.602 32.100 31.247 1521704.0 601318
7 2015-08-18 31.659 29.991 32.234 29.943 2103894.0 601318
8 2015-08-19 29.665 30.106 30.327 29.234 1614533.0 601318
9 2015-08-20 29.713 29.282 30.097 29.253 1098640.0 601318
10 2015-08-21 29.196 28.170 29.857 28.084 2058581.0 601318
11 2015-08-24 27.308 25.352 27.317 25.352 4032962.0 601318
12 2015-08-25 24.250 24.068 26.407 23.627 4316161.0 601318
13 2015-08-26 24.154 25.266 26.167 24.077 3826691.0 601318
14 2015-08-27 26.263 27.796 27.796 25.851 3939984.0 601318
15 2015-08-28 28.276 28.419 29.129 27.595 3319339.0 601318
16 2015-08-31 27.662 29.033 29.090 27.336 2894666.0 601318
17 2015-09-01 28.304 28.908 28.927 27.461 3690911.0 601318
18 2015-09-02 27.940 28.736 28.985 27.825 3735058.0 601318
19 2015-09-07 28.419 27.681 29.023 27.413 1363133.0 601318
20 2015-09-08 27.662 28.525 28.630 27.662 1255286.0 601318
21 2015-09-09 28.793 29.141 29.565 28.552 1430501.0 601318
22 2015-09-10 29.006 29.189 29.276 28.745 878888.0 601318
23 2015-09-11 29.083 28.774 29.382 28.552 708262.0 601318
24 2015-09-14 28.900 29.063 29.121 27.704 2206746.0 601318
25 2015-09-15 28.543 28.408 28.726 27.964 1183297.0 601318
26 2015-09-16 28.282 29.459 30.057 28.032 1148146.0 601318
27 2015-09-17 29.401 29.179 30.066 29.025 1016069.0 601318
28 2015-09-18 29.333 29.478 29.989 29.276 856438.0 601318
29 2015-09-21 29.131 29.854 30.037 28.977 810319.0 601318
.. ... ... ... ... ... ... ...
610 2018-02-05 74.400 75.710 75.950 74.300 948054.0 601318
611 2018-02-06 73.850 73.770 74.700 72.500 2049666.0 601318
612 2018-02-07 74.600 71.380 74.650 70.500 1747840.0 601318
613 2018-02-08 70.610 68.990 71.500 68.370 1530108.0 601318
614 2018-02-09 66.500 64.430 66.970 62.200 2492029.0 601318
615 2018-02-12 64.660 64.960 65.650 64.000 1029611.0 601318
616 2018-02-13 66.200 67.020 68.350 66.060 1147957.0 601318
617 2018-02-14 67.500 68.890 69.190 67.200 646501.0 601318
618 2018-02-22 70.230 69.770 70.420 69.230 783649.0 601318
619 2018-02-23 70.250 70.640 71.460 69.830 556011.0 601318
620 2018-02-26 70.990 70.800 71.580 69.600 693840.0 601318
621 2018-02-27 71.020 69.810 71.190 69.470 780994.0 601318
622 2018-02-28 69.200 67.760 69.240 67.700 782170.0 601318
623 2018-03-01 67.180 68.930 69.380 66.880 663296.0 601318
624 2018-03-02 68.000 67.680 68.660 67.450 581439.0 601318
625 2018-03-05 67.660 67.880 68.590 67.000 609823.0 601318
626 2018-03-06 68.400 69.320 69.390 67.400 657077.0 601318
627 2018-03-07 68.980 68.780 70.180 68.180 590555.0 601318
628 2018-03-08 69.060 70.540 70.840 68.760 692681.0 601318
629 2018-03-09 71.000 70.890 71.460 70.310 476222.0 601318
630 2018-03-12 71.600 71.120 71.860 70.600 583351.0 601318
631 2018-03-13 71.200 69.420 71.350 69.180 609492.0 601318
632 2018-03-14 68.850 68.820 69.200 68.260 514760.0 601318
633 2018-03-15 68.410 70.490 70.700 68.400 627110.0 601318
634 2018-03-16 70.700 70.510 71.950 70.450 701326.0 601318
635 2018-03-19 70.890 73.810 73.880 70.480 924499.0 601318
636 2018-03-20 73.100 74.090 74.190 72.700 659778.0 601318
637 2018-03-21 76.700 73.820 76.710 73.030 1367485.0 601318
638 2018-03-22 73.510 72.880 74.170 71.680 902877.0 601318
639 2018-03-23 70.000 70.300 70.770 69.420 1486954.0 601318
[640 rows x 7 columns]

浙公网安备 33010602011771号