python:matplotlib及pandas绘图(2)

来源:互联网 发布:artrage mac破解 编辑:程序博客网 时间:2024/05/21 11:00

利用python进行数据分析

第八章:绘图和可视化

pandas中的绘图函数(更加详细的绘图资料可参考pandas.pdf文档中的Visualization这一章)

比较matplotlib和pandas发现,matplotlib进行绘图需要多种组建进行数据展示,通常制作一张完整的图需要用到多个对象。相比之下pandas有许多能够利用DataFrame对象数据组织特点来创建标准图表的高级绘图方法。
需要安装scipy,pip install scipy -i https://pypi.douban.com/simple/
>>> import pandas as pd
>>> import numpy as np
>>> from pandas import Series, DataFrame
>>> import matplotlib.pyplot as plt

1,线型图,plot()

Series和DataFrame都有一个用于生成各类图表的plot方法。默认情况下他们所生成的是线型图:
>>> s=Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
>>> s #生成一个Series对象
0 0.989266
10 -0.150003
20 1.275347
30 -1.192475
40 -1.393699
50 -1.729970
60 -1.232880
70 -0.257553
80 1.457312
90 0.693616
dtype: float64
>>> s.plot() #默认绘制的是线性图
<matplotlib.axes._subplots.AxesSubplot object at 0x0000000005D89B38>
>>> plt.show()
该Series对象的索引会被传给matplotlib,并用以绘制X轴,(X轴的刻度是0, 10, 20, 30 … … 80, 90)。如果不想用Series对象的index作为图表的X轴,可加入use_index=False属性
>>> s.plot(use_index=False)
这时X轴的刻度变为0, 1, 2, 3 … … 8, 9,即利用对象索引作为X轴的刻度
例如,X轴的刻度和界限可通过xtricks和xlim选项进行调节,Y轴就用ytricks和ylim选项进行调节,其他plot的参数与matplotlib的参数都相同
>>> plt.plot()
pandas的大部分绘图方法都有一个可选的ax参数,它可以是一个matplotlib的subplot对象。这使你能够在网格布局中更为灵活的处理subplot的位置。

DataFrame的plot方法会在一个subplot中为格列绘制一条线,并自动创建图例,同时不同线条用不同颜色进行标记:
>>> df=DataFrame(np.random.randn(10, 4).cumsum(0), columns=['A', 'B', 'C', 'D'], index=np.arange(0, 100, 10))
>>> df
A B C D
0 -0.116409 1.109281 -0.135529 0.406155
10 1.107530 -0.023620 -2.514431 1.171518
20 0.082471 1.473273 -2.108833 1.650622
30 0.003701 2.028022 -1.321097 0.865700
40 -1.538586 1.125721 -0.719312 1.265865
50 -2.754762 1.513562 -2.480575 0.052545
60 -2.217344 0.730599 -6.181309 -0.200893
70 -2.322631 -0.152333 -5.630466 0.214868
80 -3.835833 -0.027008 -5.403566 0.393587
90 -5.428609 1.686993 -5.298244 0.069555
>>> df.plot()
<matplotlib.axes._subplots.AxesSubplot object at 0x0000000008DEE588>
>>> plt.show()

表8-3:Series.plot方法的参数
| 参数 | 说明 |
| label | 用于图例的标签 |
| ax | 要在其上进行绘制的matplotlib subplot对象。如果没有设置,则使用当前matplotlib subplot |
| style | 将要传给matplotlib的风格字符串(如’ko–’) |
| alpha | 图表的填充不透明度(0到1之间) |
| kind | 可以是’line’(线型图),’bar’(纵向条形图),’barh’(横向条形图,y轴为Series的index对象),’kde’() |
| logy | 在Y轴上使用对数标尺 |
| use_index | 将对象的索引用作刻度标签 |
| rot | 旋转刻度标签(0到360) |
| xticks | 用作X轴刻度的值 |
| yticks | 用作Y轴刻度的值 |
| xlim | X轴的界限(例如[0, 10]) |
| ylim | Y轴的界限 |
| grid | 显示轴网格线(默认为Fales),grid=True(表示加入网格线) |

DataFrame还有一些用于对列进行灵活处理的选项,例如:是要将所有列都绘制到一个subplot中还是创建各自的subplot。

表8-4:专用于DataFrame的plot参数
(DataFrame对象可以使用Series.plot方法的所有参数)
| 参数 | 说明 |
| subplots | 将各个DataFrame列绘制到单独的subplot中 |
>>> df.plot(subplots=True, layout=(2, 2), figsize=(4, 4), sharex=False)
| sharex | 如果subplots=True,则共用同一个X轴,包括刻度和界限 |
| sharey | 如果subplots=True,则共用同一个Y轴 |
| figsize | 表示图形大小和元组 |
| title | 表示图像标题的字符串 |
| legend | 添加一个subplot图例(默认为True) |
| sort_columns | 以字母表顺序绘制各列,默认使用当前列顺序 |

2,柱状图,plot(kind=’bar’)

在生成线性图的代码中加上kind=’bar’(垂直柱状图)或kind=’barh’(水平柱状图)即可生成柱状图。这时,Series和DataFrame的索引将会被用作X(bar)或Y(barh)刻度:
>>> fig, axes=plt.subplots(2, 1)
>>> data=Series(np.random.randn(16), index=list('abcdefghijklmnop'))
>>> data.abs().plot(kind='bar', ax=axes[0], color='k', alpha=0.7)
<matplotlib.axes._subplots.AxesSubplot object at 0x000000000D02CC88>
>>> data.abs().plot(kind='barh', ax=axes[1], color='k', alpha=0.7)
<matplotlib.axes._subplots.AxesSubplot object at 0x000000000DA0FFD0>
>>> plt.show()

对于DataFrame,柱状图会将每一行的值分为一组
>>> df=DataFrame(np.random.randn(6, 4), index=['one', 'two', 'three', 'four', 'five', 'six'], columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus'))
>>> df
Genus A B C D
one 0.759118 -1.117766 0.082758 -1.669348
two -0.567765 -0.046072 -0.351519 -0.046807
three -1.032908 2.734916 -0.213560 -1.379267
four 0.681352 -1.202596 0.725036 -0.379820
five 0.227504 -1.070001 -1.478536 1.003087
six 0.007002 0.856379 1.215901 -2.056503
>>> df.plot(kind='barh', stacked=True, alpha=0.5)
<matplotlib.axes._subplots.AxesSubplot object at 0x000000000841F828>
>>> plt.show()
DataFrame各列的名称“Genus”被用作了图例的标题。设置stacked=True即可为DataFrame生成堆积柱状图,这样每行的值就会被堆积在一起,stacked=False参数表示每个columns都画出独立的条形,而stacked=True参数表示每个columns都画到一个条形当中,不同的值用不同颜色的填充条表示。

可以用堆积柱状图以展示每天各种聚会规模的数据点的百分比,然后根据日期和聚会规模创建一张交叉表:
>>> party={'Fri': [1, 16, 1, 1, 0, 0], 'Sat': [2, 53, 18, 13, 1, 0], 'Sun': [0, 39, 15, 18, 3, 1], 'Thur': [1, 48, 4, 5, 1, 3]}
>>> party_counts=DataFrame(party).T
>>> party_counts
0 1 2 3 4 5
Fri 1 16 1 1 0 0
Sat 2 53 18 13 1 0
Sun 0 39 15 18 3 1
Thur 1 48 4 5 1 3
>>> party_counts.columns=np.arange(1,7)
>>> party_counts.columns.name='size'
>>> party_counts.index.name='day'
>>> party_counts
size 1 2 3 4 5 6
day
Fri 1 16 1 1 0 0
Sat 2 53 18 13 1 0
Sun 0 39 15 18 3 1
Thur 1 48 4 5 1 3
然后进行规格化,使得各行的和为1(必须转换成浮点数,以避免Python 2.7中的整数除法问题),并生成图表:
#规格化成“和为1”
>>> party_pcts=party_counts.div(party_counts.sum(1).astype(float), axis=0)
>>> party_pcts
size 1 2 3 4 5 6
day
Fri 0.052632 0.842105 0.052632 0.052632 0.000000 0.000000
Sat 0.022989 0.609195 0.206897 0.149425 0.011494 0.000000
Sun 0.000000 0.513158 0.197368 0.236842 0.039474 0.013158
Thur 0.016129 0.774194 0.064516 0.080645 0.016129 0.048387
>>> party_pcts.plot(kind='barh', stacked=True, label='best', xlim=[0, 1.2])
<matplotlib.axes._subplots.AxesSubplot object at 0x000000000A3C5048>
>>> plt.show()
通过图形可知聚会规模在周末回变大。

3,直方图和密度图,hist()

直方图(histogram)是一种可以对致频率进行离散化显示的柱状图。数据点被拆分到离散的、间隔均匀的面元中,绘制的是各面元中数据点的数量。
>>> party_counts
size 1 2 3 4 5 6
day
Fri 1 16 1 1 0 0
Sat 2 53 18 13 1 0
Sun 0 39 15 18 3 1
Thur 1 48 4 5 1 3
>>> party_counts.hist(color='r')
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000000008AAB630>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000000008B01EB8>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x00000000088522B0>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000000000AC87048>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x000000000AD47400>,
<matplotlib.axes._subplots.AxesSubplot object at 0x00000000098EF3C8>]], dtype=object)
>>> plt.show()
画单个columns(),绘制一个直方图
>>> party_counts[1].hist()
<matplotlib.axes._subplots.AxesSubplot object at 0x000000000A306710>
>>> plt.show()
stacked=True参数对于hist()是不适用的,因为不会生成堆积图
hist()画图默认是有网格线的,可通过grid=False参数进行调整

密度图是通过计算“可能会产生观测数据的连续概率分布的估计”而产生的。一般的过程是将该分布近似为一组核(即诸如正太(高斯)分布之类的较为简单的分布)。因此,密度图也被称作KDE(Kernel Density Estimate,核密度估计)图。调用plot时加上kind=’kde’即可生成一张密度图(标准混合正太分布KDE)
>>> from scipy.stats import gaussian_kde
有时会将直方图和密度分布图画在一起,直方图以规格化形式给出(以便给出面元化密度),然后在其上绘制核密度估计。
>>> comp1=np.random.normal(0, 1, size=200)
>>> comp2=np.random.normal(10, 2, size=200)
>>> values=Series(np.concatenate([comp1, comp2]))
>>> values.hist(bins=100, alpha=0.3, color='k', normed=True)
<matplotlib.axes._subplots.AxesSubplot object at 0x000000000A6BB198>
>>> values.plot(kind='kde', style='k--')
>>> plt.show()

4,散布图

散布图(scatter plot)是观察两个一维数据序列之间的关系的有效手段。matplotlib的scatter方法是绘制散布图的主要方法。
>>> data={'cpi': [1, 2, 3, 4, 5], 'm1': [13, 13, 1, 4, 6], 'tbilrate': [0, 9, 9, 3, 4], 'unemp': [1, 2, 1, 2, 1]}
>>> trans_data=DataFrame(data, index=[198, 199, 200, 201, 202])
>>> trans_data
cpi m1 tbilrate unemp
198 1 13 0 1
199 2 13 9 2
200 3 1 9 1
201 4 4 3 2
202 5 6 4 1
利用plt.scatter即可轻松绘制一张简单的散布图
>>> plt.scatter(trans_data['m1'], trans_data['tbilrate']) #以‘m1’这一列为横轴,‘tbilrate’这一列为纵轴,绘制散布图(散点图)
<matplotlib.collections.PathCollection object at 0x0000000008503A90>
>>> plt.title('Changes in log %s vs. log %s' % ('m1', 'unemp')) #添加图表标题
>>> plt.show()
也可同时观察一组变量的散布图,这一组散布图被称作散布图矩阵(scatter plot matrix)。利用DataFrame的散布矩阵scatter_matrix函数可创建散布图矩阵。同时它还支持在对角线上放置各变量的直方图或密度图。
>>> data2={'cpi': [-0.007904, -0.021979, 0.002340, 0.008419, 0.008894], 'm1': [0.045361, 0.066753, 0.010286, 0.037461, 0.01202], 'tbilrate': [-0.396881, -2.277267, 0.606136, -0.200671, -0.405465], 'unemp': [0.105361, 0.139762, 0.160343, 0.127339, 0.042560]}
>>> trans_data=DataFrame(data2, index=[198, 199, 200, 201, 202])
>>> trans_data
cpi m1 tbilrate unemp
198 -0.007904 0.045361 -0.396881 0.105361
199 -0.021979 0.066753 -2.277267 0.139762
200 0.002340 0.010286 0.606136 0.160343
201 0.008419 0.037461 -0.200671 0.127339
202 0.008894 0.012020 -0.405465 0.042560
>>> pd.scatter_matrix(trans_data, diagonal='kde', color='k')
对角线画图为4个columns的密度图,其他为columns与columns对应关系的散布图,共16张图。
>>> pd.scatter_matrix(trans_data, color='k')
对角线为4个columns的柱状图,其他为columns与columns对应关系的散布图,共16张图。

原创粉丝点击