今天打算通过绘制正弦和余弦函数,从默认的设置开始,一步一步地调整改进,让它变得好看,变成我们初高中学习过的图象那样。通过这个过程来学习如何进行对图表的一些元素的进行调整。
01. 简单绘图
matplotlib有一套允许定制各种属性的默认设置。你可以几乎控制matplotlib中的每一个默认属性:图像大小,每英寸点数,线宽,色彩和样式,子图(axes),坐标轴和网格属性,文字和字体属性,等等。
安装
1
|
pip install matplotlib |
虽然matplotlib的默认设置在大多数情况下相当好,你却可能想要在一些特别的情形下更改一些属性。
1
2
3
4
5
6
7
8
9
|
from pylab import * x = np.linspace( - np.pi, np.pi, 256 ,endpoint = true) c,s = np.cos(x), np.sin(x) plot(x,c) plot(x,s) show() |
show image
02. 设置基本元素
这边的基本元素主要有几下几点:
线的颜色,粗细,和线型 刻度和标签 还有图例
代码比较简单,基本上在我的第一讲内容里都讲过了。
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
|
import numpy as np from matplotlib import pyplot as plt plt.figure(figsize = ( 10 , 6 ), dpi = 80 ) x = np.linspace( - np.pi, np.pi, 256 ,endpoint = true) c,s = np.cos(x), np.sin(x) # 设置线的颜色,粗细,和线型 plt.plot(x, c, color = "blue" , linewidth = 2.5 , linestyle = "-" , label = r '$sin(x)$' ) plt.plot(x, s, color = "red" , linewidth = 2.5 , linestyle = "-" , label = r '$cos(x)$' ) # 如果觉得线条离边界太近了,可以加大距离 plt.xlim(x. min () * 1.2 , x. max () * 1.2 ) plt.ylim(c. min () * 1.2 , c. max () * 1.2 ) # 当前的刻度并不清晰,需要重新设定,并加上更直观的标签 plt.xticks([ - np.pi, - np.pi / 2 , 0 , np.pi / 2 , np.pi], [r '$-\pi$' , r '$-\pi/2$' , r '$0$' , r '$+\pi/2$' , r '$+\pi$' ]) plt.yticks([ - 1 , 0 , 1 ], [r '$-1$' , r '$0$' , r '$1$' ]) # 添加图例 plt.legend() plt.show() |
show image
03. 移动轴线
还记得我们在初高中学习的三角函数图象,可不是这样,它应该是有四个象限的。而这里却是一个四四方方的图表。
所以接下来,我们要做的就是移动轴线,让它变成我们熟悉的样子。
我们只需要两轴线(x和y轴),所以我们需要将顶部和右边的轴线给隐藏起来(颜色设置为none即可)。
1
2
3
4
5
6
7
8
9
10
11
12
|
# plt.gca(),全称是get current axis ax = plt.gca() ax.spines[ 'right' ].set_color( 'none' ) ax.spines[ 'top' ].set_color( 'none' ) # 由于我们移动的是左边和底部的轴,所以不用设置这两个也可以 ax.xaxis.set_ticks_position( 'bottom' ) ax.yaxis.set_ticks_position( 'left' ) # 指定data类型,就是移动到指定数值 ax.spines[ 'bottom' ].set_position(( 'data' , 0 )) ax.spines[ 'left' ].set_position(( 'data' , 0 )) |
关于 set_position()
这个函数中的data是啥意思?我查了下官网。解释如下
然后最后发现,上面的写法可以用一定更简洁的方式设置,是等价的。
1
2
|
ax.spines[ 'bottom' ].set_position( 'zero' ) ax.spines[ 'left' ].set_position( 'zero' ) |
show image
04. 添加注释
现在的图形部分已经成型,接下让我们现在使用annotate命令注解一些我们感兴趣的点。
我们选择 2π/3
作为我们想要注解的正弦和余弦值。我们将在曲线上做一个标记和一个垂直的虚线。然后,使用annotate命令来显示一个箭头和一些文本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
t = 2 * np.pi / 3 # 利用plt.plot绘制向下的一条垂直的线,利用plt.scatter绘制一个点。 plt.plot([t,t],[ 0 ,np.cos(t)], color = 'blue' , linewidth = 2.5 , linestyle = "--" ) plt.scatter([t,],[np.cos(t),], 50 , color = 'blue' ) plt.annotate(r '$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$' , xy = (t, np.sin(t)), xycoords = 'data' , xytext = ( + 10 , + 30 ), textcoords = 'offset points' , fontsize = 16 , arrowprops = dict (arrowstyle = "->" , connectionstyle = "arc3,rad=.2" )) # 利用plt.plot绘制向上的一条垂直的线,利用plt.scatter绘制一个点。 plt.plot([t,t],[ 0 ,np.sin(t)], color = 'red' , linewidth = 2.5 , linestyle = "--" ) plt.scatter([t,],[np.sin(t),], 50 , color = 'red' ) plt.annotate(r '$cos(\frac{2\pi}{3})=-\frac{1}{2}$' , xy = (t, np.cos(t)), xycoords = 'data' , xytext = ( - 90 , - 50 ), textcoords = 'offset points' , fontsize = 16 , arrowprops = dict (arrowstyle = "->" , connectionstyle = "arc3,rad=.2" )) |
在这里,你可能会对 plt.annotate
这个函数的用法,有所陌生。这里也解释一下。
第一个参数,就是注释内容; 第二个参数, xy
,就是对哪一点进行注释; 第三个参数, xycoords
,指定类型,data 是说基于数值来定位; 第四个参数, xytext
,是注释的位置,结合第五个参数,就是根据偏移量来决定注释位置; 第五个参数, textcoords
,值为offset points,就是说是相对位置; 第六个参数, fontsize
,注释大小; 第七个参数, arrowprops
,对箭头的类型的一些设置。
show image
05. 完整代码
以上都是对片段代码进行解释,这里放出完整的代码
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
|
import numpy as np from matplotlib import pyplot as plt plt.figure(figsize = ( 10 , 6 ), dpi = 80 ) x = np.linspace( - np.pi, np.pi, 256 ,endpoint = true) c,s = np.cos(x), np.sin(x) # 设置线的颜色,粗细,和线型 plt.plot(x, c, color = "blue" , linewidth = 2.5 , linestyle = "-" , label = r '$sin(x)$' ) plt.plot(x, s, color = "red" , linewidth = 2.5 , linestyle = "-" , label = r '$cos(x)$' ) # 如果觉得线条离边界太近了,可以加大距离 plt.xlim(x. min () * 1.2 , x. max () * 1.2 ) plt.ylim(c. min () * 1.2 , c. max () * 1.2 ) # 当前的刻度并不清晰,需要重新设定,并加上更直观的标签 plt.xticks([ - np.pi, - np.pi / 2 , 0 , np.pi / 2 , np.pi], [r '$-\pi$' , r '$-\pi/2$' , r '$0$' , r '$+\pi/2$' , r '$+\pi$' ]) plt.yticks([ - 1 , 1 ], [r '$-1$' , r '$1$' ]) # 添加图例 plt.legend(loc = 'upper left' ) # plt.gca(),全称是get current axis ax = plt.gca() ax.spines[ 'right' ].set_color( 'none' ) ax.spines[ 'top' ].set_color( 'none' ) # 由于我们移动的是左边和底部的轴,所以不用设置这两个也可以 ax.xaxis.set_ticks_position( 'bottom' ) ax.yaxis.set_ticks_position( 'left' ) # 指定data类型,就是移动到指定数值 # ax.spines['bottom'].set_position('zero') ax.spines[ 'bottom' ].set_position(( 'data' , 0 )) ax.spines[ 'left' ].set_position(( 'data' , 0 )) t = 2 * np.pi / 3 # 利用plt.plot绘制向下的一条垂直的线,利用plt.scatter绘制一个点。 plt.plot([t,t],[ 0 ,np.cos(t)], color = 'blue' , linewidth = 2.5 , linestyle = "--" ) plt.scatter([t,],[np.cos(t),], 50 , color = 'blue' ) plt.annotate(r '$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$' , xy = (t, np.sin(t)), xycoords = 'data' , xytext = ( + 10 , + 30 ), textcoords = 'offset points' , fontsize = 16 , arrowprops = dict (arrowstyle = "->" , connectionstyle = "arc3,rad=.2" )) # 利用plt.plot绘制向上的一条垂直的线,利用plt.scatter绘制一个点。 plt.plot([t,t],[ 0 ,np.sin(t)], color = 'red' , linewidth = 2.5 , linestyle = "--" ) plt.scatter([t,],[np.sin(t),], 50 , color = 'red' ) plt.annotate(r '$cos(\frac{2\pi}{3})=-\frac{1}{2}$' , xy = (t, np.cos(t)), xycoords = 'data' , xytext = ( - 90 , - 50 ), textcoords = 'offset points' , fontsize = 16 , arrowprops = dict (arrowstyle = "->" , connectionstyle = "arc3,rad=.2" )) plt.show() |
绘制抛物线:
1
2
|
x1 = np.linspace( - 4 , 4 , 100 ,endpoint = true) plt.plot(x1,(x1 * * 2 ) / 9 ) |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://juejin.im/post/5b84d1f3f265da436152f9d4