当前位置:   article > 正文

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

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

与公众号同步更新,详细内容及相关ipynb文件在公众号中,公众号:AI入门小白

信息可视化(也叫绘图)是数据分析中最重要的⼯作之⼀。它可能是探索过程的⼀部分,例如,帮助我们找出异常值、必要的数据转换、得出有关模型的idea等。另外,做⼀个可交互的数据可视化也许是⼯作的最终⽬标。Python有许多库进⾏静态或动态的数据可视化,但我这⾥重要关注于matplotlib(http://matplotlib.org/ )和基于它的库。

matplotlib衍⽣出了多个数据可视化的⼯具集,它们使⽤matplotlib作为底层。其中之⼀是seaborn(http://seaborn.pydata.org/ )。

matplotlib API入门

matplotlib的通常约定是:

import matplotlib.pyplot as plt
%matplotlib notebook  # 用于在notebook中进行交互式绘图
  • 1
  • 2

Jupyter中运⾏%matplotlib notebook(或在IPython中运⾏%matplotlib),就可以创建⼀个简单的图形。

import numpy as np
data = np.arange(10)
data
plt.plot(data)
  • 1
  • 2
  • 3
  • 4

Figure和Subplot

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

fig = plt.figure()
  • 1

如果⽤的是IPython,这时会弹出⼀个空窗⼝,但在Jupyter中,必须再输⼊更多命令才能看到。plt.figure有⼀些选项,特别是figsize,它⽤于确保当图⽚保存到磁盘时具有⼀定的⼤⼩和纵横⽐。
不能通过空Figure绘图。必须⽤add_subplot创建⼀个或多个subplot才⾏:

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

这条代码的意思是:图像应该是2×2的(即最多4张图),且当前选中的是4个subplot中的第⼀个(编号从1开始)。

ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
  • 1
  • 2

提示:使⽤Jupyter notebook有⼀点不同,即每个⼩窗重新执⾏后,图形会被重置。因此,对于复杂的图形,你必须将所有的绘图命令存在⼀个⼩窗⾥。
这⾥,我们运⾏同⼀个⼩窗⾥的所有命令:

fig = plt.figure()
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
  • 1
  • 2
  • 3
  • 4

如果这时执⾏⼀条绘图命令(如plt.plot([1.5, 3.5, -2, 1.6])),matplotlib就会在最后⼀个⽤过的subplot(如果没有则创建⼀个)上进⾏绘制,隐藏创建figuresubplot的过程。因此,如果我们执⾏下列命令,你就会得到如上图所示的结果:

plt.plot(np.random.randn(50).cumsum(), 'k--')  # cumsum()所有元素的累计和
  • 1

"k--"是⼀个线型选项,⽤于告诉matplotlib绘制⿊⾊虚线图。上⾯那些由fig.add_subplot所返回的对象是AxesSubplot对象,直接调⽤它们的实例⽅法就可以在其它空着的格⼦⾥⾯画图了

_ = ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)
ax2.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))
  • 1
  • 2

你可以在matplotlib的⽂档中找到各种图表类型。创建包含subplot⽹格的figure是⼀个⾮常常⻅的任务,matplotlib有⼀个更为⽅便的⽅法plt.subplots,它可以创建⼀个新的Figure,并返回⼀个含有已创建的subplot对象的NumPy数组:

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

这是⾮常实⽤的,因为可以轻松地对axes数组进⾏索引,就好像是⼀个⼆维数组⼀样,例如axes[0,1]。你还可以通过sharexsharey指定subplot应该具有相同的X轴或Y轴。在⽐较相同范围的数据时,这也是⾮常实⽤的,否则,matplotlib会⾃动缩放各图表的界限。有关该⽅法的更多信息,请参⻅下表:
在这里插入图片描述

调整subplot周围的间距

默认情况下,matplotlib会在subplot外围留下⼀定的边距,并在subplot之间留下⼀定的间距。间距跟图像的⾼度和宽度有关,因此,如果你调整了图像⼤⼩(不管是编程还是⼿⼯),间距也会⾃动调整。利⽤Figuresubplots_adjust⽅法可以轻⽽易举地修改间距,此外,它也是个顶级函数:

plt.subplots_adjust(left=None, bottom=None, right=None, top=None,
                wspace=None, hspace=None)
  • 1
  • 2

wspacehspace⽤于控制宽度和⾼度的百分⽐,可以⽤作subplot之间的间距。下⾯是⼀个简单的例⼦,其中我将间距收缩到了0:

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)
  • 1
  • 2
  • 3
  • 4
  • 5

注意:matplotlib不会检查标签是否重叠,所以对于这种情况,你只能⾃⼰设定刻度位置和刻度标签。

颜⾊、标记和线型

matplotlibplot函数接受⼀组XY坐标,还可以接受⼀个表示颜⾊和线型的字符串缩写。例如,要根据xy绘制绿⾊虚线,你可以执⾏如下代码:

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

这种在⼀个字符串中指定颜⾊和线型的⽅式⾮常⽅便。在实际中,如果你是⽤代码绘图,你可能不想通过处理字符串来获得想要的格式。通过下⾯这种更为明确的⽅式也能得到同样的效果:

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

常⽤的颜⾊可以使⽤颜⾊缩写,你也可以指定颜⾊码(例如,'#CECECE')。你可以通过查看plot的⽂档字符串查看所有线型的合集(在IPythonJupyter中使⽤plot?)。
线图可以使⽤标记强调数据点。因为matplotlib可以创建连续线图,在点之间进⾏插值,因此有时可能不太容易看出真实数据点的位置。标记也可以放到格式字符串中,但标记类型和线型必须放在颜⾊后⾯。

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

为了说明⾃定义轴,我将创建⼀个简单的图像并绘制⼀段随机漫步:

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.random.randn(1000).cumsum())
  • 1
  • 2
  • 3

要改变x轴刻度,最简单的办法是使⽤set_xticksset_xticklabels。前者告诉matplotlib要将刻度放在数据范围中的哪些位置,默认情况下,这些位置也就是刻度标签。但我们可以通过set_xticklabels将任何其他的值⽤作标签:

ticks = ax.set_xticks([0, 250, 500, 750, 1000])
labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'],
                            rotation=30, fontsize='small')
  • 1
  • 2
  • 3

rotation选项设定x刻度标签倾斜30度。最后,再⽤set_xlabelX轴设置⼀个名称,并⽤set_title设置⼀个标题(⻅上图的结果):

ax.set_title('My first matplotlib plot')
ax.set_xlabel('stages')
  • 1
  • 2

Y轴的修改⽅式与此类似,只需将上述代码中的x替换为y即可。轴的类有集合⽅法,可以批量设定绘图选项。前⾯的例⼦,也可以写为:

props = {
    'title': 'My first matplotlib plot',
    'xlabel': 'Stages'    }
ax.set(**props)
ax.set_ylabel('world')
  • 1
  • 2
  • 3
  • 4
  • 5

添加图例

图例(legend)是另⼀种⽤于标识图表元素的重要⼯具。添加图例的⽅式有多种。最简单的是在添加subplot的时候传⼊label参数:

from numpy.random import randn
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(), 'k.', label='three')
  • 1
  • 2
  • 3
  • 4
  • 5

在此之后,你可以调⽤ax.legend()plt.legend()来⾃动创建图例:

ax.legend(loc='best')
  • 1

legend⽅法有⼏个其它的loc位置参数选项。请查看⽂档字符串(使⽤ax.legend?)。
loc告诉matplotlib要将图例放在哪。如果你不是吹⽑求疵的话,"best"是不错的选择,因为它会选择最不碍事的位置。要从图例中去除⼀个或多个元素,不传⼊label或传⼊label='nolegend'即可。

使用rc配置默认属性

使用rc配置文件来自定义图形的各种默认属性,如设置中文字体等
属性总结详情

绘制各类图形

API

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号