简介
Pandas自身也提供了作图的
plot() 方法,可以作各种图形。本文将详细介绍如何使用Pandas直接作一些常规的图。
折线图
控制作图的类型在
DataFrame.plot() 方法里:
DataFrame.plot(x=None, y=None, kind='line', ax=None, subplots=False, sharex=None, sharey=False,
layout=None, figsize=None, use_index=True, title=None, grid=None, legend=True,
style=None, logx=False, logy=False, loglog=False, xticks=None, yticks=None, xlim=None,
ylim=None, rot=None, fontsize=None, colormap=None, table=False, yerr=None, xerr=None,
secondary_y=False, sort_columns=False, **kwds)
1
2
3
4
5
DataFrame.plot(x=None,y=None,kind='line',ax=None,subplots=False,sharex=None,sharey=False,
layout=None,figsize=None,use_index=True,title=None,grid=None,legend=True,
style=None,logx=False,logy=False,loglog=False,xticks=None,yticks=None,xlim=None,
ylim=None,rot=None,fontsize=None,colormap=None,table=False,yerr=None,xerr=None,
secondary_y=False,sort_columns=False,**kwds)
可以看出DataFrame的中的
plot() 方法是一个非常高级的API,可调节的参数非常多、使用非常灵活,这也是pandas作为数据处理工具的强大体现。通过参数
x 和
y 能够指定作图的横纵轴;通过
kind 参数指定需要的图形,这个参数可以选择的值有:
‘line’ : 直线图 (默认)
‘bar’ : 垂直条形图
‘barh’ : 水平条形图
‘hist’ : 直方图
‘box’ : 箱型图
‘kde’ : 核密度估计图
‘density’ : 与核密度估计图类似
‘area’ : 区域图
‘pie’ : 饼图
‘scatter’ : 散点图
‘hexbin’ : 六边形分箱图
值得注意的是,在新版本的pandas中也可以使用诸如
plot.line() 方法调用相关的作图方法了。
直接来看一个例子:
# 导入需要的库
>>>import pandas as pd
>>>import numpy as np
>>>import matplotlib.pyplot as plt
# 定义一个DataFrame
>>>df = pd.DataFrame(np.random.randn(100, 3), columns=['A', 'B', 'C'])
>>>df.cumsum() #累积求和
A B C
0 -1.390429 0.301102 -0.659243
1 -0.195243 -0.825847 -0.068817
2 -0.334314 -0.575144 -1.146362
3 0.564307 0.073548 1.419107
4 -0.323652 0.779866 0.820501
5 0.731471 2.392268 1.674016
6 -0.358689 -0.731527 -0.380429
7 -0.819928 0.238729 0.865254
8 0.243721 1.317133 0.743984
9 -0.214877 0.663440 0.800653
10 -0.793498 0.164130 -0.839115
11 -0.398866 -1.517121 0.788057
12 0.744834 0.543415 0.462570
13 1.174500 -0.302651 0.388262
14 -0.683200 2.075280 1.141336
15 0.662582 -0.358390 -0.057708
16 0.326971 0.978013 0.034560
17 -0.148488 -0.170256 1.429408
18 0.772321 0.393312 0.248589
19 -0.720161 1.323384 -1.482325
20 0.051985 0.354218 -1.139217
21 -0.795822 0.570917 1.064519
22 0.677833 -0.763512 -0.255530
23 2.369977 1.124230 0.283023
24 0.710186 0.384634 -0.426938
25 -0.417719 -1.153202 0.769669
26 -0.010357 1.237234 -1.572733
27 1.469757 0.120891 -1.507504
28 -0.024829 -1.022276 -1.009701
29 0.693116 -0.620743 0.913808
.. ... ... ...
70 1.045025 1.280145 1.523409
71 -0.921893 -0.683112 -0.525018
72 -1.458108 0.917679 -0.728754
73 1.966492 0.421555 -1.255236
74 0.541505 -1.019659 -0.817549
75 0.973641 -1.437847 1.291807
76 -0.297790 -0.129589 0.712545
77 0.729158 -1.801783 0.315075
78 1.579405 -0.555476 -0.521362
79 -1.298269 -0.108276 0.208415
80 -0.032494 -0.219419 0.072550
81 0.928107 -0.157164 -0.601375
82 0.143140 0.571646 -0.204032
83 0.841268 0.334995 -0.391680
84 -0.359113 0.318038 0.496818
85 -1.445513 0.420391 -0.807184
86 1.370896 2.734003 1.213543
87 0.520353 -0.632354 0.324827
88 -0.662015 -2.154534 -2.059343
89 -0.163696 -0.291418 -1.494405
90 -1.471143 0.220470 -0.732425
91 1.928244 -0.196283 2.143498
92 0.248397 -0.606520 2.270889
93 -0.081638 0.806390 -0.256447
94 1.031751 0.097771 -1.628005
95 0.532720 -1.312519 -0.808012
96 -0.221058 0.561338 -0.070290
97 0.126138 0.031958 -0.288304
98 -1.046657 -0.137803 -0.243470
99 1.604708 -0.829743 -1.290130
[100 rows x 3 columns]
>>>df.plot()
>>>plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 导入需要的库
>>>importpandasaspd
>>>importnumpyasnp
>>>importmatplotlib.pyplotasplt
# 定义一个DataFrame
>>>df=pd.DataFrame(np.random.randn(100,3),columns=['A','B','C'])
>>>df.cumsum()#累积求和
ABC
0-1.3904290.301102-0.659243
1-0.195243-0.825847-0.068817
2-0.334314-0.575144-1.146362
30.5643070.0735481.419107
4-0.3236520.7798660.820501
50.7314712.3922681.674016
6-0.358689-0.731527-0.380429
7-0.8199280.2387290.865254
80.2437211.3171330.743984
9-0.2148770.6634400.800653
10-0.7934980.164130-0.839115
11-0.398866-1.5171210.788057
120.7448340.5434150.462570
131.174500-0.3026510.388262
14-0.6832002.0752801.141336
150.662582-0.358390-0.057708
160.3269710.9780130.034560
17-0.148488-0.1702561.429408
180.7723210.3933120.248589
19-0.7201611.323384-1.482325
200.0519850.354218-1.139217
21-0.7958220.5709171.064519
220.677833-0.763512-0.255530
232.3699771.1242300.283023
240.7101860.384634-0.426938
25-0.417719-1.1532020.769669
26-0.0103571.237234-1.572733
271.4697570.120891-1.507504
28-0.024829-1.022276-1.009701
290.693116-0.6207430.913808
...........
701.0450251.2801451.523409
71-0.921893-0.683112-0.525018
72-1.4581080.917679-0.728754
731.9664920.421555-1.255236
740.541505-1.019659-0.817549
750.973641-1.4378471.291807
76-0.297790-0.1295890.712545
770.729158-1.8017830.315075
781.579405-0.555476-0.521362
79-1.298269-0.1082760.208415
80-0.032494-0.2194190.072550
810.928107-0.157164-0.601375
820.1431400.571646-0.204032
830.8412680.334995-0.391680
84-0.3591130.3180380.496818
85-1.4455130.420391-0.807184
861.3708962.7340031.213543
870.520353-0.6323540.324827
88-0.662015-2.154534-2.059343
89-0.163696-0.291418-1.494405
90-1.4711430.220470-0.732425
911.928244-0.1962832.143498
920.248397-0.6065202.270889
93-0.0816380.806390-0.256447
941.0317510.097771-1.628005
950.532720-1.312519-0.808012
96-0.2210580.561338-0.070290
970.1261380.031958-0.288304
98-1.046657-0.137803-0.243470
991.604708-0.829743-1.290130
[100rowsx3columns]
>>>df.plot()
>>>plt.show()
我们来详细分析一下上面的例子,首先导入了所需要的库。要注意的是
importmatplotlib.pyplotasplt 是为了最后能通过
plt.show() 将图形显示出来。接着定义了一个DataFrame,包括
'A','B','C' 三列,然后直接调用
df.plot() 画图方法, 默认对所有列作折线图,并且以索引作为
x 轴。得到的图形如下:
或者可以指定
x 轴:
>>>df.plot(x='A')
>>>plt.show()
1
2
>>>df.plot(x='A')
>>>plt.show()
得到以
A 列为横坐标,其他列都作为纵坐标的图形:
这给了我们启发,事实上对于有多列的DataFrame而言,可以引入
x,y 参数指定要作图的数据。比如:
>>>df.plot(x='A', y='B')
>>>plt.show()
1
2
>>>df.plot(x='A',y='B')
>>>plt.show()
在这里指定了
A 列为横坐标,
B 列为纵坐标,得到图形如下:
散点图
这是作折线图的情况,如果我们想作散点图,就需要调用散点图的方法:
>>>df.plot(kind='scatter', x='A', y='B', color='r')
# 或者
>>>df.plot.scatter(x='A', y='B', color='r')
>>>plt.show()
1
2
3
4
>>>df.plot(kind='scatter',x='A',y='B',color='r')
# 或者
>>>df.plot.scatter(x='A',y='B',color='r')
>>>plt.show()
得到的散点图如下:
如果需要将
C 列也作到同一张图里,方法稍有不同:
>>>ax1 = df.plot.scatter(x='A', y='B', color='r', label='scatter1')
>>>df.plot.scatter(x='A', y='C', color='g', label='scatter2', ax=ax)
>>>plt.show()
1
2
3
>>>ax1=df.plot.scatter(x='A',y='B',color='r',label='scatter1')
>>>df.plot.scatter(x='A',y='C',color='g',label='scatter2',ax=ax)
>>>plt.show()
解释下:首先作完第一张图后赋值给自变量
ax1 ,表示这张图的坐标轴。作第二张图的时候,通过
ax 参数指定要作到自变量
ax1 中去。得到的散点图如下:
可以看出,与Matplotlib直接作图不同,只要定义好了
label ,这里直接加上了图例。
条形图
掌握了前面的方法后,作其他类型的图就是大同小异了,这里再介绍条形图的画法:
>>>df = pd.DataFrame({'lab':['A', 'B', 'C'], 'val':[10, 30, 20]})
>>>df.plot.bar(x='lab', y='val', color='orange', rot=0)
>>>plt.show()
1
2
3
4
>>>df=pd.DataFrame({'lab':['A','B','C'],'val':[10,30,20]})
>>>df.plot.bar(x='lab',y='val',color='orange',rot=0)
>>>plt.show()
在这个例子中,我们指定了以
lab 列作为横坐标,
val 列作为纵坐标,填充的颜色为
orange ,旋转角度为0 。最后得到的条形图如下:
这里只介绍这几种图形,其他图形的使用方法大同小异。清楚使用DataFrame中哪些数据作图最关键。
总结
pandas提供了高级的作图接口,可以非常方便地作出图形。需要注意的是本文并不涉及作图的详细参数,这部分内容在Matplotlib教程中会详细讲到。