前言

家里面断网一个月,淦

邪恶的Capitalism网络商直到现在还是没有给我修好,

然后又放假了,Library竟然不开门你敢信?

我就很好奇了,md平时大家都上课,图书馆谁来?现在大家放假了你把图书馆给我关了.....

没得治没得治

正文

上次在做Pandas最后一期的时候讲了生成一个简单的函数图像

这一次我们就来详细的讲一讲如何使用Matplotlib画画

【什么?你告诉我你不会用Pandas和Numpy?】

强烈建议在学习本章之前先翻翻我之前的Numpy和Pandas教程,

好了我们开始吧

0x01 安装

Mac和Linux直接在终端里面煞笔安装就可以了,

Linux 打开 Terminal 窗口, 输入以下内容

# python 3

$ sudo apt-get install python3-matplotlib

# python 2

$ sudo apt-get install python-matplotlib

Mac 打开 Terminal 窗口, 输入以下内容

# python 3

$ pip3 install matplotlib

# python 2

$ sudo apt-get install python-matplotlib

【我就猜到你们这群弱子用的是windows】

【不教,自己去装Anaconda python,gun】

嘻嘻嘻

0x02 导入

一般来说,你是可以直接import 整个matplotlib的......

But!

其实我们用的所有功能都是matplotlib的pyplot模块,

因为名字太难写了,所以我一般都是copy然后as plt,简写就完事咯~

from matplotlib import pyplot as plt
【那为什么要下载整个库呢qwq】
正比例函数走起
为什么不是一次函数呢?
emmmmm
y=mx+b太难写了嘛y=mx多好啊
首先我们使用Numpy制作一些数据:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(1, 100, 100)
y = x
>>> x
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9.,
10., 11., 12., 13., 14., 15., 16., 17., 18.,
19., 20., 21., 22., 23., 24., 25., 26., 27.,
28., 29., 30., 31., 32., 33., 34., 35., 36.,
37., 38., 39., 40., 41., 42., 43., 44., 45.,
46., 47., 48., 49., 50., 51., 52., 53., 54.,
55., 56., 57., 58., 59., 60., 61., 62., 63.,
64., 65., 66., 67., 68., 69., 70., 71., 72.,
73., 74., 75., 76., 77., 78., 79., 80., 81.,
82., 83., 84., 85., 86., 87., 88., 89., 90.,
91., 92., 93., 94., 95., 96., 97., 98., 99., 100.])
假设我们要生成一个函数图像,根据上面的条件我们知道这个函数图像肯定是过原点的【因为是正比例函数】,
所以接下来我们只需要验证slope是否是45°就ok了
plt.plot()
一个挺万能的函数,用来展示平面直角坐标里面的图标,可以拿来调颜色和宽度,
#输出使用x,y数组,颜色为红色,宽度为1.0,线条类型为虚线的图标
plt.plot(x, y, color='red', linewidth=1.0, linestyle='--')
档然咯目前用来展示只使用x坐标和y坐标的图标
如果你把xy写反了就会发现坐标倒过来了噗嗤
plt.show()
用来展示plt库生成的图像,
记住后面要加括号!后面要加括号!后面要加括号!
温馨提示:show函数提供的图像只能在终端里面被展示一次,如果在一个程序里面写入两次show一个图片的话,那么只会展示一张图片来着
如果想要一次性show两张图片的话,可以尝试使用plt.figure()函数哦,这个文章后面会讲到,
综合上面两个函数,变成这个样子:
>>> x = np.linspace(1,100,100)
>>> y = x
>>> plt.plot(x,y)
[]
>>> plt.show #这里傻了没加括号
>>> plt.show() #这样子才会输出结果

Figure_1.png
如果把y改成x的平方?
>>> y = x**2
>>> plt.plot(x,y)
[]
>>> plt.show()

Figure_1-1.png
0x06 自带的图标展示器
很多人就很好奇了:“上面那些可爱的图标是干什么的?”
说实话你们用不上【嘲讽】
GIF什么的加载慢就等一会儿嘛!

放大缩小.gif

拖动重置.gif

改变图片属性.gif
还好我把最重要的部分给遮住了嘻嘻嘻
抱图的话私哦【抱紧公主殿下】
0x07 合并吧!!
合并基本上吧都是每一个数学库里面的重头戏,
刚刚我们生成了两个图表,现在我们要尝试着将它们合并
但是show()只能用一次啊怎么办......
plt.figure()
使用figure函数定义一个图像窗口,实现多个图像一次性输出或者多个图像合并为一个图像输出
figure还可以设置输出的图片名字和图片的长宽【不是坐标轴的】
plt.figure(num=3, figsize=(8, 5))
这样就是输出一个名字为figure3,长宽为8,5的图表
举一个栗子,刚刚的两个图像,使用了figure后可以实现一次性show出两张图片~
x = np.linspace(1,100, 1)
y1 = x
y2 = x**2
plt.figure()#show出第一张图片
plt.plot(x, y1)
plt.figure()#show出第二张图片
plt.plot(x,y2)
plt.show()
那么如果是合并呢.....
【此处思考十秒】
废话你删掉一个figure不就行了,两个figure两张图片,一个figure不就合并了嘛?
plt.figure()#show张合并的图片
plt.plot(x, y1)
plt.plot(x,y2)
plt.show()

Figure_1-2.png
这里还很贴心的自动帮我把颜色给改了噗嗤【mua一口人工智障】
0x08 设置坐标轴
还在使用可爱的button更改坐标轴嘛?out了!
多没有geek范啊,现在学习如何在程序里面自定义坐标轴,
想刚刚上面这个图,有没有发现y轴明显太大了,导致x轴看起来感觉和y=1一样尴尬【其实根本就不是我把数据开太大了哼】
【数据赶紧换掉赶紧换掉】
现在我们就来设置一下x,y轴的取值范围
【不对啊刚刚你不是演示了拖动和放大嘛?为什么不直接......】
就你话多!
plt.xlim() and plt.ylim()
使用这两个函数可以设置对应的x,y轴初始的取值范围【当然了前提是你不去拖他】
我先更改个数据哈qwq
用np.linspace定义x:范围是(-3,3);个数是50. 仿真一维数据组(x ,y1)表示
曲线1. 仿真一维数据组(x ,y2)表示曲线2.
然后plt.figure定义一个图像窗口. 使用plt.plot画(x ,y2)曲线. 使用plt.plot画(x ,y1)曲线,曲线的颜色属性(color)为红色;曲线的宽度(linewidth)为1.0;曲线的类型(linestyle)为虚线.
>>> x = np.linspace(-3, 3, 50)
>>> y1 = 2*x + 1
>>> y2 = x**2
>>> plt.figure()
>>> plt.plot(x, y2)
[]
>>> plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
[]
>>> plt.show()
输出是这个样子的【plt的官方library石锤】

Figure_2.png
现在我们可以试着去规定x,y轴的取值范围,只需要添加两个语句嘻嘻嘻
plt.xlim((-1, 2))
plt.ylim((-2, 3))
再看一看输出结果:

Figure_2-1.png
那么如果我还行给x和y设置名字呢?比如用Python解应用题?
plt.xlabel() and plt.ylabe()
往括号里面填字符串就完事了嘻嘻嘻
继续堆代码:
plt.xlabel('x-axis')
plt.ylabel('y-axis')

Figure_2-2.png
既然可以规定取值范围,那么肯定也可以规定间距【呕】
【为什么p事这么多啊拖动不就完事了】
好了抱怨完毕,继续~
plt.xticks() and plt.yticks()
使用xticks和yticks来设置间距,但是因为设置了间距了,所以就不能使用xlim来设置取值范围了噗嗤【你要设置间距肯定要先规定取值范围啊】
下面那张图的x-axis的间距是0.5,搞得我强迫症发作了,罗生门大怨起啊!
不爽就改,把前面的xlim删掉换成:
>>> new_ticks = np.linspace(-2,3,6)
#因为是不包括第一项的,所以要多写一个
>>> new_ticks
array([-2., -1., 0., 1., 2., 3.])
>>>plt.xticks(new_ticks)
([, , , , , ], )
感觉被我越改越丑了妈耶:

Figure_2-3.png
最后的最后一个项目.....
反正都已经很丑了,为什么不更丑一点呢?
把y轴上面所有的数字改成汉字得了.......
还是刚刚的这个函数,换一种形式:
>>>plt.yticks([-2,-1,0,1,2,3],[r'$really\ ugly$', r'$some\ ugly$', r'$ugly$', r'$so-so$', r'$good-looking$'])
([, , , , , ], )
警告:千万千万不要作死打中文进去,把我电脑直接给卡死了你可信?
好吧后期作者表示不是这个报错,反斜杠后面一定要加上空格!!!但是打中文进去真的真的会显示不出来
最终成品如下【我可真是个艺术鬼才】

毕加索野兽派平面直角坐标系
源代码:
>>> plt.figure()
>>> plt.plot(x, y2)
[]
>>> plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
[]
>>> plt.xlabel('x-axis')
Text(0.5,0,'x-axis')
>>> plt.ylabel('y-axis')
Text(0,0.5,'y-axis')
>>> plt.xticks(new_ticks)
([, , , , , ], )
>>> plt.yticks([-2,-1,0,1,2,3],[r'$really\ ugly$', r'$some\ ugly$', r'$ugly$', r'$so-so$', r'$good-looking$'])
([, , , , , ], )
>>> plt.show()