Numpy库与Pylab库之间数据转换
今天在使用numpy库与pylab绘图库之间的数据交换时,遇到了一些与常识颠倒的现象,出现该现象是因为自己没有仔细阅读两个库中的官方设定。因此,借此机会,记录下来,以供后续参考。
先看代码
import numpy as np
from pylab import *
# 创建一个数组
maze = np.full((5, 5), int(5), dtype=np.int8)
maze[4,1] = 3 # 修改坐标(4,1)处数值
# 绘图
plt.imshow(maze, cmap=plt.cm.hot, interpolation='nearest', vmin=0, vmax=5)
plt.colorbar() # 设置右侧颜色条形图
xlim(0, 5) # 设置显示x轴的范围
ylim(0, 5) # 设置显示y轴的范围
xticks = np.arange(0,6,1) # 产生0-6之间步长为一的数组
yticks = np.arange(0,6,1) # 产生0-6之间步长为一的数组
plt.xticks(xticks) # 绘制x轴
plt.yticks(yticks) # 绘制y轴
plt.show()
运行结果如下,这就和常见思维相悖。 程序的思维是修改坐标(4, 1)处数值,因此在显示时应在红色箭头所指的红色区块,然而结果图片显示的是黄色部分。
问题解释
numpy设置是数组的第四行第一列,当传递到pylab时,因为原点设置不同,因此导致,程序在第四行第一列显示时,实际是在坐标(1,4)处。
解决方式
为了使之符合常识,实际上,只需要对矩阵进行转置操作。
import numpy as np
from pylab import *
# 创建一个数组
maze = np.full((5, 5), int(5), dtype=np.int8)
maze[4,1] = 3 # 在(4,1)坐标处设置标记
maze = maze.T # 对矩阵进行转置
# 绘图
plt.imshow(maze, cmap=plt.cm.hot, interpolation='nearest', vmin=0, vmax=5)
plt.colorbar() # 设置右侧颜色条形图
xlim(0, 5) # 设置显示x轴的范围
ylim(0, 5) # 设置显示y轴的范围
xticks = np.arange(0,6,1) # 产生0-6之间步长为一的数组
yticks = np.arange(0,6,1) # 产生0-6之间步长为一的数组
plt.xticks(xticks) # 绘制x轴
plt.yticks(yticks) # 绘制y轴
plt.show()
运行结果如下所示
总结
问题本身并不是非常的困难,只是现象有点反常理,因此有些令人难以琢磨。只要明确坐标原点的设置,以及两个库交换数据的处理,就能修正这一问题。