学了这么多年python了,还一直没有系统地了解过python的画图功能。
每次都是现学现用,但是某些比较紧急的场合,往往就会比较耗时又耗力,因为不成体系,还经常会忘记已经吸纳的新知识。
所以,我决定把这块的画图功能系统的学习一下,进行知识储备。
Python的pyplot模块绘制图表的基本操作。
=======================================================
一个简单的二维折线图:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [1.2, 2.5, 4.5, 7.3]
# plot函数作图
plt.plot(x, y)
plt.savefig("test.png", dpi=120)
# show函数展示出这个图,如果没有这行代码,则程序完成绘图,但看不到
plt.show()
运行后的效果是这样的,从数值对应上,横轴应该是x轴,纵轴应该是y轴。
但是,对应图与代码,另外疑问的是,为什么x轴给出的是整数,在绘制时却用了浮点?而又为什么y轴给出的是浮点数,在绘制时却用的是整数呢?
----------------------------------------------------------------------------------------------
另一个点是:
show()函数在通常的运行情况下,将会阻塞程序的运行,直到用户关闭绘图窗口。换句话说,在关闭show()函数弹出的图像窗口前,show()函数后面的代码不会运行,直到用户关闭图像窗口,才会继续。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
我测试了普通的print()之后,发现并没有阻塞。。。
但是呢,当我在调用plt.savefig()将当前的Figure对象保存成图像文件时,
如果plt.savefig()代码放在了plt.show()之后,那我本地保存的图像就是一张空白图,不符合预期;
但如果plt.savefig()代码放在了plt.show()之前,则可以成功实现保存。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
虽然问题不大,但也让我产生疑问:到底是有阻塞还是没有阻塞呢?如果有,阻塞什么,而又不阻塞什么呢?
=======================================================
不同风格的线条:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [1.2, 2.5, 4.5, 7.3]
#线条颜色、线条样式、突出(marker)每个记录的点、线条粗细
plt.plot(x, y, color="r", linestyle="--", marker="*", linewidth=1.0)
plt.show()
运行后的效果:
---------------------------------------------------------------------------------------------
线条风格(linstyle):
supported values are '-', '--', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted'
-----------------------------------------------------------------------------------------------
线条颜色(color):
-----------------------------------------------------------------------------------------------
线条标记(marker):
======================================================
坐标轴控制
-绘图范围:
import matplotlib.pyplot as plt
import numpy as np
#x 的取值范围
x = np.arange(-5, 5, 0.02)
y = np.sin(x)
#控制图像的绘图范围
#plt.axis([x_min, x_max, y_min, y_max])
plt.axis([-np.pi, np.pi, -2, 2])
plt.plot(x, y, color="r", linestyle="-", linewidth=1)
plt.show()
运行效果如下:
值得注意的一个点:
虽然x的取值范围在[−5,5],但是绘图时,只是展示了[−π,π]之间的函数图。
引出一个可以控制图像范围的函数:
plt.axis([x_min, x_max, y_min, y_max])
如果只是单独想要控制x轴或者y轴的取值,则可以用plt.xlim(x_min, x_max)和plt.ylim(y_min, y_max),用法与plt.axis()类似。
----------------------------------------------------------------------------------------------
-标题和间隔:
import matplotlib.pyplot as plt
import numpy as np
import math
x = np.arange(-2 * math.pi, 2 * math.pi, 0.02)
y = np.sin(x)
plt.axis([-10, 10, -2, 2])
plt.xticks([i * np.pi/2 for i in range(-4, 5)], [str(i * 0.5) + "$\pi$" for i in range(-4, 5)])
plt.yticks([i * 0.5 for i in range(-4, 5)])
plt.xlabel("x")
plt.ylabel("y")
plt.plot(x, y, color="r", linestyle="-", linewidth=1)
plt.show()
运行效果如下:
纯粹知识的学习记录:
函数plt.xlabel()和plt.xlabel()用来实现对x轴和y轴添加标题。
函数plt.xticks()和plt.yticks()用来实现对x轴和y轴坐标间隔(也就是轴记号)的设定。用法上,函数的输入是两个列表,第一个表示取值,第二个表示标记。当然如果你的标记就是取值本身,则第二个列表可以忽略。(支持latex公式表达)
=======================================================
PS:感谢参考文章的作者,从细节、小处一步步向前推进,能够很好的帮助我建立知识体系。
不过,一如既往地,我的问题真多,虽然问题不大,但是拥有自己的思考分析,我认为是应该一直坚持的事情。
毕竟自己小菜鸡,一直在参考文章进行学习,期待学习后期可以有自己完全独立、不依赖参考文章的成形文字。