利用python进行数据分析

绘图和可视化

信息可视化(绘图)是数据分析中最重要的工作之一,他可能是探索过程的一部分。它可以协助找出异常值、必要的数据转接,得出有关模型的idea。同时实现一个可交互的数据可视化也是工作的最终目标。python有许多库可以进行静态或动态的数据可视化,本节主要关注matplotlib。
matplotlib是用于创建出版质量图标的桌面绘图包(主要是2D方面)。matplotlib和IPython社区进行合作,简化了从IPython shell进行交互式绘图。matplotlib支持各种操作系统上许多不同的GUI后端,而且还能将图片导出为各种常见的矢量和光栅图:PDF、SVG、JPG、PNG、BMP和GIF等。
本文代码主要在Jupter notebook进行交互式绘图,在Jupyter notebook中执行以下语句

%matplotlib notebook

1.matplotlib入门

matplotlib的通常引入约定是:

In [11]: import matplotlib.pyplot as plt

在Jupyter中运行%matplotlib notebook,就可以创建一个简单的图形。

In [12]: import numpy as np
In [13]: data = np.arange(10)
In [14]: data
Out[14]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [15]: plt.plot(data)

在这里插入图片描述
虽然seaborn这样的库和pandas的内置绘图函数能够处理许多普通的绘图任务,但是如果需要自定义一些高级功能就需要使用matplotlib API。

Figure和Subplot

matplotlib的图像位于Figure中,可以使用plt.figure创建一个新的Figure:

In [16]: fig = plt.figure()

同时使用add_subplot创建一个或多个subplot才行:

In [17]: ax1 = fig.add_subplot(2, 2, 1)
In [18]: ax2 = fig.add_subplot(2, 2, 2)
In [19]: ax3 = fig.add_subplot(2, 2, 3)

在这里插入图片描述

In [20]: plt.plot(np.random.randn(50).cumsum(), 'k--')
In [21]: ax1.hist(np.random.randn(100), bins=20, color='k', alph
a=0.3)
In [22]: ax2.scatter(np.arange(30), np.arange(30) + 3 * np.rando
m.randn(30))

在这里插入图片描述
在这里插入图片描述

调整subplot周围的间距

默认情况下,matplotlib会在subplot外围留下一定的边距,并在subplot之间留下一定的间距。间距跟图像的高度和宽度有关,因此调整图像大小,间距自动调整。利用Figure的subplot_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(np.random.randn(500), bins=50, color='k'
, alpha=0.5)
plt.subplots
_
adjust(wspace=0, hspace=0)

在这里插入图片描述

颜色、标记和线型

matplotlib的plot函数接受一组X和Y坐标,还可以接受一个表示颜色和线型的字符串缩写,如要分局X和Y绘制徐色虚线,则:

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

同样显示效果的代码:

ax.plot(x, y, linestyle='--', color='g')

刻度、标签和图例

对于大多数图表装饰向,其主要的实现方式有二:使用过程型的pyplot接口以及更为面向对象的原生matplotlib API。
pyplot接口的设计目的是交互式使用,含有注入xlim、xticks和xticklabels之类的方法,分别控制图表的范围、刻度位置、刻度标签等。其使用方式有一些两种:
1)调用时不带参数,则返回当前的参数值;
2)调用时带参数,则设置参数值
所有这些方法都是对当前或最近创建的额AxesSubplot起作用的,他们各自对应subplot对象上的两个方法:以xlim为例,就是ax.get_xlim和ax.set_xlim。

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

未说明自定义主,绘制一段随机漫步来进行说明:

In [37]: fig = plt.figure()
In [38]: ax = fig.add_subplot(1, 1, 1)
In [39]: ax.plot(np.random.randn(1000).cumsum())

在这里插入图片描述
要改变X轴刻度,可以使用set_xticks和set_xticklabels。前者定义刻度放在数据范围中的那些位置,默认情况下,这些位置也就是刻度标签,同时可以通过set_xticklabels将任何其他的值用作标签:

In [40]: ticks = ax.set_xticks([0, 250, 500, 750, 1000])
In [41]: labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'],
....: rotation=30, fontsize='small')

rotation选项设定X刻度标签倾斜30度,再用set_xlabel为X轴设置一个名称,并用set_title设置一个标题:

In [42]: ax.set
_
title('My first matplotlib plot')
Out[42]: <matplotlib.text.Text at 0x7fb624d055f8>
In [43]: ax.set
_
xlabel('Stages')

在这里插入图片描述

添加图例

图例是另一种用于标识图表元素的重要工具,添加图例的方式有多种,最简单的是在添加subplot的时候传入label参数:

In [44]: from numpy.random import randn
In [45]: fig = plt.figure(); ax = fig.add
_
subplot(1, 1, 1)
In [46]: ax.plot(randn(1000).cumsum(), 'k', label='one')
Out[46]: [<matplotlib.lines.Line2D at 0x7fb624bdf860>]
In [47]: ax.plot(randn(1000).cumsum(), 'k--', label='two')
Out[47]: [<matplotlib.lines.Line2D at 0x7fb624be90f0>]
In [48]: ax.plot(randn(1000).cumsum(), 'k.', label='three')
Out[48]: [<matplotlib.lines.Line2D at 0x7fb624be9160>]

在此之后,可以调用ax.lengend或plt.legend()来自动创建图例

In [49]: ax.legend(loc='best')

在这里插入图片描述

注解以及在Subplot上绘图

除了标准的绘图类型,还可以绘制一些子集的注解包括文本、箭头或者其他图像。注解和文字可以通过text、arrow和annotate函数进行添加 。text可以将文本绘制在图表的指定坐标(x,y),还可以加上一些自定义格式:

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

将图标保存到文件

利用plt.savefig可以将当前图表保存到文件,例如保存为SNG类型:

plt.savefig('figpath.svg')

文件类型是通过文件扩展名推断出来的,图片最常用的两个重要的选项是dpi和bbox_inches:

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

另外列出savefIg的其它选项:
在这里插入图片描述

matplotlib配置

matplotlib自带一些配色方案,以及为生成出版质量的图片而设定的默认配置信息,包括管理图像大小、subplot边距、字体大小、网格类型等。一般可以使用系统的方法rc

plt.rc('figure', figsize=(10, 10))

rc的第一个参数是自定义的对象,如’figure’,‘axex’,‘xtick’,‘grid’,'legend’等。气候可以跟上一系列的关键字参数。一个简单的方法是将这些选项写成一个字典:

font
_
options = {'family' : 'monospace',
'weight' : 'bold',
'size' : 'small'}
plt.rc('font',
**font
_
options)

2.使用pandas和seaborn绘图

maplotlib是一种比较低级的工具,要绘制一张图表,包括多列数据,还有行和列标签。因此引入seaborn。

线形图

Series和DataFrame都有一个用于生成各类图表的plot方法,默认情况下,它们生成的是线形图

In [60]: s = pd.Series(np.random.randn(10).cumsum(), index=np.ar
ange(0, 100, 10))
In [61]: s.plot()

在这里插入图片描述
该Series对象的索引会被传给matplotlib,并用以绘制X轴。Y轴用yticks和ylim,plot参数的完整列表如下:
在这里插入图片描述
在这里插入图片描述
pandas的大部分绘图方法都有一个可选的ax参数,是一个matplotlib的subplot对象。DataFrame的plot方法会在一个subplot中为各列绘制一条线:

In [62]: df = pd.DataFrame(np.random.randn(10, 4).cumsum(0),
....: columns=['A', 'B', 'C', 'D'],
....: index=np.arange(0, 100, 10))
In [63]: df.plot()

在这里插入图片描述
DataFrame还有一些用于对列进行零号处理的选项,详细信息参照系下表:
在这里插入图片描述

柱状图

plot.bar()和plot.barh()分别绘制水平和垂直的柱状图。

In [64]: fig, axes = plt.subplots(2, 1)
In [65]: data = pd.Series(np.random.rand(16), index=list('abcdef
ghijklmnop'))
In [66]: data.plot.bar(ax=axes[0], color='k', alpha=0.7)
Out[66]: <matplotlib.axes._
subplots.AxesSubplot at 0x7fb62493d470
>
In [67]: data.plot.barh(ax=axes[1], color='k', alpha=0.7)

在这里插入图片描述color='k’和alpha=0.7设定了图形的颜色为黑色,并使用部分的填充透明度

In [69]: df = pd.DataFrame(np.random.rand(6, 4),
....: index=['one', 'two', 'three', 'four',
'five', 'six'],
....: columns=pd.Index(['A', 'B', 'C', 'D']
, name='Genus'))
In [70]: df
Out[70]:
Genus A B C D
one 0.370670 0.602792 0.229159 0.486744
two 0.420082 0.571653 0.049024 0.880592
three 0.814568 0.277160 0.880316 0.431326
four 0.374020 0.899420 0.460304 0.100843
five 0.433270 0.125107 0.494675 0.961825
six 0.601648 0.478576 0.205690 0.560547
In [71]: df.plot.bar()

在这里插入图片描述

直方图和密度图

直方图(histogram)是一种可以对值频率进行离散化显示的柱状图,数据点被拆分到离散的、间隔均匀地面元中,绘制的是个面元中数据点的数量

In [92]: tips['tip_pct'].plot.hist(bins=50)

在这里插入图片描述
与此相关的一种图表是密度图,通过计算“可能会产生观测数据的连续概率分布分估计”而产生的。一般的过程是将该分布金思维一组核(诸如正态分布)。

In [94]: tips['tip_pct'].plot.density()

在这里插入图片描述可以使用seaborn的regplot方法做一个散布图,在加上一条线性回归:

In [105]: sns.regplot('m1', 'unemp', data=trans
_
data)
Out[105]: <matplotlib.axes._
subplots.AxesSubplot at 0x7fb613720b
e0>
In [106]: plt.title('Changes in log %s versus log %s' % ('m1', '
unemp'))

在这里插入图片描述

分面网格和类型数据

有多个分类变量的数据可视化的一种方法就是使用小面网格,seaborn有一个有用的内置函数factorplot

In [108]: sns.factorplot(x='day', y='tip_pct', hue='time', col=
'smoker',
.....: kind='bar', data=tips[tips.tip_pct < 1]
)

在这里插入图片描述
除了在分面中用不同的颜色按时间,还可以给每个时间添加一行来扩展分面网格:

In [109]: sns.factorplot(x='day', y='tip_pct', row='time',
.....: col='smoker',
.....: kind='bar', data=tips[tips.tip_pct < 1]
)

在这里插入图片描述
factorplot支持其他的绘图类型,盒图

In [110]: sns.factorplot(x='tip_pct', y='day', kind='box',
.....: data=tips[tips.tip_pct < 0.5])

在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值