基本知识

(一)绘图

导入模块

#导入模块  
import numpy as np
import matplotlib.pyplot as plt
#创建新图
fig = plt.figure() # an empty figure with no axes
fig.suptitle('No axes on this figure') # Add a title so we know which it is

fig, ax_lst = plt.subplots(2, 2) # a figure with a 2x2 grid of Axes

输入及图表属性


所有绘图功能都期望np.array或np.ma.masked_array作为输入,类似“数组”的类.例如pandas数据对象,np.matrix可能会或可能不会按预期工作。最好用np.array在绘图之前将这些转换为对象。
例如,转换一个 pandas.DataFrame

a = pandas.DataFrame(np.random.rand(4,5), columns = list(‘abcde’))
a_asndarray = a.values
和隐蔽的 np.matrix

b = np.matrix([[1,2],[3,4]])
b_asarray = np.asarray(b)

例子

例子1:同一张图画多根曲线

x = np.linspace(0, 2, 100)

plt.plot(x, x, label='linear')
plt.plot(x, x**2, label='quadratic')
plt.plot(x, x**3, label='cubic')

plt.xlabel('x label')
plt.ylabel('y label')

plt.title("Simple Plot")

plt.legend()

plt.show()


例子2:重复画图

def my_plotter(ax, data1, data2, param_dict):
out = ax.plot(data1, data2, **param_dict)
return out

data1, data2, data3, data4 = np.random.randn(4, 100)
fig, ax = plt.subplots(1, 1)
my_plotter(ax, data1, data2, {'marker': 'x'})
fig, (ax1, ax2) = plt.subplots(1, 2)
my_plotter(ax1, data1, data2, {'marker': 'x'})
my_plotter(ax2, data3, data4, {'marker': 'o'})

(二)numpy

属性

  • ndarray.ndim

    数组的轴数(尺寸)。

  • ndarray.shape

    数组的大小。这是一个整数元组,表示每个维度中数组的大小。对于具有n行和m列的矩阵,shape将是(n,m)。shape因此,元组的长度 是轴的数量ndim。

  • ndarray.size

    数组的元素总数。这等于元素的乘积shape。

  • ndarray.dtype

    描述数组中元素类型的对象。可以使用标准Python类型创建或指定dtype。此外,NumPy还提供自己的类型。numpy.int32,numpy.int16和numpy.float64就是一些例子。

  • ndarray.itemsize

    数组中每个元素的大小(以字节为单位)。例如,类型的元素数组float64有itemsize8(= 64/8),而其中一个类型complex32有itemsize4(= 32/8)。它相当于ndarray.dtype.itemsize。

  • ndarray.data

    包含数组实际元素的缓冲区。通常,我们不需要使用此属性,因为我们将使用索引工具访问数组中的元素。

创建数组

  • 从常规Python列表或元组创建数组:np.array()

  • 创建全零数组:np.zeros( (3,4) )

  • 创建数字序列:np.arange( 10, 30, 5 ) (接受float参数)

    第三个参数是步进长度

  • 当arange与浮点参数一起使用时,由于有限的浮点精度,通常不可能预测所获得的元素的数量。出于这个原因,通常最好使用linspace作为参数接收我们想要的元素数量的函数

    np.linspace( 0, 2, 9 ) 第三个参数是总数

数组切片

  • a[0:2]: –a[0] a[1]

    注意:留左不留右

  • resharp(,): 转换数组的大小

(三)读写文件

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现:

try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()

或者用

with open('/path/to/file', 'r') as f:
print(f.read())

(四)读函数

python文件对象提供了三个“读”方法: read()、readline() 和 readlines()。每种方法可以接受一个变量以限制每次读取的数据量。

read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果文件大于可用内存,为了保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for … in … 结构进行处理。
readline() 每次只读取一行,通常比readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 readline()。
注意:这三种方法是把每行末尾的’\n’也读进来了,它并不会默认的把’\n’去掉,需要我们手动去掉。

In[4]: with open('test1.txt', 'r') as f1:
list1 = f1.readlines()
for i in range(0, len(list1)):
list1[i] = list1[i].rstrip('\n')
In[5]: list1
Out[5]: ['111', '222', '333', '444', '555', '666']

绘图脚本编写

待解决问题

  1. Spyder中其他路径的文件读取不到

    添加文件路径

    import sys
    sys.path.append("Z:\liqinxing\test_photo\sdm660_ipc")
  2. 字符串如何批量转数字 ——map函数

  3. 一行字符串如何转数组 ——split函数

  4. 一维数组如何转二维数组 ——resharp

  5. 三维数组如何画图 ——引入mpl_toolkits.mplot3d

脚本如下

import sys
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

line=1
sence=1
stats_data=np.zeros((48,64))
#添加文件路径并打开
with open('Z:\\liqinxing\\test_photo\\sdm660_ipc\\aec_stats.txt', 'r') as f1:
list1 = f1.readlines()
for i in range(0, len(list1)):
#去掉每行的\n
list1[i] = list1[i].rstrip('\n')
#判断每一行的第一个字符
if list1[i][1].isdigit() == True:
#split将字符串切分成数组
#map函数将函数依次作用到list上的每个元素
data=list(map(int,list1[i].split()))
print('line='+str(line))
line += 1
#将数组转换成np数组
data_tmp=np.array(data)
#将一维数组切块,留左不留右,并转换成二维数组
stats_subdata = data_tmp[0:64*48].reshape(48,64)
#对RGGB四个通道的值进行相加
stats_data += stats_subdata
if line%4 == 0:
#建立一个figure
figure = plt.figure()
#3D绘图
ax = Axes3D(figure)
#定义XY轴
X = np.arange(0, 64)
Y = np.arange(0, 48)
X, Y = np.meshgrid(X, Y)
#设置标题
ax.set_title('sence'+str(sence))
#绘图
ax.plot_surface(X,Y,stats_data,
rstride=1, cstride=1, cmap='rainbow')
stats_data=np.zeros((48,64))
sence += 1
#plt.show是将所有的图画出来,而且是阻塞性的
#如果想画多个图,一定要在最后结束的时候用
plt.show()