![机器学习数学基础一本通(Python版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/939/52841939/b_52841939.jpg)
第1章
数据可视化
机器学习中许多时候需要将数据可视化,方便更直观地表现目前的数据,所以本书先介绍数据图形的绘制,所使用的工具是matplotlib绘图库模块,使用前需先安装:
pip install matplotlib
matplotlib是一个庞大的绘图库模块,本章我们只导入其中的pyplot子模块就可以完成许多图表绘制,如下所示,未来就可以使用plt调用相关的方法。
import matplotlib.pyplot as plt
本章将叙述matplotlib的重点内容,完整使用说明可以参考matplotlib的官方网站。
1-1 认识matplotlib.pyplot模块的主要函数
下列是绘制图表的常用函数。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-T12_148077.jpg?sign=1738830165-R462A32GXvs9kLeDEyXtPUe7hS9RG5Fa-0-e6b5d985a929946acb79f555ff9f22cf)
下列是坐标轴设定的常用函数。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-T12_148078.jpg?sign=1738830165-c5R8q0LRGY92b0TSDesTL0rDJcyd1qOT-0-234b94f15b8d537ffc6df246d759df81)
下列是图片的读取与储存的函数。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-T12_148079.jpg?sign=1738830165-934vjwynyWRe1nRp1iX6l2IBYrifSDeW-0-7d36bf522c6c74a8dfd6ed32232d08aa)
1-2 绘制简单的折线图plot( )
这一节将从最简单的折线图开始解说,常用语法格式如下:
plot(x, y, lw=x, ls=‘x’, label=‘xxx’, color)
x:x轴系列值,如果省略系列自动标记0,1,…,可参考1-2-1节。
y:y轴系列值,可参考1-2-1节。
lw:linewidth的缩写,折线图的线条宽度,可参考1-2-2节。
ls:linestyle的缩写,折线图的线条样式,可参考1-2-6节。
color:缩写是c,可以设定色彩,可参考1-2-6节。
label:图表的标签,可参考1-2-8节。
1-2-1 画线基础实践
将含数据的列表当作参数传给plot( ),列表内的数据会被视为y轴的值,x轴的值会依列表值的索引位置自动产生。
程序实例ch1_1.py:绘制折线,square[ ]列表有9笔数据代表y轴值,数据基本上是x轴索引0~ 8的平方值序列,这个实例使用列表生成式建立x轴数据。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P13_19065.jpg?sign=1738830165-FSOd84FPQXkzC488KqdGjwbaI6MgBFTF-0-6cd4e3bcf6534b630ff2020747a97eea)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P13_19082.jpg?sign=1738830165-gkWG31HKUbMQMk62mLEx1N1tARE32yzY-0-f3352f2836ba5c52548d56d8ffce9d3e)
在绘制线条时,预设颜色是蓝色,更多相关设定1-2-6节会讲解。如果x轴的数据是0,1,…,n时,在使用plot( )时我们可以省略x轴数据,可以参考下列程序实例。
程序实例ch1_2.py:重新设计ch1_1.py,此实例省略x轴数据。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P13_19092.jpg?sign=1738830165-TBvcfsWRywmPwTHvzQLEU9M9b7B6sleq-0-65cd114fcdab27dc281bd832b7a5b58f)
执行结果
与ch1_1.py相同。
从上述执行结果可以看到左下角的轴刻度不是(0,0),我们可以使用axis( )设定x、y轴的最小和最大刻度。
程序实例ch1_3.py:重新设计ch1_2.py,将x轴刻度设为0~8,y轴刻度设为0~70。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P14_19532.jpg?sign=1738830165-ejNiejY2CGEHZfAd0d5LoK7dUvr6vUH2-0-1eb146cea9df6707834f835fb5881edf)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P14_19535.jpg?sign=1738830165-2SIv8XsSi4PIcPFkp6v5R45FxUFNdDqE-0-0bed7035c848e2c093cb3dcc7a9b1fc8)
在做数据分析时,有时候会想要在图表内增加网格线,这可以让图表中x轴值对应的y轴值更加清楚,可以使用grid( )函数。
程序实例ch1_3_1.py:增加网格线重新设计ch1_3.py,此程序重点是第7行。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P14_19545.jpg?sign=1738830165-LNbok85i5s39XDJS6OGO12VjvORIPioA-0-6cc286dc1971bc9462d8c93d81640277)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P14_19548.jpg?sign=1738830165-LgBx1SxuDnQLR5xDMvTdz0oZjJc06MBB-0-af00678d5fbc76a3e5f25669dbd8ce2b)
1-2-2 线条宽度linewidth
使用plot( )时预设线条宽度是1,可以多加一个linewidth(缩写是lw)参数设定线条的粗细。
程序实例ch1_4.py:设定线条宽度是10,使用lw=10。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P14_19559.jpg?sign=1738830165-WjdOPQCpngnwNVLk5elyD6vTMF2jO9uK-0-95896bc9146c22487c83029a700a416d)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P14_19562.jpg?sign=1738830165-aerHSNg7H9eihja6mZ7Uj1FZegSlXf46-0-fb0d76f189aa23f155ac3745cd04364f)
1-2-3 标题的显示
目前matplotlib模块默认不支持中文显示,笔者将在1-5节讲解如何让图表显示中文,下列是几个显示标题的重要方法。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P15_148095.jpg?sign=1738830165-lIAmBqdgYZRWOZyKUv022yMyqD0bsRLp-0-9fc0658824325e7ee3b51a8e7b78caff)
上述方法默认字号大小是12,但是可以使用fontsize参数更改字号。
程序实例ch1_5.py:使用默认字号为图表与x、y轴建立标题。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P15_20000.jpg?sign=1738830165-sAjePynql1iz9jBLkTC68m98MnhDiZnm-0-f8c793f58c253220e06e242e6aa47d99)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P15_20003.jpg?sign=1738830165-mc5Nki0XIhg0RUgURplBWheg5NqyS2r7-0-f11c0671ca0c3948c02f80366fe041f9)
程序实例ch1_6.py:使用设定字号24建立图表标题,字号16建立x、y轴标题。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P15_20013.jpg?sign=1738830165-TxtURbiwKmq6mbpD8yCqxwKUKllspeb8-0-c063b0aacb9c7eb509e6fa867de793ce)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P15_20016.jpg?sign=1738830165-SaYa7GUKzLZ3MRFC8UDvG36MnTUYGoXH-0-fce419c63d99035abdb1d82ef05b4205)
1-2-4 坐标轴刻度的设定
在设计图表时可以使用tick_params( )设计设定坐标轴的刻度大小、颜色以及应用范围。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P15_148097.jpg?sign=1738830165-ze9MKKeMWAc2Nw0YZO9webRGSiDULjzc-0-4797a737f72113a5d5c000026091ceb3)
如果axis的xx是both,代表应用到x轴和y轴;如果xx是x,代表应用到x轴;如果xx是y,代表应用到y轴。color则是设定刻度的线条颜色,例如:red代表红色,1-2-6节将有颜色表。
程序实例ch1_7.py:使用不同刻度与颜色绘制图表。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P16_20455.jpg?sign=1738830165-4DUdrqv1NXkXwhLCOq74034jIbeQ2ank-0-df7b44c6fc547c747b5d72ea54ab1b6e)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P16_20458.jpg?sign=1738830165-VTyZ7ib5xxL3QaCP7T086nRYC6QwJXQB-0-0d999dbf7919cd3d60d69a5a1d64672d)
1-2-5 多组数据的应用
目前所有的图表皆是只有一组数据,其实可以扩充多组数据,只要在plot( )内增加数据列表参数即可。此时plot( )的参数如下:
plot(seq, 第一组数据, seq, 第二组数据, … )
程序实例ch1_8:设计含多组数据的图表。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P16_20470.jpg?sign=1738830165-FzaHeEBZY4V39BbbfAkPL86Bj70otG3B-0-7fbb825e09c0a346eec9cbbed46771fc)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P16_20473.jpg?sign=1738830165-bNwHWI9Irw2P1mnxg11NwJfGoHEFV9sS-0-aae2333fca8d0307c86bc7ae5c1273e8)
上述以不同颜色显示线条是系统默认,我们也可以自定义线条色彩。
1-2-6 线条色彩与样式
如果想设定线条色彩,可以在plot( )内增加下列color颜色参数设定,下列是常见的色彩。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-T16_20982.jpg?sign=1738830165-F0kVAjkdblmvUGWn6SDnm2KbmDNUfjB7-0-be02de69ebb72721c651360568fe2239)
下列是常见的样式。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-T17_21683.jpg?sign=1738830165-c8AFkrKmtBN0hO8niNfoNBf4xQtszHEe-0-52ceb6df001620c4282f5c7fb038b245)
上述可以混合使用,例如‘r-.’代表红色虚点线。
程序实例ch1_9.py:采用不同色彩与线条样式绘制图表。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P17_21250.jpg?sign=1738830165-JuvMylICRFK5VhDN6odh0OgvShDGuaNT-0-775149a594cbfaea4271e7a6fa75e1c9)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P17_21254.jpg?sign=1738830165-2zpP1Gmd3lEBXGrbwmV6MVtTDlXoR8Bm-0-978d7f2738dfd4366a6c046b7c45d4d8)
上述第10行最右边的‘k.’代表绘制黑点而不是绘制线条,读者也可以使用不同颜色绘制散点图,1-3节也会介绍另一个方法scatter( )绘制散点图。上述格式应用是很灵活的,如果我们使用‘-*’可以绘制线条,同时在指定点加上星星标记。注:如果没有设定颜色,系统会自行配置颜色。
程序实例ch1_10.py:重新设计ch1_9.py绘制线条,同时为各个点加上标记,程序重点是第10行。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P18_21693.jpg?sign=1738830165-GsKwhqW3yWyq8rR0hvcbicII81x4JUhR-0-f7581f306e660d5283056f9903420f73)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P18_21696.jpg?sign=1738830165-lsE85JS1kp9USwXwpmOoDhRDZUahgNAi-0-af4d279afa9741a494c130493cc02643)
1-2-7 刻度设计
目前,所有图表的x轴和y轴的刻度皆是plot( )方法针对所输入的参数默认设定的,请先参考下列实例。
程序实例ch1_11.py:假设3大品牌车辆2021—2023年的销售数据如下:
Benz 3367 4120 5539
BMW 4000 3590 4423
Lexus 5200 4930 5350
请将上述数据绘制成图表。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P18_21707.jpg?sign=1738830165-R8q64eZnNWE3as05WhaOeXvU0nA9sQlG-0-aa3423525adf87599cfc50ea7f00c569)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P18_21710.jpg?sign=1738830165-La0zClYdqnw4i3PmhfBHs5q12OMUtNoW-0-b7dfbd963530d51124f8a74494c6567d)
上述程序最大的遗憾是x轴的刻度,对我们而言,其实只要有2021、2022、2023这3个刻度即可,还好可以使用pyplot模块的xticks( )、yticks( )分别设定x、y轴刻度,可参考下列实例。
程序实例ch1_12.py:重新设计ch1_11.py,自行设定刻度,这个程序的重点是第9行,将seq列表当作参数放在plt.xticks( )内。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P19_1.jpg?sign=1738830165-Gv4cRFhyKwdjDHt3CfKepd40Z9cUmNNh-0-a68739afcb3d8fb3d5337a5a9fdbe82d)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P19_22151.jpg?sign=1738830165-SjKPkIjEXGR12DzrjwU9FyHz7yDFvWAb-0-acfe1f84943c16714598e71422568df6)
1-2-8 图例legend( )
本章所建立的图表,应该说已经很好了,缺点是缺乏各种线条代表的意义,在Excel中称图例(legend),下列笔者将直接以实例说明。
程序实例ch1_13.py:为ch1_12.py建立图例。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P19_22162.jpg?sign=1738830165-VtX9MwyymboVi5VeFxA4usc8d2H7RgTN-0-423398d71b5740dbe7ac630e72f26d4c)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P19_22165.jpg?sign=1738830165-3jFYb9Otmql6RyTc2fYp08x7oZxHDt1f-0-3ca2934fea52103d497b1e0349361657)
这个程序最大不同在第10~12行,下列是以第10行解释。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P19_148111.jpg?sign=1738830165-RDh6LvCQyWfKHZEprK9a8cWqQsks33nR-0-98ffd14026b3d3ac1cc4ee6574285b31)
上述调用plt.plot( )时需同时设定label,最后使用第13行的方式执行legend( )图例的调用。其中参数loc可以设定图例的位置,可以有下列设定方式:
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P19_148109.jpg?sign=1738830165-MpVdhJCmBZDWtet9fpxUJZTLpPX1R2hq-0-5f35fa81bc8993c7bbd9e49cb4da5f41)
如果省略loc设定,则使用预设‘best’,在应用时可以使用设定整数值,例如:设定loc=0与上述效果相同。若是顾虑程序可读性,建议使用文字字符串方式设定,当然也可以直接设定数字。
程序实例ch1_13_1.py:在ch1_13.py的基础上省略loc设定。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P20_22604.jpg?sign=1738830165-Xzax6552K0zRr8tM1cAOrIREvlZNLdtU-0-649067859d12e6b52991828d8ea00436)
执行结果 与ch1_13.py相同。
程序实例ch1_13_2.py:在ch1_13.py的基础上设定loc=0。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P20_22608.jpg?sign=1738830165-iTbVxYc3PvOnKbDaWCuRkvUk27LsLmht-0-3a2df549923fae2786f842abb8ce41e3)
执行结果 与ch1_13.py相同。
程序实例ch1_13_3.py:在ch1_13.py的基础上设定图例在右上角。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P20_22612.jpg?sign=1738830165-hAl6GAQPV9e6Dccp2LGUoRWYdMjrf3k6-0-a3aa1c4cd216b01b685e32e64cf90a2e)
执行结果 下方左图。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P20_22615.jpg?sign=1738830165-P0tvlbcRrH2orH0ofdnoMIASakAYIeDp-0-fcfbe9719ed8451b2e70a9916934527c)
程序实例ch1_13_4.py:在ch1_13.py的基础上设定图例在左边中央。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P20_22619.jpg?sign=1738830165-cmRvAzMt9jmvMb78NCX9tF3fHsMvnNft-0-a3581cc60edb88fa725f208348815bbd)
执行结果 如上右图。
经过上述解说,我们已经可以将图例放在图表内了。如果想将图例放在图表外,需要先理解坐标,在图表内左下角位置坐标是(0,0),右上角位置坐标是(1,1),概念如下:
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P21_23081.jpg?sign=1738830165-EdHHj9OIkTas2QaqzntHveFDdNTY2x2K-0-6df6d21981acd8fcef12f2c734642834)
首先需使用bbox_to_anchor( )当作legend( )的一个参数,设定锚点(anchor),也就是图例位置,例如:如果我们想将图例放在图表右上角外侧,需设定loc=‘upper left’,然后设定bbox_to_anchor(1,1)。
程序实例ch1_13_5.py:在ch1_13.py的基础上将图例放在图表右上角外侧。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P21_23084.jpg?sign=1738830165-WMkGWgFsSU7VCBj3iytLojZc3MZ8LPhg-0-0b1791013978731cb77a409d75482c78)
执行结果 下方左图。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P21_23087.jpg?sign=1738830165-4w2phEkOZvRsxpOYCt4TDO8hTYanEO8S-0-fb5126f66f3c74f8462399bfdb0960e3)
上述最大的缺点是由于图表与Figure 1的留白不足,造成无法完整显示图例。matplotlib模块内有tight_layout( )函数,可利用设定pad参数在图表与Figure 1间设定留白。
程序实例ch1_13_6.py:设定pad=7,重新设计ch1_13_5.py。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P21_23091.jpg?sign=1738830165-BlmkAwSpZYndTBY89p3LR5DmXjSaU5gZ-0-c1b7bb0f65f58df5355ae4200e1c06bc)
执行结果 可参考如上右图。
很明显图例显示不完整的问题改善了。如果将pad改为h_pad/w_pad可以分别设定高度/宽度的留白。
1-2-9 保存与开启文件
图表设计完成,可以使用savef i g( )保存文件,这个方法需放在show( )的前方,表示先储存再显示图表。
程序实例ch1_14.py:扩充ch1_13.py,在屏幕显示图表前,先将图表存入目前文件夹的out1_14.jpg。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P22_23541.jpg?sign=1738830165-OaJlxYHrI4W5Jbcs4Nuz3oOI4BSebqPv-0-2d89f16e1b3f8437700288baae3ffa59)
执行结果
读者可以在ch1文件夹看到out1_14.jpg文件。
上述plt.savef i g( )中第一个参数是所存的文件名,第二个参数是将图表外多余的空间删除。
要开启文件可以使用matplotlib.image模块,可以参考下列实例。
程序实例ch1_15.py:开启out1_14.jpg文件。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P22_23553.jpg?sign=1738830165-qwpWfwZbVwxJQaN2COqUetb34Q54Gq0q-0-b2d4b4d80bdd3b54e206b662490da3ee)
执行结果
上述程序可以顺利开启out1_14.jpg文件。
1-2-10 在图上标记文字
在绘制图表过程中,有时需要在图上标记文字,这时可以使用text( )函数,此函数基本格式如下:
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P22_148125.jpg?sign=1738830165-xpQ5v0fMcGnU9YLtImG88whTApmDM8yb-0-d60ab47ef267cccb28954fdce26f3b86)
x,y是文字输出的左下角坐标,它不是绝对坐标,是相对坐标,大小会随着坐标刻度增减。
程序实例ch1_15_1.py:增加文字重新设计ch1_3_1.py。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P22_23566.jpg?sign=1738830165-snLftAq3kMJmX7azoX4e4p2bEg7Mb4pY-0-00266979279addf76a08d9906ca15e8d)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P22_23569.jpg?sign=1738830165-O5Jo1V9oomW9yeQ5o5WqnNNpFo0BxFgM-0-fdfdd6002e77abf4e4d28924093b04f4)
1-3 绘制散点图scatter( )
前方介绍了可以使用plot( )绘制散点图,本节将介绍绘制散点图的常用方法scatter( )。
1-3-1 基本散点图的绘制
绘制散点图可以使用scatter( ),基本语法如下(更多参数后面章节会解说):
scatter(x, y, s, c, cmap)
x,y:在(x,y)位置绘图。 c:颜色,可以参考1-2-6节。
s:绘图点的大小,预设是20。 cmap:彩色图表,可以参考1-4-5节。
程序实例ch1_16.py:在坐标轴(5,5)绘制一个点。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P23_24023.jpg?sign=1738830165-w4U3q28QI5m9H2xQ8wUyOtkjn9jUWQGX-0-df3448d5b1810da614365fcf24e10c81)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P23_24026.jpg?sign=1738830165-OzjhxWmRn4hXJX03RbjY05MSy5VSUiLI-0-1997a08ecd950cc195abfdb08e9d11d1)
1-3-2 绘制系列点
如果我们想绘制系列点,可以将系列点的x轴值放在一个列表,y轴值放在另一个列表,然后将这2个列表作为参数放在scatter( )即可。
程序实例ch1_17.py:绘制系列点的应用。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P23_24037.jpg?sign=1738830165-zBdFHF6qtRdsBk6iHI9p1L9o0dPJJoJV-0-72ba5b4dd4ddf6df644883bb85a36a8a)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P23_24040.jpg?sign=1738830165-NDvLcqCrEtXEE6qblT4eMDqwEEo8hQNM-0-4d4d84fa4b7839c9a4ede063c037c2d4)
在程序设计时,有些系列点的坐标可能是由程序产生,其实应用方式是一样的。另外,可以在scatter( )内增加color(也可用c)参数,可以设定点的颜色。
程序实例ch1_18.py:绘制黄色的系列点,这个系列点有100个点,x轴的点由range(1,101)产生,相对应y轴的值则是x的平方值。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P24_24478.jpg?sign=1738830165-1P9M7raWsEWVtHhKXcdl3SMA7VlAPLBA-0-0cd7339ef200e60974ddc8db5c09eeb9)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P24_24481.jpg?sign=1738830165-vJxxM10vTmbmJX9RQGoIVO8BXQD4pdYQ-0-7a3cbb31dedca6176595749df05c3d1c)
上述程序第6行是直接指定色彩,也可以使用RGB(Red,Green,Blue)颜色模式设定色彩,RGB( )内每个参数数值是0~1。
1-3-3 设定绘图区间
可以使用axis( )设定绘图区间,语法格式如下:
axis([xmin, xmax, ymin, ymax]) # 分别代表x轴和y轴的最小和最大区间
程序实例ch1_19.py:设定绘图区间为[0,100,0,10000]的应用,读者可以将这个执行结果与ch1_18.py做比较。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P24_24494.jpg?sign=1738830165-DTtmhl3Xyr02lAwJRShMlOnH1WM9nDd6-0-443b9b955b6659410ca635b0b3b5e06b)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P24_24497.jpg?sign=1738830165-GxyvPlYmX92mLy6oRcVdLk4VdRHzJJLO-0-cba5b935a42457e7b766632383b63a80)
上述程序第5行是依据xpt列表产生ypt列表值的方式,由于网络上有很多文章使用数组方式产生图表列表,所以下一节笔者将对此做出说明,期待可为读者建立基础。
1-4 numpy模块
numpy是Python的一个扩充模块,可以支持多维度空间的数组与矩阵运算,本节笔者将对其最简单的产生数组的功能做解说,由此可以将这个功能扩充到数据图表的设计。使用前我们需导入numpy模块,如下所示:
import numpy as np
1-4-1 建立一个简单的数组linspace( )和arange( )
在numpy模块中最基本的就是linspace( )方法,使用它可以很方便地产生等距的数组,它的语法如下:
linspace(start, end, num)
start是起始值,end是结束值,num是设定产生多少个等距点的数组值,num的默认值是50。
在网络上阅读他人使用Python设计的图表时,常看到的产生数组的方法是arange( )。其语法如下:
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P25_148138.jpg?sign=1738830165-WGHcHff288aqOdRWZ1C4TeN35o1c6Hyg-0-efb9507f13686d48d6e8b9a4c21d8b9e)
start是起始值,如果省略默认值是0。stop是结束值,但是所产生的数组不包含此值。step是数组相邻元素的间距,如果省略默认值是1。
程序实例ch1_20.py:建立0, 1, …, 9, 10的数组。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P25_24939.jpg?sign=1738830165-uQYspu8DhxJr9nmwVJB4kDaiJ0BID1Jl-0-1fa6581dec5a08b00ddaae6f7db81b0f)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P25_24942.jpg?sign=1738830165-k9ekf9NACeHzvDhaBcon8IDcfRdOnTZM-0-21488a70f95211441d56ba0c4355a1d1)
1-4-2 绘制波形
中学数学中我们有学过sin( )和cos( )概念,其实有了数组数据,我们可以很方便地绘制正弦和余弦的波形变化。单纯绘点可以使用scatter( )方法,此方法使用格式如下:
scatter(x, y, marker=‘.’, c(或color)=‘颜色’) # marker如果省略会 使用预设
程序实例ch1_21.py:绘制sin( )和cos( )的波形,在这个实例中调用plt.scatter( )方法2次,相当于也可以绘制2次波形图表。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P26_25394.jpg?sign=1738830165-TfYvaDbNbhBzlYvZ0P9HuLudmtOtG1Js-0-91a5eef2148f96a2c10a111b62bc6815)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P26_25397.jpg?sign=1738830165-giJr69HiroRLqfzeZJbQDrpFIREHRVr5-0-4ee2e43ab5c5071b9fad41a6ba4c91cc)
其实一般在绘制波形时,最常用的还是plot( )方法。
程序实例ch1_22.py:使用系统默认颜色,绘制不同波形的应用。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P26_25407.jpg?sign=1738830165-qy3qBIUAokToWLvIVc3rbVNXOqtLryAo-0-6369da35979e1e1f68ce7caa61a1d29e)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P26_25410.jpg?sign=1738830165-maMPpQrPObOfrKAFD4kvVp4nIRrrWgKB-0-f487f06b5a4eee555f06d779bac7f791)
1-4-3 建立不等宽度的散点图
在scatter( )方法中,(x,y)的数据可以是列表也可以是矩阵,预设所绘制点大小s的值是20,这个s可以是一个值也可以是一个数组数据,当它是一个数组数据时,利用更改数组值的大小,我们就可以建立不同大小的散点图。
在我们使用Python绘制散点图时,如果在两个点之间绘制了上百或上千个点,则可以产生绘制线条的视觉效果,如果每个点的大小不同,且依一定规律变化,则有特别的效果。
程序实例ch1_23.py:建立一个不等宽度的图形。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P27_25850.jpg?sign=1738830165-mcSYgwLEA07PjlLoJAkKeKVFfaIs96oQ-0-70466e9e77c9bba824764bfbcd50be7f)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P27_25853.jpg?sign=1738830165-YNPMoW0jTqmfdtBEiNmURmta6cJDrb2b-0-d75b4566e456db253a748de282ec6975)
1-4-4 填满区间
在绘制波形时,如要填满区间,此时可以使用matplotlib模块的f i ll_between( )方法,基本语法如下:
fill_between(x, y1, y2, color, alpha, options, … ) # options是其他参数
上述会填满所有相对x轴数列y1至y2的区间,如果不指定填满颜色,则会使用预设的线条颜色填满,通常填满颜色会用较淡的颜色,所以可以设定alpha参数将颜色调淡。
程序实例ch1_24.py:填满区间0~y,所使用的y轴值是函数式sin(3x)。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P27_25865.jpg?sign=1738830165-62Q3ud6qwbuTlvteN2dLowrRoMC47xZi-0-71feeae3140e345eb333f5e7285b2557)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P27_25868.jpg?sign=1738830165-64lYyaVr9aWcASradHLmakkY6Hvl4izF-0-a0203027c38ff7f5d12750a9347c168a)
程序实例ch1_25.py:填满区间-1~y,所使用的y轴值是函数式sin(3x)。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P27_25878.jpg?sign=1738830165-ie0qCmM1cO1TMqwoICFKx8g2KGxtelfT-0-7ce5333209ae17ca52e75d81e7ebc178)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P27_25881.jpg?sign=1738830165-TGwlU2O7BZy10zE5ojns2XSSxgOiFX48-0-dacde50675b5f896c54756323e157b23)
1-4-5 色彩映射
至今我们针对一组数组或列表所绘制的图表皆是单色,以ch1_23.py第8行为例,色彩设定是color=(0,1,0),这是固定颜色的用法。在色彩的使用中,允许色彩随着数据而做变化,此时色彩的变化是根据所设定的色彩映射值(color mapping)而定,例如有一个色彩映射值是rainbow,内容如下:
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P28_26320.jpg?sign=1738830165-7nd4tVG7xV2clHJ5lc3Fd4kJtaAqCVVz-0-b90d99da30c96752d029d571a22ff848)
在数组或列表中,数值低的值颜色在左边,会随数值变高往右边移动。当然在程序设计中,我们需要在scatter( )中增加color设定参数c,这时color的值就变成一个数组或列表。然后我们需要增加参数cmap(英文是color map),这个参数主要是指定使用哪一种色彩映射值。
程序实例ch1_26.py:色彩映射的应用。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P28_26323.jpg?sign=1738830165-ystoYB6SJkfYoSi8AKr9XlMxGjAoh1e2-0-436350cfd05f4fddf1f0f58c9fd408b2)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P28_26326.jpg?sign=1738830165-Ej6OPiQeSn6CVDEjBzLNrEZ8gJxxnctT-0-be0bc55119e4684f6b08ea91a7682ffa)
色彩映射也可以设定根据x轴的值做变化,或根据y轴的值做变化,整个效果是不一样的。
程序实例ch1_27.py:重新设计ch1_23.py,主要是设定固定点的宽度为50,将色彩改为依y轴值变化,同时使用hsv色彩映射表。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P28_26336.jpg?sign=1738830165-DMpiiFAXBO03uiPBfzwDiXIHYEYfWb3h-0-bcc295bf2fc8e6154a72fe4c81c27dd2)
执行结果 如下方左图。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P28_26339.jpg?sign=1738830165-f0cVUkuMklM5XIQ5rUbJWFp89aogTkGU-0-99c44cdd8d04955f4bd79793d9c5e472)
程序实例ch1_28.py:重新设计ch1_27.py,主要是将色彩改为依x轴值变化。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P28_26343.jpg?sign=1738830165-yW0dl6wOBjBig4tAy0xz6ZBBLoBppGAP-0-bbde3a4cffd8f43ef485c3d7c227050f)
执行结果 如上右图。
目前matplotlib协会所提供的色彩映射内容如下:
序列色彩映射表
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P29_26791.jpg?sign=1738830165-Vd4ynDd2qd0g2PD9oJLkPytNGNGi3J7u-0-ada56f163423ffdf86b75c9b7496b464)
序列2色彩映射表
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P29_26794.jpg?sign=1738830165-zClcNum3bF9PsUzeYDcUcNeAeEjhNSqD-0-2e7ef53a83a281b2e94656e6b0cd5e87)
直觉一致的色彩映射表
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P29_26797.jpg?sign=1738830165-9biF7ql4DxCooqJBHV2AO5mJuOFrs7Iv-0-a08495ebdf9a42dbb11354a5f4d8d198)
发散式的色彩映射表
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P29_26800.jpg?sign=1738830165-gDcoJLtltpJfgHQsZlR3DSNfFsQsmN1C-0-f96a34e59bbce927b014c9f0d4926eba)
定性色彩映射表
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P29_26803.jpg?sign=1738830165-iFQq326GI8VBPWeLp07af12e7d8xmxPG-0-2f07e9024cd015bc7d0da7b238849300)
杂项色彩映射表
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P29_26806.jpg?sign=1738830165-zqlJlUnx9o6UYNr5Ffwcq0udC3Fp7K8i-0-f10374162467cfd6bc73c38d8a2fb6ae)
在大数据研究应用中,可以将数据以图表显示,然后用色彩判断整个数据的趋势。在结束本节之前,笔者举一个使用colormap绘制数组数据的实例,这个程序会使用下列方法。
imshow(img, cmap=‘xx’)
参数img可以是图片,也可以数组数据,此例是数组数据。这个函数常用在机器学习检测神经网络的输出中。
程序实例ch1_29.py:绘制矩形数组数据。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P30_27304.jpg?sign=1738830165-j3lexMG6ybNtlUMdJNShDGZuBwLnKkTi-0-ffdb136a362d0f2dec97f2bc769863ea)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P30_27317.jpg?sign=1738830165-XEvi1gR80IGXXNYSTddpQ88ggvo3SXso-0-779c850dcefc5d7fd77d0f5dcfa4180d)
1-5 图表显示中文
matplotlib无法显示中文,主要在于安装此模块时所配置的下列文件:
~Python37\Lib\site-packages\matplotlib\mpl-data\matplotlibrc
在此文件内的font_sans-serif中没有配置中文字体,我们可以在此字段增加中文字体,但是笔者不鼓励更改系统内建文件。笔者将使用动态配置方式处理,让图表显示中文字体。其实可以在程序内增加下列程序代码,rcParams( )方法可以为matplotply配置中文字体参数,就可以显示中文了。
from pylab import mlp # matplotlib的子模块 mlp.rcParams[“font.sans-serif”] = [“SimHei”] # 黑体 mlp.rcParams[“axes.unicode_minus”] = False # 可以显示负号
另外,每个要显示的中文字符串需要在前面加上u。
程序实例ch1_30.py:重新设计ch1_13.py,以中文显示报表。
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P30_27287.jpg?sign=1738830165-DuFDyVcVq51w7kZHJO48zHM11DDU1LOB-0-3e71cdb504b4a31141ca5c0df7d26d19)
执行结果
![](https://epubservercos.yuewen.com/0EA898/31397660003376506/epubprivate/OEBPS/Images/Figure-P30_27307.jpg?sign=1738830165-TNixhyqtDlXP8EeUCMwlPPrp3ki2RVxO-0-86467bb1b45232e1eaad16eda9093c8c)