科学计算与可视化-------------
一,读书笔记
Matplotlib
matplotlib是Python优秀的数据可视化第三方库
matplotlib库的效果可参考
http://matplotlib.org/gallery.html
matplotlib的使用 由各种可视化类构成,内部结构复杂,受matlab库启发,matplotlab.pyplot是绘制种类可视化图形的命令子库,相当于快捷方式
import matplotlib.pyplot as plt
绘制多图subplot
plot.subplot(nrows,ncols,plot_number)
在全局绘制区域中创建一个分区体系,并定位到一个子绘图区域
pyplot的plot()函数详解
plt.plot(x,y,format_string,**kwargs)
x:x轴数据,列表或数组,可选
y:y轴数据,列表或数组
format_string: 控制曲线的格式字符串,可迁
**kwargs: 第二组或更多的(x,y,format_string)
注意:当绘制多条曲线时,各条曲线的x不能省略
format_string:控制曲线的格式字符串,可选。由颜色字符、风格字符和标记字符组成
颜色字符 | 说明 | 颜色字符 | 说明 |
---|---|---|---|
‘b‘ | blue | ‘m‘ | magenta洋红色 |
‘g‘ | green | ‘y‘ | 黄色 |
‘r‘ | red | ‘k‘ | 黑色 |
‘c‘ | cyan青绿色 | ‘w‘ | 白色 |
‘#008000‘ | RGB某颜色 | ‘0.8‘ | 灰度值字符串 |
风格字符 | 说明 |
---|---|
‘-‘ | 实线 |
‘--‘ | 破折线 |
‘-.‘ | 点划线 |
‘:‘ | 虚线 |
‘ ‘ | 无线条 |
标记字符 | 说明 | 标记字符 | 说明 | 标记字符 | 说明 |
---|---|---|---|---|---|
‘.‘ | 点标记 | ‘1‘ | 下花三角标记 | ‘h‘ | 竖六边形标记 |
‘,‘ | 像素标记(极小点) | ‘2‘ | 上花三角标记 | ‘H‘ | 横六边形标记 |
‘o‘ | 实心圏标记 | ‘3‘ | 左花三角标记 | ‘+‘ | 十字形标记 |
‘v‘ | 倒三角标记 | ‘4‘ | 右花三角标记 | ‘x‘ | x标记 |
‘^‘ | 上三角标记 | ‘s‘ | 实心方形标记 | ‘D‘ | 菱形标记 |
‘>‘ | 右三角标记 | ‘p‘ | 实心五角标记 | ‘d‘ | 瘦菱形标记 |
‘<‘ | 左三角标记 | ‘*‘ | 星形标记 | ‘ | ‘ |
**kwargs: 第二组或更多(x,y,format_string)
color: 控制颜色 如color=‘green‘
linestyle:线条控制 如linestyle=‘dashed‘
marker:标记风格,marker=‘o‘
markerfacecolor:标记颜色,markerfacecolor=‘blue‘
markersize:标记尺寸,markersize=20
...
pyplot的中文显示
pyplot并不默认支持中文显示,需要rcParams修改字体实现
全局设置中文字体
import matplotlib
import matplotlib.pyplot as plt
matplotlib.rcParams[‘font.family‘]=‘SimHei‘
plt.plot([3,1,4,5,2])
plt.ylabel(‘纵轴值‘)
plt.savefig(‘test‘,dpi=600)
plt.show()
rcParams的属性
属性 | 说明 |
---|---|
‘font.family‘ | 用于显示字体的名字 |
‘font.style‘ | 字体风格,正常‘normal‘或斜体‘italic‘ |
‘font.size‘ | 字体大小,整数字号或者‘large‘,‘x-small‘ |
中文字体的种类
rcParams[‘font.family‘]
| 中文字体 | 说明 |
|------------|----------|
| ‘SimHei‘ | 中文黑体 |
| ‘Kaiti‘ | 中文楷体 |
| ‘LiSu‘ | 中文隶书 |
| ‘FangSong‘ | 中文仿宋 |
| ‘YouYuan‘ | 中文幼圆 |
| STSong | 华文宋体 |
局部设置中文字体
在有中文输出的地方,增加一个属性:fontproperties
pyplot的文本显示
pyplot的文本显示函数
| 函数 | 说明 |
|----------------|--------------------------|
| plt.xlabel() | 对x轴增加文本标签 |
| plt.ylabel() | 对y轴增加文本标签 |
| plt.title() | 对图形本整体增加文本标签 |
| plt.text() | 在任意位置增加文本 |
| plt.annotate() | 在图形中增加带箭头的注释 |
Numpy
二,学习成绩雷达图:
代码如下:
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Wed May 6 15:34:33 2020 4 5 @author: 49594 6 """ 7 8 #DrawDota.py 9 import numpy as np 10 import matplotlib.pyplot as plt 11 import matplotlib 12 matplotlib.rcParams['font.family']='SimHei' 13 matplotlib.rcParams['font.sans-serif']=['SimHei'] 14 labels = np.array(['第二','第三','第四','第五、六','第七']) 15 nAttr = 5 16 data = np.array([70,80,90,100,86])#数据值 17 angles = np.linspace(0,2*np.pi,nAttr,endpoint=False) 18 data = np.concatenate((data,[data[0]]))#连接data和data[0] 19 angles = np.concatenate((angles,[angles[0]]))#连接angles和angles[0] 20 fig = plt.figure(facecolor="white")#创建一个全局绘图区域 21 plt.subplot(111,polar=True) 22 plt.title('Python123成绩表(单位:周)') 23 plt.plot(angles,data,'bo-',color='b',linewidth=2) 24 plt.fill(angles,data,facecolor='g',alpha=0.6) 25 plt.thetagrids(angles*180/np.pi,labels)#在各个angles的位置上标记上对应的labels 26 plt.figtext(0.72,0.95,'学号:2019310143002')#为全局绘图区添加文字 27 plt.grid(True) 28 plt.show()
三,手绘自定义:
原图如下:
代码如下:
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Wed May 6 15:56:09 2020 4 5 @author: 49594 6 """ 7 8 #HandDrawpic.py 9 from PIL import Image 10 import numpy as np 11 vec_el = np.pi/2.2 #光源的俯视角度,弧度值 12 vec_az = np.pi/4. #光源的方位角度,弧度值 13 depth = 15. #(0-100) 14 im = Image.open('66.jpg').convert('L') 15 a = np.asarray(im).astype('float') 16 grad = np.gradient(a) #取图像灰度的梯度值 17 grad_x,grad_y = grad #分别取横纵图像梯度值 18 grad_x = grad_x*depth/100. 19 grad_y = grad_y*depth/100. 20 dx = np.cos(vec_el)*np.cos(vec_az) #光源对x轴的影响 21 dy = np.cos(vec_el)*np.sin(vec_az) #光源对y轴的影响 22 dz = np.sin(vec_el)#光源对z轴的影响 23 A = np.sqrt(grad_x**2+grad_y**2+1.) 24 uni_x = grad_x/A 25 uni_y = grad_y/A 26 uni_z = 1./A 27 a2 = 255*(dx*uni_x+dy*uni_y+dz*uni_z)#光源归一化 28 a2 = a2.clip(0,255) 29 im2 = Image.fromarray(a2.astype('uint8'))#重构图像 30 im2.save('shouhui.jpg')
处理后,经过一定的测试比对,最终如下:
第四;绘制数学模型:sinx与cosx
代码如下:
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Wed May 6 16:16:56 2020 4 5 @author: 49594 6 """ 7 8 #绘制基本的物理规律和函数 9 import numpy as np 10 import matplotlib.pyplot as pt 11 x = np.arange(0, 360) 12 print(x) 13 y = np.sin(2 * x * np.pi / 180.0) 14 z = np.cos(x * np.pi / 180.0) 15 # 使用美元符号把标签包围起来,得到 LaTex 公式显示的效果 16 pt.plot(x, y, color='blue', label="$SIN(2x)$") 17 pt.plot(x, z, color='red', label="$COS(x)$") 18 pt.xlim(0, 360) 19 pt.ylim(-1.2, 1.2) 20 pt.title("SIN & COS function") 21 # 要有 pt.legend() 这个方法才会显示图例 22 pt.legend() 23 pt.show()
图形如下: