科学计算可视化

一.python123成绩雷达图

import numpy as np

import matplotlib.pyplot as plt

import matplotlib

matplotlib.rcParams['font.family']='SimHei'

matplotlib.rcParams['font.sans-serif']=['SimHei']

labels=np.array(['作业1','作业2','作业3','作业4','作业5']) #标签

nAttr=5

data=np.array([19,16,18,19,8]) # 作业的数据

angles=np.linspace(0,2*np.pi,nAttr,endpoint=False)

data=np.concatenate((data,[data[0]]))

angles=np.concatenate((angles,[angles[0]]))

fig=plt.figure(facecolor="white") #背景颜色

plt.subplot(111,polar=True)

plt.plot(angles,data,'bo-',color='g',linewidth=2)

plt.fill(angles,data,facecolor='g',alpha=0.25) #填充颜色

plt.thetagrids(angles*180/np.pi,labels)

plt.figtext(0.52,0.95,'潘巧妍的成绩表',ha='center')

plt.grid(True)

plt.savefig('panq,JPG')

plt.show() 

结果如图:

 

二.numpy库读书笔记

1.numpy库不用安装,树莓派Python v3默认安装已经包含了numpy。

2.numpy:支持N维数组运算、处理大型矩阵(Matrix)、成熟的广播函数库、矢量运算、线性代数、傅里叶变换、随机数生成,并可与C++/Fortran语言无缝结合。

3.常用的数组创建函数

导入模块:import numpy as np

(1)np.array([x,y,z],dtype=int):从python列表和元组创建数组(dtyoe为数据类型)

>>> np.array([1, 2, 3, 4, 5]) # 把列表转换为数组

array([1, 2, 3, 4, 5])

(2)np.arrange(x,y,i):创建一个从x到y,以i为步长的数组

>>> np.arange(1, 10, 2)

array([1, 3, 5, 7, 9])

(3)np.linspace(x,y,n):创建一个由x到y,等分成n个元素的数组

>>> np.linspace(0, 10, 11) # 等差数组,包含11个数

array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])

(4)np.indices((m,n)):创建一个m行n列的矩阵

 

 

(5)np.ones((m,n),dtype):创建一个m行n列全为1的数组,dtype是数据类型

>>> np.ones((3,3)) # 全1二维数组

array([[ 1., 1., 1.],

[ 1., 1., 1.],

[ 1., 1., 1.]])

(6)np.empty((m,n),dtype):创建一个m行n列全为0的数组

>>> np.empty((3,3)) # 空数组,只申请空间而不初始化,元素值是不确定的

array([[ 0., 0., 0.],

[ 0., 0., 0.],

[ 0., 0., 0.]])

(7)np.zeros((m,n),dtype): 创建一个m行n列全为0的数组

np.zeros((3,3)) # 全0二维数组,3行3列

[[ 0. 0. 0.]

[ 0. 0. 0.]

[ 0. 0. 0.]]

(8)np.identity(n) :创建n行n列单位矩阵

>>> np.identity(3) # 单位矩阵

array([[ 1., 0., 0.],

[ 0., 1., 0.],

[ 0., 0., 1.]])

 

4.实现数组转置

(1)一维数组转置后还是一样的

>>> a = np.array((1, 2, 3, 4))

>>> a

array([1, 2, 3, 4])

>>> a.T # 一维数组转置以后和原来是一样的

array([1, 2, 3, 4])

(2)matrix()标准矩阵运算(一维数组可以实现转置)

>>> a4=[1,2,3,4]

>>> a5=np.matrix(a4)

>>> a5

matrix([[1, 2, 3, 4]])

>>> a5.T

matrix([[1],

[2],

[3],

[4]])

(2)正常情况下

>>> b = np.array(([1, 2, 3], [4, 5, 6], [7, 8, 9]))

>>> b

array([[1, 2, 3],

[4, 5, 6],

[7, 8, 9]])

>>> b.T # 转置

array([[1, 4, 7],

[2, 5, 8],

[3, 6, 9]])

 

三.matplotlib读书笔记

1.matplotlib是提供数据绘图功能的第三分库,其子库pyplot主要用于实现各种数据展示图像的绘制。

引用代码:

import matplotlib.pyplot as plt

import matplotlib

matplotlib.rcParams['font.family']='SimHei' #为了正确显示中文字体,第3、4行代码是必须的

matplotlib.rcParams['font.sans-serif']=['SimHei']

以下将使用plt代替matplotlib.pyplot。

2.plt库的绘图区域函数

plt.figure(figsize=None,figcolor=None):创建一个全局绘图区域

plt.axes(rect,axisbg='w'):创建一个坐标系风格的子绘图区域(rec=[left,bottom,width,height],axisbg指背景色)

plt.subplot(nrows,ncols,plot_number):在全局绘图区域中创建一个子绘图区域

(nrows为行,ncols为列,根据先行后列的计数方式在plot_number位置生成一个坐标系)

plt.subplot(324):全局绘图区域被分割成3x2的网格,,其中在第四个位置绘制了一个坐标系

plt.axes()默认创建一个subplot(111)坐标系

 

四.自定义手绘图

from PIL import Image

import numpy as np

a=np.asarray(Image.open(r'C:/Users/Asus/Desktop/媌.jpg').convert('L')).astype('float')

depth=10

grad=np.gradient(a)#取图像灰度的梯度值

grad_x,grad_y=grad#分别取横纵图像梯度值

grad_x=grad_x*depth/100

grad_y=grad_y*depth/100

A=np.sqrt(grad_x**2+grad_y**2+1)

uni_x=grad_x/A

uni_y=grad_y/A

uni_z=1/A

vec_el=np.pi/2.2#光源的俯视角度,弧度值

vec_az=np.pi/4 #光源的方位角度,弧度值

dx=np.cos(vec_el)*np.cos(vec_az)

dy=np.cos(vec_el)*np.cos(vec_az)

dz=np.sin(vec_el)

b=255*(dx*uni_x+dy*uni_y+dz*uni_z)#光源归一化

b=b.clip(0,255)

im=Image.fromarray(b.astype('uint8'))#重构图像

im.save(r'C:/Users/Asus/Desktop/panq.jpg')

原图: 手绘效果:

猜你喜欢

转载自www.cnblogs.com/panqiaoyan/p/10750326.html