在Matplotlib某些方面的应用,需要对画图有一个严格的要求,比如不能把一个长方形显示出来是一个正方形,也不能把一个正方形显示为一个长方形。对于这样显示的问题,简单地来说叫做失真,虽然数值上的坐标点的距离是相等的,但是在屏幕上显示的距离不一样,导致失真。假如老师在教小学生认识正方形,但是老师做出来的课件老是显示为长方形,让学生无法认识正方形。为什么会出现这个问题呢?因为计算机的屏幕是长方形,因此很多程序为了尽可能利用屏幕显示,往往不是数学上严格的比例来显示的,会有一定的比例缩放,这时就会导致失真出现。可以看一下图:
在程序画这个正方形的数据是数学上标准的正方形坐标,但显示出来的并不是正方形,程序代码如下:
import matplotlib.pyplot as plt
import numpy as np
x1, x2 = -10, 10
y1, y2 = -10, 10
fig = plt.figure('deepinout.com')
plt.axis([x1, x2, y1, y2]) #
plt.xlabel('time')
plt.ylabel('S')
plt.title('title')
dx = 0.5
dy = 0.5
for x in np.arange(x1, x2, dx):
for y in np.arange(y1, y2, dy):
plt.scatter(x, y, s = 1, color = 'lightgray')
#画一个正方形
plt.plot([-5, 5], [5, 5], linewidth = 2, color = 'k')
plt.plot([5, 5], [5, -5], linewidth = 2, color = 'k')
plt.plot([5, -5], [-5, -5], linewidth = 2, color = 'k')
plt.plot([-5, -5], [-5, 5], linewidth = 2, color = 'k')
plt.show()
可以看到坐标点(-5,5)、(5,5)、(5,-5)、(-5,-5),两个相邻的点距离都是10个单位,但显示出来的图形并不是正方形。如果你遇到这个问题,做出来的课件显然不能拿出手,也不能拿出去教学生,因为这个结果与实际要求的结果不同。
接着下来,需要找到一个办法来解决这个问题,上面已经知道原因是屏幕显示的比例不一样,那么就需要从这方面着手解决,把X轴和Y轴的坐标比例显示为一样的,就可以解决了。这时候去坐标轴相关的函数里查找matplotlib.axes.Axes.set_aspect,这个函数定义如下:
Axes.set_aspect(self, aspect, adjustable=None, anchor=None, share=False)
aspect: 表示坐标轴的显示比例。设置为auto,表示X轴和Y轴坐标显示数据按图的大小来自动设置;设置为equal,表示X轴和Y轴的比例相同;
设置为num,表示纵横比按数值设置。
有了这把上方宝剑,就可以把前面的问题进行解决了。接着下来就是把这个函数放在什么位置比较合适呢?因为这个函数是修改坐标系的,应该放在创建坐标系之后,就需要立即进行修改,以便后面的数据可以按这个要求来显示出来。如下:
fig = plt.figure('deepinout.com')
plt.axes().set_aspect('equal')
plt.axis([x1, x2, y1, y2]) #
前面一行代码是创建整个绘图区域,相当于拿出了一张白纸,同时也创建了一个坐标系,因此接着下来修改坐标系的比例,再设置坐标系的刻度,就比较合理了。
把上面所有代码进行综合,就可以把例子写成这样:
import matplotlib.pyplot as plt
import numpy as np
x1, x2 = -10, 10
y1, y2 = -10, 10
fig = plt.figure('deepinout.com')
plt.axes().set_aspect('equal')
plt.axis([x1, x2, y1, y2]) #
plt.xlabel('time')
plt.ylabel('S')
plt.title('title')
dx = 0.5
dy = 0.5
for x in np.arange(x1, x2, dx):
for y in np.arange(y1, y2, dy):
plt.scatter(x, y, s = 1, color = 'lightgray')
#画一个正方形
plt.plot([-5, 5], [5, 5], linewidth = 2, color = 'k')
plt.plot([5, 5], [5, -5], linewidth = 2, color = 'k')
plt.plot([5, -5], [-5, -5], linewidth = 2, color = 'k')
plt.plot([-5, -5], [-5, 5], linewidth = 2, color = 'k')
plt.show()
这个程序显示出来的图形,就是正方形了,如下图: