1、绘图横纵坐标轴倒转问题
今天使用了python绘制二维图像,但是绘制出来的结果图发现x轴和y轴发生了翻转,大概是这样:左图为实际得到的不理想结果,右图为理论上应该得到的结果,即,理论上应该得到的结果是关于y轴对称的,但是实际得到的结果是关于x轴对称的。
2.矩阵和绘图规则
在写矩阵和绘图规则之前,先明确一个概念,每行元素对应的索引和列的索引相同,每列元素对应的索引和行的索引相同。
(1)矩阵规则
使用numpy生成一个三行四列的矩阵:
import numpy as np
a = np.zeros((3, 4)
a的生成结果如下:
如果生成一个二维矩阵,我们会习惯性地把第一个数默认为x,第二个默认为y,也就是:
a = np.zeros((x, y))
而根据生成的结果我们可以知道x对应的为行数(等于每列元素的个数),y对应的为列数(等于每行元素的个数),x和y对应的分别是行的索引(0,1,2)和列的索引(0,1,2,3)。
(2)绘图规则
当我们绘制图像时x轴对应的为横行(以行元素索引为横坐标(0,1,2,3),其长度和列的数量相等),y轴对应的为列(以列元素的索引为纵坐标(0,1,2),其长度和行的数量相等),见下图:
import matplotlib.pyplot as plt
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
(3)翻转原因
我们一般希望x轴的长度和每行元素的个数相等,y轴的长度和每列元素的个数相等,即以每行的元素的索引作为横坐标,以每列的元素的索引作为纵坐标;但是在矩阵中x、y对应的分别是行的索引和列的索引而不是每行元素和每列元素的索引,这个时候就可能发生坐标轴翻转的问题。
举一个简单的例子,给一个索引值(2,1),我们常规的习惯一般会先横着数,再竖着数(图中蓝框圈出来的数);但是在python的矩阵中,这个索引值代表的含义是第二行第一列对应的数,就需要先竖着数再横着数(图中红框圈出来的数)。
总结来说,我们很容易将每行(每列)元素的索引和行(列)的索引混用,一旦混用就会出现坐标轴翻转的问题。
对于这个问题,我们可以通过人为调转坐标轴,或者将要绘制的二维数组转置来解决这个问题。
3.解决方案
以笔者的问题为例展示此类问题的解决方案。
# 修改前的代码(t是一个三维矩阵,np.meshgrid的作用是生成网格点坐标矩阵)
X, Y = np.meshgrid(x, y)
plt.contourf(X, Y, t, 30)
# 修改后的代码
Y, X = np.meshgrid(x, y)
plt.contourf(X, Y, t, 30)
# 也可以写为
X, Y = np.meshgrid(x, y)
plt.contourf(X, Y, np.transpose(t[:, 100, :]), 30)