赞
踩
信息可视化(也叫绘图)是数据分析中最重要的⼯作之⼀。
import numpy as np
import pandas as pd
PREVIOUS_MAX_ROWS = pd.options.display.max_rows
pd.options.display.max_rows = 20
np.random.seed(12345)
import matplotlib.pyplot as plt
import matplotlib
plt.rc('figure', figsize=(10, 6))
np.set_printoptions(precision=4, suppress=True)
matplotlib的通常引⼊约定是:
#导入包
import matplotlib.pyplot as plt
在Jupyter中运⾏%matplotlib notebook(或在IPython中运⾏%matplotlib),就可以创建⼀个简单的图形。如果⼀切设置正确,会看到下图:
import numpy as np
data = np.arange(10)
data
#绘制简单的线图
plt.plot(data)
虽然seaborn这样的库和pandas的内置绘图函数能够处理许多普通的绘图任务,但如果需要⾃定义⼀些⾼级功能的话就必须学习matplotlib API。
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开始)。如果再把后⾯两个subplot也创建出来,最终得到的图像如下图所示:
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(np.random.randn(50).cumsum(), 'k--')
如果这时执⾏⼀条绘图命令(如plt.plot([1.5, 3.5, -2, 1.6])),
matplotlib就会在最后⼀个⽤过的subplot(如果没有则创建⼀
个)上进⾏绘制,隐藏创建figure和subplot的过程。因此,如果
我们执⾏下列命令,你就会得到如下图所示的结果:
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(np.random.randn(50).cumsum(), 'k--')
"k–"是⼀个线型选项,⽤于告诉matplotlib绘制⿊⾊虚线图。上⾯那些由fig.add_subplot所返回的对象是AxesSubplot对象,直接调⽤它们的实例⽅法就可以在其它空着的格⼦⾥⾯画图了,如下图所示:
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(np.random.randn(50).cumsum(), 'k--')
#继续绘制两次
_ = 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会⾃动缩放各图表的界限。有关该⽅法的更多信息,请参⻅表1。
下表为表1:
参数 | 说明 |
---|---|
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)) |
默认情况下,matplotlib会在subplot外围留下⼀定的边距,并在subplot之间留下⼀定的间距。间距跟图像的⾼度和宽度有关,因此,如果你调整了图像⼤⼩(不管是编程还是⼿⼯),间距也会⾃动调整。利⽤Figure的subplots_adjust⽅法可以轻⽽易举地修改间距,此外,它也是个顶级函数:
PS:调试过程中发现书中源代码无法运行,在此处更改了。
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。