python:matplotlib及pandas绘图(1)

利用python进行数据分析

第八章:绘图和可视化

matplotlib APL入门

>>> import matplotlib.pyplot as plt
>>> import numpy as np

1,Figure和Subplot

matplotlib的图像都位于Figure对象中,可通过plt.figure创建一个新的Figure
>>> fig=plt.figure() #创建一个新的Figure
>>> plt.show() #可展示图形结果
因为不能通过空的Figure绘图,所以必须用add_subplot创建一个或多个subplot才能进行绘图
>>> ax1=fig.add_subplot(2,2,1) #表示图形排布是2X2横向两张图,纵向两张图,且当前选中的是4个subplot中的第一个(编号从1开始)。后面还会再创建两个subplot
>>> ax2=fig.add_subplot(2,2,2) #所以add_subplot一定要有三个输入参数
>>> ax3=fig.add_subplot(2,2,3)
如果这时发出一条绘图命令(如plt.plot([1.5, 3.5, -2, 1.6])),matplotlib就会在最后一个用过的subplot(如果没有则创建一个)上进行绘图。
>>> from numpy.random import randn
>>> plt.plot(randn(50).cumsum(), 'k--')
[]
>>> plt.show()
“k–”是一个线型选项,表示黑色虚线。“–”表示虚线,“-”表示实线
线条颜色选型:
| Alias | Color |
|‘b’ | blue |
|‘g’ | green |
|‘r’ | red |
|‘c’ | cyan |
|‘m’| magenta |
|‘y’ | yellow |
|‘k’ | black |
|‘w’| white |
之后再输入如下内容能够将上述三个图表内均进行画图
>>> _=ax1.hist(randn(100), bins=20, color='k', alpha=0.3)
>>> ax2.scatter(np.arange(30), np.arange(30)+3*randn(30))
>>> plt.show()
会展示画图的三张图片,‘k–’,ax1和ax2

可利用plt.subplots方法创建Figure和subplot任务,它可以创建一个新的Figure,并返回一个含有已经创建的subplot对象的NumPy数组
>>> fig, axes=plt.subplots(2, 3) #创建一个两行三列的空图表
>>> fig

>>> axes
array([[< matplotlib.axes._subplots.AxesSubplot object at 0x0000000008EED4A8>,
< matplotlib.axes._subplots.AxesSubplot object at 0x00000000091AFB38>,
< matplotlib.axes._subplots.AxesSubplot object at 0x000000000921B390>],
[< matplotlib.axes._subplots.AxesSubplot object at 0x000000000935BB00>,
< matplotlib.axes._subplots.AxesSubplot object at 0x0000000009429F28>,
< matplotlib.axes._subplots.AxesSubplot object at 0x000000000951EC88>]], dtype=object)

>>> plt.show() #展示一个两行三列的空图表
表8-1:pyplot.subplots的选项
| 参数 | 说明 |
| nrows | subplot的行数 |
| ncols | subplot的列数 |
| sharex | 所有subplot应该使用相同的X轴刻度(调节xlim将会影响所有subplot) |
| sharey | 所有subplot应该使用相同的Y轴刻度(调节ylim将会影响所有subplot) |
| subplot_kw | 用于创建各subplot的关键字字典 |
| **fig_kw | 创建figure时的其他关键字,如plt.subplots(2,2,figsize=(8,6)) |
>>> plt.subplots(2,2,figsize=(8,6)) #创建一个两行两列的空图表,图表大小为8,6

调整subplot周围的间距
subplot_adjust可调整各个子图表之间的间距
>>> subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None) #subplots_adjust方法所展示的函数及其参数
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) #调节各个图表之间的间距为0
>>> plt.show() #展示4个图表各个子图表之间没有间距而且标签没有重叠

2,颜色、标记和线型

matplotlib的plot函数能够接受一组X和Y坐标,同时能够接受一个表示颜色和线型的字符串缩写。例如,要根据x和y绘制绿色虚线,可执行如下代码:
>>> plt.plot([1.5, 3.5, -2, 1.6], 'g--')
>>> plt.show()
‘g–’这样的简写是允许的,同时也可利用如下的方式
>>> plt.plot([1.5, 3.5, -2, 1.6], linestyle='--', color='g')
>>> plt.show()
linestyle参数写明线条类型,color参数写明线条颜色
颜色的选择也可通过RGB的形式进行表示(例如:’#CECECE’)

线型图还可以加上一些标记(marker),以强调实际的数据点,由于matplotlib创建的是连续的线型图(点与点之间插值),因此有时可能不太容易看出真实数据的位置。标记也可以放到格式字符串中,但表示类型和线型必须放在颜色后面
>>> from numpy.random import randn
>>> plt.plot(randn(30).cumsum(), 'ko--')
>>> plt.show()
‘k’:表示线型,‘o’:表示圆点,‘–’:表示虚线
也可以写另外一种形式
>>> plt.plot(randn(30).cumsum(), color='k', linestyle='dashed', marker='o')
>>> plt.show()

在线型图中,非实际数据点默认是按照线性方式插值的。可通过drawstyle选项进行修改
通过如下方法可在同一图表中画出两种线条
>>> data=randn(30).cumsum()
>>> plt.plot(data, 'k--', label='Default')
默认画图是黑色虚线,每个点之间用线段连接,整个图形是折线
>>> plt.plot(data, 'g--', drawstyle='steps-post', label='steps-post')
而steps-post表示的是四边形的线条,从第一个点平行画出该点与第二个点距离相同的线条,然后向上或向下垂直画线到第二个点上。该图形用绿色虚线表示
>>> plt.legend(loc='best') #目前不懂
>>> plt.show()

3,刻度、标签和图例

1,设置标题、轴标签、刻度以及刻度标签
>>> from numpy.random import randn
>>> fig=plt.figure()
>>> ax=fig.add_subplot(1, 1, 1) #建立一个绘图集
>>> ax.plot(randn(1000).cumsum())
要修改X轴的刻度,最简单的方法是使用set_xticksset_xticklables
set_xticks表示matplotlib要将刻度放在数据范围中的哪些位置,默认情况下,这些位置就是刻度标签。但可通过set_xticklables将任何其他的值作为标签
>>> ax.set_xticks([0, 250, 500, 750, 1000]) #设定X轴刻度,共细分为5个刻度(0,250,500,750,1000)
>>> ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'], rotation=30, fontsize='small') #设置这5个刻度的X轴标签为(one,two,three,four,five)rotation,表示设定标签与X轴存在一定的倾斜角度,如果不加该参数,则默认X轴标签字体与X轴平行,fontsize,表示设定字体大小,并存在以下几个选项(Size is invalid. Valid font size are large, medium, smaller, None, small, x-large, xx-small, larger, x-small, xx-large
最后,再用set_xlabel为X轴设置一个名称,并用set_title设置一个标题
>>> ax.set_title('My first matplotlib plot') #设定图表标题
>>> ax.set_xlabel('Stages') #设定X轴名称
同样道理Y轴可以用yticks,yticklabels以及set_ylabel表示

2,添加图例
图例(legend)是另一种用于表示图表元素的重要工具。添加图例的方式有二,最简单的是在添加subplot的时候传入label参数:
>>> fig=plt.figure(); ax=fig.add_subplot(1, 1, 1)
>>> ax.plot(randn(1000).cumsum(), 'k', label='one')
>>> ax.plot(randn(1000).cumsum(), 'k--', label='two')
>>> ax.plot(randn(1000).cumsum(), 'g', label='three')
之后看调用ax.legend()plt.legend()来自动创建图例
>>> ax.legend(loc='best')
legend即图例的标注位置有一下几种选择:
right
center left
upper right
lower right
best
center
lower left
center right
upper left
upper center
lower center

best表示最佳选择位置,其他选项均选择固定位置
要从图例中除去一个或多个元素,不传入label或传入label='_nolegend_'即可,如:
>>> ax.plot(randn(1000).cumsum(), 'g', label='_nolegend_')

4,注释以及在Subplot上绘图

除了标准的图表对象之外,你可能还希望绘制一些自定义的注解(比如文本、箭头或其他图形等)。
注解可以通过text、arrow和annotate等函数进行添加。text可以将文本绘制在图表的指定坐标(x,y),还可以加上一些自定义格式:
>>> ax.text(x, y, 'Hello world!', family='monospace', fontsize=10) #x和y都要定义数值,比如200和0
>>> ax.text(200, 0, 'Hello world!', family='monospace', fontsize=10)
>>> plt.show() #之后会在(0,200)这个坐标的位置出现一个’Hello world!’的标注,但是没有箭头指示
注解中可以既含有文本也含有箭头
如果想要加入箭头和文本就要使用annotate函数,
参考matplotlib Plotting Cookbook.pdf书,86页
>>> X = np.linspace(-4, 4, 1024)
>>> Y = .25 * (X + 4.) * (X + 1.) * (X - 2.)
>>> plt.annotate('Brackmard minimum', ha = 'center', va = 'bottom', xytext = (-1.5, 3.), xy = (0.75, -2.7), arrowprops = { 'facecolor' : 'black', 'shrink' : 0.05 })
>>> plt.plot(X, Y)
>>> plt.show()

5,绘制图形

相对于线条的绘制来说图形的绘制较为麻烦,matplotlib有一些常见图形的对象,这些对象被称为快(patch)。其中有些可在matplotlib.pyplot中找到(如Rectangle何Circle),但完整集合位于matplotlib.patches。
要在图表中添加一个图形,你需要创建一个块对象shp,然后通过ax.add_patch(shp)将其添加到subplot中:
>>> fig=plt.figure()
>>> ax=fig.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)
>>> ax.add_patch(rect)
>>> ax.add_patch(circ)
>>> ax.add_patch(pgon)
>>> plt.show()

6,将图表保存到文件

利用plt.savefig可以将当前图表保存到文件。该方法相当于Figure对象的实例方法savefig。例如,要将图表保存在SVG文件,需要输入
>>> plt.savefig('figpath.svg')
文件类型是通过文件扩展名推断出来的,所以*.pdf会保存为一个PDF格式文件,当保存图片时有两个重要的选项dpi(控制“每英寸点数”分辨率)和bbox_inches(可以剪除当前图表周围的空白部分)。要得到一张带有最小白边且分辨率为400DP的PNG图片,需要输入
>>> plt.savefig('figpath.png', dpi=400, bbox_inches='tight')
表8-2:Figure.savefig的选项
| 参数 | 说明 |
| fname | 含有文件路径的字符串或Python的文件型对象。图像格式由文件扩展名推断得出,例如:.pdf推断出PDF,.png推断出PNG |
| dpi | 图像分辨率(每英寸点数),默认为100 |
| facecolor、edgecolor | 图像的背景色,默认为‘w’(白色) |
| format | 显示设置文件格式(“png”,“pdf”,“svg”,“ps”,“eps”… …)
| bbox_inches | 图表需要保存的部分,如果设置为“tight”,则将尝试剪除图表周围的空白部分 |

7,matplotlib配制

matplotlib自带一些配色方案,以及为生成出版质量的图片而设定的默认配制信息。这些默认行为可通过全局参数进行自定义。他们可以管理图像大小、subplot边距、配色方案、字体大小、网格类型等。
操作matplotli配置系统的方式主要有两种。第一种是Python编程方式,即利用rc方法。比如说,要将全局的图像默认大小设置为10x10,可执行:
>>> plt.rc('figure', figsize=(10, 10))
rc的第一个参数是希望自定义的对象,如’figure’, ‘axes’, ‘xtick’, ‘ytick’, ‘grid’, ‘legend’等。其后可以加入一系列的关键字参数,可将这些选项写成一个字典:
>>> font_options={'family': 'monospace', 'weight': 'bold', 'size': 'small'}
>>> plt.rc('font', **font_options)

你可能感兴趣的:(python_pandas,python)