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

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)

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

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

from numpy.random import randn

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

结果为:

利用python进行数据分析-绘图和可视化1_第2张图片

‘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))

结果为:

利用python进行数据分析-绘图和可视化1_第3张图片

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

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

结果为:

[[
 
  ]
 [
 
  ]]

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

利用python进行数据分析-绘图和可视化1_第4张图片

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)

结果为:

利用python进行数据分析-绘图和可视化1_第5张图片

3.颜色、标记和线型

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

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

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

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

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

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

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

结果为:

利用python进行数据分析-绘图和可视化1_第6张图片

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

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

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

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

结果为:

利用python进行数据分析-绘图和可视化1_第7张图片

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

结果为:

利用python进行数据分析-绘图和可视化1_第8张图片

plt.legend(loc='best')

结果为:

利用python进行数据分析-绘图和可视化1_第9张图片


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')

结果为:

利用python进行数据分析-绘图和可视化1_第10张图片

添加图例

添加图例的方式有两种。最简单的是在添加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')

结果为:

利用python进行数据分析-绘图和可视化1_第11张图片

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()

利用python进行数据分析-绘图和可视化1_第12张图片


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)