您的位置:首页 > 编程语言 > Python开发

利用python进行数据分析-绘图和可视化1

2016-06-21 09:19 1026 查看
matplotlib AIP入门

1.Figure和Subplot

matplotlib的图像都位于Figure对象中。你可以用plt.figure创建一个新的Figure:

fig=plt.figure()

这时会弹出一个空窗口。plt.figure有一些选项,特别是figsize,它用于确保图片保存到磁盘时具有一定大小和纵横比。matplotlib中的Figure还支持一种MATLAB式的编号架构(例如plt.figure(2))。通过plt.gcf()即可得到当前Figure的引用。

不能通过空Figure绘图。必须用add_subplot创建一个或多个subplot才行

ax1=fig.add_subplot(2,2,1)

这段代码的意思是:图像应该是2*2的,且当前选中的是4个subplot中的第一个(编号从1开始)。如果再把后面两个subplot也创建出来,最终得到的图像如图所示

ax2=fig.add_subplot(2,2,2)

ax3=fig.add_subplot(2,2,3)



如果这时发出一条绘图命令(plt.plot(randn(50).cumsum(),'k--')),matplotlib就会在最后一个用过的subplot(如果没有则创建一个)上进行绘制

from numpy.random import randn

plt.plot(randn(50).cumsum(),'k--')

结果为:



‘k--’是一个线型选项,用于告诉matplotlib绘制黑色虚线图。上面那些由fig.add_subplot所返回的对象是AxesSubplot对象,直接调用它们的实例方法就可以在其它空着的格子里画图了

_=ax1.hist(randn(100),bins=20,color='k',alpha=0.3)

ax2.scatter(np.arange(30),np.arange(30)+3*randn(30))

结果为:



由于根据特定布局创建Figure和subplot是一件非常常见的任务,于是便出现了一个更为方便的方法(plt.subplots),它可以创建一个新的Figure,并返回一个含有已创建的subplot对象的NumPy数组

fig,axes=plt.subplots(2,3)

print axes

结果为:

[[<matplotlib.axes._subplots.AxesSubplot object at 0x0000000009062BA8>

  <matplotlib.axes._subplots.AxesSubplot object at 0x0000000009291080>

  <matplotlib.axes._subplots.AxesSubplot object at 0x00000000099A0F98>]

 [<matplotlib.axes._subplots.AxesSubplot object at 0x000000000A68FD30>

  <matplotlib.axes._subplots.AxesSubplot object at 0x0000000009A406A0>

  <matplotlib.axes._subplots.AxesSubplot object at 0x000000000928FCC0>]]

你可以轻松地对axes数组进行索引,就好像一个二维数组一样,例如,axes[0,1]。你还可以通过sharex和sharey指定subplot应该具有相同的X轴或Y轴。



2.调整subplot周围的间距

利用Figure的subplots_adjust方法可以轻而易举地修改间距,它是个顶级函数

subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=None,hspace=None)

wspace和hspace用于控制宽度和高度的百分比,可以用作subplot之间的间距

fig,axes=plt.subplots(2,2,sharex=True,sharey=True)

for i in range(2):

    for j in range(2):

        axes[i,j].hist(randn(500),bins=50,color='k',alpha=0.5)

plt.subplots_adjust(wspace=0,hspace=0)

结果为:



3.颜色、标记和线型

例如,要根据x和y绘制绿色虚线,可以执行如下代码

ax.plot(x,y,'g--')

通过下面这种更为明确的方式也能得到同样的效果

ax.plot(x,y,linesytle='--',clolor='g')

使用颜色也可以指定其RGB值的形式使用,如#CECECE

线形图还可以加上一些标记,以强调实际的数据点。标记也可以放到格式化字符串中,但标记类型和线型必须放在颜色后面

plt.plot(randn(30).cumsum(),'ko--')

结果为:



还可以将其写成更为明确的形式

plt.plot(randn(30).cumsum(),color='k',linestyle='dashed',marker='o')

在线型图中,非实际数据点默认按线性方式插值的。可以通过drawstyle选项修改

plt.plot(data,'k--',label='Default')

结果为:



plt.plot(data,'k-',drawstyle='steps-post',label='steps-post')

结果为:



plt.legend(loc='best')

结果为:



4.刻度、标签和图例

对于大多数图表装饰项,其主要实现方式有二:使用过程型的pyplot接口(MATLAB用户非常熟悉)以及面向对象的原生matplotlib API

pyplot接口其主要使用方式有以下两种:

a.调用时不带参数,则返回当前的参数值。例如,plt.xlim()返回当前的X轴绘图范围。

b.调用时带参数,则设置参数值。因此,plt.xlim([0,10])会将X轴的范围设置为0到10

所有这些方法都是对当前或最近创建的AxesSubplot起作用的。它们各自对应subplot对象上的两个方法,以xlim为例,就是ax.get_xlim和ax.set_xlim。

设置标题、轴标签、刻度以及刻度标签

fig=plt.figure()

ax=fig.add_subplot(1,1,1)

ax.plot(randn(1000).cumsum())

ticks=ax.set_xticks([0,250,500,750,1000])

labels=ax.set_xticklabels(['one','two','three','four','five'],

                          rotation=30,fontsize='small')

ax.set_title('My first matplotlib plot')

ax.set_xlabel('Stages')

结果为:



添加图例

添加图例的方式有两种。最简单的是在添加subplot的时候传入label参数

fig1=plt.figure()

ax1=fig1.add_subplot(1,1,1)

ax1.plot(randn(1000).cumsum(),'k',label='one')

ax1.plot(randn(1000).cumsum(),'k--',label='two')

ax1.plot(randn(1000).cumsum(),'k.',label='three')

ax1.legend(loc='best')

结果为:



loc告诉matplotlib要将图例放在哪。要从图例中去除一个或多个元素,不传入label或label='_nolegned_'即可

4.注解以及在Subplot上绘图

注解可以通过text、arrow和annotate等函数进行添加

ax.text(x,y,'Hello world!',family='monospace',fontsize=10)

实际案例

import matplotlib.pyplot as plt

from numpy.random import randn

import numpy as np

from datetime import datetime

import pandas as pd

fig=plt.figure()

ax=fig.add_subplot(1,1,1)

data=pd.read_csv('data/spx.csv',index_col=0,parse_dates=True)

spx=data['SPX']

spx.plot(ax=ax,style='k-')

crisis_data=[

    (datetime(2007,10,11),'Peak of bull market'),

    (datetime(2008,3,12),'Bear Stearns Fails'),

    (datetime(2008,9,15),'Lehman Bankruptcy')

]

for date,label in crisis_data:

    ax.annotate(label,xy=(date,spx.asof(date)+50),

                xytext=(date,spx.asof(date)+200),

                arrowprops=dict(facecolor='black'),

                horizontalalignment='left',verticalalignment='top')

                

ax.set_xlim(['1/1/2007','1/1/2011'])

ax.set_ylim([600,1800])

ax.set_title('Import dates in 2008-2009 financial crisis')

结果为:



要在图表中添加一个图形,你需要创建一个块对象shp,然后通过ax.add_patch(shp)将其添加到subplot中

fig1=plt.figure()

ax1=fig1.add_subplot(1,1,1)

rect=plt.Rectangle((0.2,0.75),0.4,0.15,color='k',alpha=0.3)

circ=plt.Circle((0.7,0.2),0.15,color='b',alpha=0.3)

pgon=plt.Polygon([[0.15,0.15],[0.35,0.4],[0.2,0.6]],color='g',alpha=0.5)

ax1.add_patch(rect)

ax1.add_patch(circ)

ax1.add_patch(pgon)

结果为:



5.将图表保存到文件

利用plt.savefig可以将当前图表保存到文件。该方法相当于Figure对象的实例方法savefig。

在发布图片时最常用到两个最重要的选项是dpi(控制“每英寸点数”分辨率)和bbox_inches(可以剪除当前表周围的空白部分)

plt.savefig('figpath.png',dpi=400,bbox_inches='tight')

savefig并非一定要写入磁盘,也可以写入任何文件型对象,比如StirngIO

from io import StringIO

buffer=StringIO()

plt.savefig(buffer)

plot_data=buffer.getvalue()



6.matplotlib配置

操作matplotlib配置系统的方式主要有两种。第一种是Python编程方式,即利用rc方法。如:plt.rc('figure',figsize=(10,10))

rc的第一个参数是希望自定义的对象

font_options={'family':'monospace',

                       'weight':'bold',

                       'size':'small'}

plt.rc('font',**font_options)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 数据分析 matlab