赞
踩
与公众号同步更新,详细内容及相关ipynb文件在公众号中,公众号:AI入门小白
信息可视化(也叫绘图)是数据分析中最重要的⼯作之⼀。它可能是探索过程的⼀部分,例如,帮助我们找出异常值、必要的数据转换、得出有关模型的idea
等。另外,做⼀个可交互的数据可视化也许是⼯作的最终⽬标。Python有许多库进⾏静态或动态的数据可视化,但我这⾥重要关注于matplotlib
(http://matplotlib.org/ )和基于它的库。
matplotlib
衍⽣出了多个数据可视化的⼯具集,它们使⽤matplotlib
作为底层。其中之⼀是seaborn
(http://seaborn.pydata.org/ )。
matplotlib
的通常约定是:
import matplotlib.pyplot as plt
%matplotlib notebook # 用于在notebook中进行交互式绘图
在Jupyter
中运⾏%matplotlib notebook
(或在IPython
中运⾏%matplotlib
),就可以创建⼀个简单的图形。
import numpy as np
data = np.arange(10)
data
plt.plot(data)
matplotlib
的图像都位于Figure
对象中。你可以⽤plt.figure
创建⼀个新的Figure
:
fig = plt.figure()
如果⽤的是IPython
,这时会弹出⼀个空窗⼝,但在Jupyter
中,必须再输⼊更多命令才能看到。plt.figure
有⼀些选项,特别是figsize
,它⽤于确保当图⽚保存到磁盘时具有⼀定的⼤⼩和纵横⽐。
不能通过空Figure
绘图。必须⽤add_subplot
创建⼀个或多个subplot
才⾏:
ax1 = fig.add_subplot(2, 2, 1)
这条代码的意思是:图像应该是2×2的(即最多4张图),且当前选中的是4个subplot
中的第⼀个(编号从1开始)。
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
提示:使⽤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)
如果这时执⾏⼀条绘图命令(如plt.plot([1.5, 3.5, -2, 1.6])
),matplotlib
就会在最后⼀个⽤过的subplot
(如果没有则创建⼀个)上进⾏绘制,隐藏创建figure
和subplot
的过程。因此,如果我们执⾏下列命令,你就会得到如上图所示的结果:
plt.plot(np.random.randn(50).cumsum(), 'k--') # cumsum()所有元素的累计和
"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))
你可以在matplotlib
的⽂档中找到各种图表类型。创建包含subplot
⽹格的figure
是⼀个⾮常常⻅的任务,matplotlib
有⼀个更为⽅便的⽅法plt.subplots
,它可以创建⼀个新的Figure
,并返回⼀个含有已创建的subplot
对象的NumPy
数组:
fig, axes = plt.subplots(2, 3)
axes
这是⾮常实⽤的,因为可以轻松地对axes
数组进⾏索引,就好像是⼀个⼆维数组⼀样,例如axes[0,1]
。你还可以通过sharex
和sharey
指定subplot
应该具有相同的X
轴或Y
轴。在⽐较相同范围的数据时,这也是⾮常实⽤的,否则,matplotlib
会⾃动缩放各图表的界限。有关该⽅法的更多信息,请参⻅下表:
默认情况下,matplotlib
会在subplot
外围留下⼀定的边距,并在subplot
之间留下⼀定的间距。间距跟图像的⾼度和宽度有关,因此,如果你调整了图像⼤⼩(不管是编程还是⼿⼯),间距也会⾃动调整。利⽤Figure
的subplots_adjust
⽅法可以轻⽽易举地修改间距,此外,它也是个顶级函数:
plt.subplots_adjust(left=None, bottom=None, right=None, top=None,
wspace=None, hspace=None)
wspace
和hspace
⽤于控制宽度和⾼度的百分⽐,可以⽤作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)
注意:matplotlib
不会检查标签是否重叠,所以对于这种情况,你只能⾃⼰设定刻度位置和刻度标签。
matplotlib
的plot
函数接受⼀组X
和Y
坐标,还可以接受⼀个表示颜⾊和线型的字符串缩写。例如,要根据x
和y
绘制绿⾊虚线,你可以执⾏如下代码:
ax.plot(x, y, 'g--')
这种在⼀个字符串中指定颜⾊和线型的⽅式⾮常⽅便。在实际中,如果你是⽤代码绘图,你可能不想通过处理字符串来获得想要的格式。通过下⾯这种更为明确的⽅式也能得到同样的效果:
ax.plot(x, y, linestyle='--', color='g')
常⽤的颜⾊可以使⽤颜⾊缩写,你也可以指定颜⾊码(例如,'#CECECE'
)。你可以通过查看plot
的⽂档字符串查看所有线型的合集(在IPython
和Jupyter
中使⽤plot?
)。
线图可以使⽤标记强调数据点。因为matplotlib
可以创建连续线图,在点之间进⾏插值,因此有时可能不太容易看出真实数据点的位置。标记也可以放到格式字符串中,但标记类型和线型必须放在颜⾊后⾯。
为了说明⾃定义轴,我将创建⼀个简单的图像并绘制⼀段随机漫步:
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.random.randn(1000).cumsum())
要改变x
轴刻度,最简单的办法是使⽤set_xticks
和set_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')
rotation
选项设定x
刻度标签倾斜30度。最后,再⽤set_xlabel
为X
轴设置⼀个名称,并⽤set_title
设置⼀个标题(⻅上图的结果):
ax.set_title('My first matplotlib plot')
ax.set_xlabel('stages')
Y
轴的修改⽅式与此类似,只需将上述代码中的x
替换为y
即可。轴的类有集合⽅法,可以批量设定绘图选项。前⾯的例⼦,也可以写为:
props = {
'title': 'My first matplotlib plot',
'xlabel': 'Stages' }
ax.set(**props)
ax.set_ylabel('world')
图例(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')
在此之后,你可以调⽤ax.legend()
或plt.legend()
来⾃动创建图例:
ax.legend(loc='best')
legend
⽅法有⼏个其它的loc
位置参数选项。请查看⽂档字符串(使⽤ax.legend?
)。
loc
告诉matplotlib
要将图例放在哪。如果你不是吹⽑求疵的话,"best"
是不错的选择,因为它会选择最不碍事的位置。要从图例中去除⼀个或多个元素,不传⼊label
或传⼊label='nolegend'
即可。
使用rc配置文件来自定义图形的各种默认属性,如设置中文字体等
属性总结详情
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。