前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

以下文章来源于码客趣分享,作者码客趣分享

matplotlib的通常引入约定是:

In [11]: import matplotlib.pyplot as plt

在Jupyter中运行%matplotlib notebook(或在IPython中运行%matplotlib),就可以创建一个简单的图形。如果一切设置正确,会看到图9-1:

In [12]: importnumpy 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。

笔记:虽然本书没有详细地讨论matplotlib的各种功能,但足以将你引入门。matplotlib的示例库和文档是学习高级特性的最好资源。

1.1 Figure和Subplot

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

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

如果用的是IPython,这时会弹出一个空窗口,但在Jupyter中,必须再输入更多命令才能看到。plt.figure有一些选项,特别是figsize,它用于确保当图片保存到磁盘时具有一定的大小和纵横比。

不能通过空Figure绘图。必须用add_subplot创建一个或多个subplot才行:

In [17]: ax1 = fig.add_subplot(2, 2, 1)

这条代码的意思是:图像应该是2×2的(即最多4张图),且当前选中的是4个subplot中的第一个(编号从1开始)。如果再把后面两个subplot也创建出来,最终得到的图像如图9-2所示:

In [18]: ax2 = fig.add_subplot(2, 2, 2)

In [19]: 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的过程。因此,如果我们执行下列命令,你就会得到如图9-3所示的结果:

In [20]: plt.plot(np.random.randn(50).cumsum(), 'k--')

"k--"是一个线型选项,用于告诉matplotlib绘制黑色虚线图。上面那些由fig.add_subplot所返回的对象是AxesSubplot对象,直接调用它们的实例方法就可以在其它空着的格子里面画图了,如图9-4所示:

In [21]: ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)

In [22]: ax2.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))

你可以在matplotlib的文档中找到各种图表类型。

创建包含subplot网格的figure是一个非常常见的任务,matplotlib有一个更为方便的方法plt.subplots,它可以创建一个新的Figure,并返回一个含有已创建的subplot对象的NumPy数组:

In [24]: fig, axes = plt.subplots(2, 3)

In [25]: axes

Out[25]:

array([[,,],

[,,]], dtype=object)

这是非常实用的,因为可以轻松地对axes数组进行索引,就好像是一个二维数组一样,例如axes[0,1]。你还可以通过sharex和sharey指定subplot应该具有相同的X轴或Y轴。在比较相同范围的数据时,这也是非常实用的,否则,matplotlib会自动缩放各图表的界限。有关该方法的更多信息,请参见表9-1。

1.2 调整subplot周围的间距

默认情况下,matplotlib会在subplot外围留下一定的边距,并在subplot之间留下一定的间距。间距跟图像的高度和宽度有关,因此,如果你调整了图像大小(不管是编程还是手工),间距也会自动调整。利用Figure的subplots_adjust方法可以轻而易举地修改间距,此外,它也是个顶级函数:

subplots_adjust(left=None, bottom=None, right=None, top=None,

wspace=None, hspace=None)

wspace和hspace用于控制宽度和高度的百分比,可以用作subplot之间的间距。下面是一个简单的例子,其中我将间距收缩到了0(如图9-5所示):

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不会检查标签是否重叠,所以对于这种情况,你只能自己设定刻度位置和刻度标签。后面几节将会详细介绍该内容。

1.3 颜色、标记和线型

matplotlib的plot函数接受一组X和Y坐标,还可以接受一个表示颜色和线型的字符串缩写。例如,要根据x和y绘制绿色虚线,你可以执行如下代码:

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

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

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

常用的颜色可以使用颜色缩写,你也可以指定颜色码(例如,'#CECECE')。你可以通过查看plot的文档字符串查看所有线型的合集(在IPython和Jupyter中使用plot?)。

线图可以使用标记强调数据点。因为matplotlib可以创建连续线图,在点之间进行插值,因此有时可能不太容易看出真实数据点的位置。标记也可以放到格式字符串中,但标记类型和线型必须放在颜色后面(见图9-6):

In [30]: from numpy.random importrandn

In [31]: plt.plot(randn(30).cumsum(), 'ko--')

还可以将其写成更为明确的形式:

plot(randn(30).cumsum(), color='k', linestyle='dashed', marker='o')

在线型图中,非实际数据点默认是按线性方式插值的。可以通过drawstyle选项修改(见图9-7):

In [33]: data = np.random.randn(30).cumsum()

In [34]: plt.plot(data, 'k--', label='Default')

Out[34]: []

In [35]: plt.plot(data, 'k-', drawstyle='steps-post', label='steps-post')

Out[35]: []

In [36]: plt.legend(loc='best')

你可能注意到运行上面代码时有输出。matplotlib会返回引用了新添加的子组件的对象。大多数时候,你可以放心地忽略这些输出。这里,因为我们传递了label参数到plot,我们可以创建一个plot图例,指明每条使用plt.legend的线。

笔记:你必须调用plt.legend(或使用ax.legend,如果引用了轴的话)来创建图例,无论你绘图时是否传递label标签选项。

1.4 刻度、标签和图例

对于大多数的图表装饰项,其主要实现方式有二:

(1)使用过程型的pyplot接口(例如,matplotlib.pyplot)

(2)更为面向对象的原生matplotlib API。

pyplot接口的设计目的就是交互式使用,含有诸如xlim、xticks和xticklabels之类的方法。它们分别控制图表的范围、刻度位置、刻度标签等。其使用方式有以下两种:

调用时不带参数,则返回当前的参数值(例如,plt.xlim()返回当前的X轴绘图范围)。

调用时带参数,则设置参数值(例如,plt.xlim([0,10])会将X轴的范围设置为0到10)。

所有这些方法都是对当前或最近创建的AxesSubplot起作用的。它们各自对应subplot对象上的两个方法,以xlim为例,就是ax.get_xlim和ax.set_xlim。我更喜欢使用subplot的实例方法(因为我喜欢明确的事情,而且在处理多个subplot时这样也更清楚一些)。当然你完全可以选择自己觉得方便的那个。

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

为了说明自定义轴,我将创建一个简单的图像并绘制一段随机漫步(如图9-8所示):

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。前者告诉matplotlib要将刻度放在数据范围中的哪些位置,默认情况下,这些位置也就是刻度标签。但我们可以通过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设置一个标题(见图9-9的结果):

In [42]: ax.set_title('My first matplotlib plot')

Out[42]: In [43]: ax.set_xlabel('Stages')

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

props ={'title': 'My first matplotlib plot','xlabel': 'Stages'}

ax.set(**props)

1.6 添加图例

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

In [44]: from numpy.random importrandn

In [45]: fig = plt.figure(); ax = fig.add_subplot(1, 1, 1)

In [46]: ax.plot(randn(1000).cumsum(), 'k', label='one')

Out[46]: []

In [47]: ax.plot(randn(1000).cumsum(), 'k--', label='two')

Out[47]: []

In [48]: ax.plot(randn(1000).cumsum(), 'k.', label='three')

Out[48]: []

在此之后,你可以调用ax.legend()或plt.legend()来自动创建图例(结果见图9-10):

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

legend方法有几个其它的loc位置参数选项。请查看文档字符串(使用ax.legend?)。

loc告诉matplotlib要将图例放在哪。如果你不是吹毛求疵的话,"best"是不错的选择,因为它会选择最不碍事的位置。要从图例中去除一个或多个元素,不传入label或传入label='_nolegend_'即可。

1.7 注解以及在Subplot上绘图

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

ax.text(x, y, 'Hello world!',

family='monospace', fontsize=10)

注解中可以既含有文本也含有箭头。例如,我们根据最近的标准普尔500指数价格(来自Yahoo!Finance)绘制一张曲线图,并标出2008年到2009年金融危机期间的一些重要日期。你可以在Jupyter notebook的一个小窗中试验这段代码(图9-11是结果):

from datetime importdatetime

fig=plt.figure()

ax= fig.add_subplot(1, 1, 1)

data= pd.read_csv('examples/spx.csv', index_col=0, parse_dates=True)

spx= data['SPX']

spx.plot(ax=ax, style='k-')

crisis_data=[

(datetime(2007, 10, 11), 'Peak of bull market'),

(datetime(2008, 3, 12), 'Bear Stearns Fails'),

(datetime(2008, 9, 15), 'Lehman Bankruptcy')

]for date, label incrisis_data:

ax.annotate(label, xy=(date, spx.asof(date) + 75),

xytext=(date, spx.asof(date) + 225),

arrowprops=dict(facecolor='black', headwidth=4, width=2,

headlength=4),

horizontalalignment='left', verticalalignment='top')#Zoom in on 2007-2010

ax.set_xlim(['1/1/2007', '1/1/2011'])

ax.set_ylim([600, 1800])

ax.set_title('Important dates in the 2008-2009 financial crisis')

这张图中有几个重要的点要强调:ax.annotate方法可以在指定的x和y坐标轴绘制标签。我们使用set_xlim和set_ylim人工设定起始和结束边界,而不使用matplotlib的默认方法。最后,用ax.set_title添加图标标题。

更多有关注解的示例,请访问matplotlib的在线示例库。

图形的绘制要麻烦一些。matplotlib有一些表示常见图形的对象。这些对象被称为块(patch)。其中有些(如Rectangle和Circle),可以在matplotlib.pyplot中找到,但完整集合位于matplotlib.patches。

要在图表中添加一个图形,你需要创建一个块对象shp,然后通过ax.add_patch(shp)将其添加到subplot中(如图9-12所示):

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)

「如果查看许多常见图表对象的具体实现代码,你就会发现它们其实就是由块patch组装而成的。」

1.8 将图表保存到文件

利用plt.savefig可以将当前图表保存到文件。该方法相当于Figure对象的实例方法savefig。例如,要将图表保存为SVG文件,你只需输入:

plt.savefig('figpath.svg')

文件类型是通过文件扩展名推断出来的。因此,如果你使用的是.pdf,就会得到一个PDF文件。我在发布图片时最常用到两个重要的选项是dpi(控制“每英寸点数”分辨率)和bbox_inches(可以剪除当前图表周围的空白部分)。要得到一张带有最小白边且分辨率为400DPI的PNG图片,你可以:

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

savefig并非一定要写入磁盘,也可以写入任何文件型的对象,比如BytesIO:

from io importBytesIO

buffer=BytesIO()

plt.savefig(buffer)

plot_data= buffer.getvalue()

表9-2列出了savefig的其它选项。

python画仿真图-Python数据分析:绘图可视化之matplotlib入门相关推荐

  1. python画折线图-python如何画折线图

    python画折线图利用的是matplotlib.pyplot.plot的工具来绘制折线图,这里先给出一个段代码和结果图:# -*- coding: UTF-8 -*- import numpy as ...

  2. python画仿真图-仿真入门:几行 Python 代码实现复杂社会动力学

    原标题:仿真入门:几行 Python 代码实现复杂社会动力学 编译:伯乐在线专栏作者 - Ree Ray 我们将对同一群体内两种文化特征(cultural traits)的相互竞争进行建模.这是典型的 ...

  3. python画超长图-python 画长图

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 最近遇到个任务需要画一些坐标图,我就在想,用了这么长时间的 python 了,能不 ...

  4. python画双折线图-python双折线图

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! practice.png双y轴折线图(plot both of those pl ...

  5. python画雷达图-python 雷达图

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 假设某天某地每三个小时取样的气温为 0时 3时 6时 9时 12时 15 ...

  6. python画雷达图-Python 详解雷达图/蛛网图

    雷达图-pyecharts 蛛网图,最早知道是在玩FIFA游戏的时候,球员的能力用蛛网图来表示与比较,那时觉得非常新鲜.后来,在实际的工作中,其实很少用到:一方面,直接提供蛛网图的工具少:另一方面,过 ...

  7. python画动态图-python画动态图

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 而漂漂亮亮的可视化是完成这一任务的绝佳工具. 本文将介绍 5 种非传统的 ...

  8. python画折线图-python绘制简单折线图代码示例

    1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...

  9. 如何使用python画折线图-Python 使用 matplotlib 画折线图教程

    话不多说,直接上代码.最近修改一篇论文,实验部分的图全部重画了一下,也正好在此进行整理.使用 Python 的 matplotlib 库来画图还是比较方便的,今天整理一下用 matplotlib 画折 ...

最新文章

  1. 在OSX上安装Erlang
  2. MOSS User Profile(一):获取和遍历
  3. 回顾 | Alibaba Cloud Native Day 杭州场圆满结束(附 PPT 下载)
  4. for循环中new的对象什么时候被回收_你真的了解JS里的 new 吗?
  5. c语言程序不用编译即可被计算机识别运行,2011秋华农c语言试卷
  6. c++类名字查找与类的作用域
  7. hadoop安装详细步骤_推荐一个超详细的Hadoop安装教程,已有32万次阅读
  8. CNN 手写数字识别
  9. 原 CSS3中的过渡,css3之过渡
  10. TensorFlow神经网络(九)VGG net论文阅读笔记
  11. 解决vi/vim中粘贴会在行首多很多缩进和空格的问题
  12. abb机器人gsd文件_ABB机器人控制器死机故障维修
  13. ajax、axios、fetch之间的详细区别以及优缺点
  14. 网络管理员掌握的学习方法
  15. 无法从“cstring”转换为“lpcstr”_别用Sketchup一个个转模型的版本了,用这些批量转换器真香…...
  16. getParameterValues中文乱码
  17. 如何使用内网穿透,将自己的内网接口暴露到外网
  18. Struts2(一)
  19. springboot项目在cmd窗口运行后台卡顿问题
  20. 利用sympy库求解常微分方程:dsolve()函数

热门文章

  1. php数据库滚动文字_PHP 里用的文字左右滚动?
  2. ida android sign加密,最右sign-v2签名算法追踪及逆向还原
  3. java 字符整数_Java整数是否等于字符?
  4. 编程一个最简单游戏_一个关于AI编程的游戏
  5. 怎样用python自动化办公_会python基础,如何学习自动化办公?
  6. 开发日记-20190618 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  7. cordova在IOS初次运行,loading加载很久的解决办法
  8. 第三次作业——结对编程
  9. Java-Web监听器
  10. 剪切板与正则表达式测试