Python进阶之Matplotlib入门(五)
- 2019 年 11 月 7 日
- 筆記
引言
Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技能。对于这个教程,大家最好亲自码一遍代码,这样可以更有收获。
前面课程:
概要
1、掌握Matplotlib中的标注函数annotate;
2、掌握Matplotlib中的添加文本函数text;
3、掌握Matplotlib中的改变能见度函数set_bbox。
标注
有时候,我们希望给图上的一些点或者线做一些更加精细的标注,达到美观和细化图片的效果,比如这样的:

这里我们给sin函数标注了在2/3pi时候的值,要想做到这一点我们分两步走:
- 画一条红色虚线以及红色实心点
- 用annotate函数进行文字标注
t = 2*np.pi/3 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'$sin(frac{2pi}{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"))
其中第一步,我们用到了两种画图函数,分别是plot以及scatter。plot函数的操作我们其实经过前面的学习已经能够完全掌握,包括设置颜色,线宽和线风格。而画红色实心点的函数scatter我们是第一次见,关于这个函数我们将会在后面详细介绍。
第二步我们用了一段关于annotate很长的代码,其中:
- r''里面的内容就是文字部分,熟悉Latex的同学可能对这部分内容非常熟悉,它是负责显示公式,由$$符号来引导。具体如何用latex打印公式需要大家自己去学习了。参数xy=(t, np.sin(t))表明注释的位置
- 参数xycoords='data' 是说基于数据的值来选位置, xytext=(+10,+30)对于标注相对位置的描述 和 xy 偏差值,arrowprops是对图中箭头类型的一些设置.
完整版代码:
import numpy as np import matplotlib.pyplot as plt plt.figure(figsize=(5, 5)) x = np.linspace(-np.pi, np.pi, 256) y1,y2 = np.cos(x), np.sin(x) plt.plot(x, y1, color="blue", linewidth=1.0, linestyle="-", label="cosine") plt.plot(x, y2, color="green", linewidth=1.0, linestyle="--", label="sine") 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$']) ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.spines['bottom'].set_position(('data',0)) ax.spines['left'].set_position(('data',0)) plt.legend(loc='upper left') t = 2*np.pi/3 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'$sin(frac{2pi}{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.show()
添加文字
除了上面讲到的用annotate函数来给图片标注,我们也可以有另一种方式来添加文字,这个函数叫做text。我们直接用一个例子来说明:
import numpy as np import matplotlib.pyplot as plt plt.figure(figsize=(5, 5)) x = np.linspace(-np.pi, np.pi, 256) y1,y2 = np.cos(x), np.sin(x) plt.plot(x, y1, color="blue", linewidth=1.0, linestyle="-", label="cosine") plt.plot(x, y2, color="green", linewidth=1.0, linestyle="--", label="sine") 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$']) ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.spines['bottom'].set_position(('data',0)) ax.spines['left'].set_position(('data',0)) plt.legend(loc='upper left') plt.text(-2.0, 1.2, r'Plot of sin(x) and cos(x).', fontdict={'size': 16, 'color': 'r'}) plt.show()
其中,r' '里面是文字内容,而fontdict负责设置文字的大小以及颜色等。
运行结果:

可以看到图中的红色文字部分成功加入。
能见度
我们经常会遇到画出来的线和坐标轴有重合的地方,比如这个图:

不管是蓝色实线还是绿色虚线都有和坐标轴刻度标记文字有重合部分,为了解决这个问题,我们使用 label.set_bbox来设置透明度:
import numpy as np import matplotlib.pyplot as plt plt.figure(figsize=(5, 5)) x = np.linspace(-np.pi, np.pi, 256) y1,y2 = np.cos(x), np.sin(x) plt.plot(x, y1, color="blue", linewidth=1.0, linestyle="-", label="cosine", zorder=1) plt.plot(x, y2, color="green", linewidth=1.0, linestyle="--", label="sine", zorder=1) 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$']) ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.spines['bottom'].set_position(('data',0)) ax.spines['left'].set_position(('data',0)) plt.legend(loc='upper left') for label in ax.get_xticklabels() + ax.get_yticklabels(): label.set_fontsize(12) label.set_bbox(dict(facecolor='white', edgecolor='none', alpha=0.7, zorder =2 )) plt.show()
注意到我们画sin以及cos函数的时候,加入了一个参数zorder = 1,这是为了后面在坐标轴刻度颜色以及能见度的时候可以覆盖sin以及cos函数线。
负责调控能见的核心代码:
for label in ax.get_xticklabels() + ax.get_yticklabels(): label.set_fontsize(12) label.set_bbox(dict(facecolor='white', edgecolor='none', alpha=0.7, zorder =2 ))
其中set_fontsize是设置刻度标注的字体大小,而set_bbox就是设置坐标刻度标注周围一个方块范围内颜色以及能见度,其中alpha负责能见度,zorder=2是呼应前面的zorder=1,让更高级别的设置可以覆盖更低级别的设置。
运行结果:
