图片灰度处理
- 下面代码导入的模块
import numpy as np import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt import matplotlib as mpl from mpl_toolkits.mplot3d.axes3d import Axes3D
- 图片灰度处理的三种方法
# 图片灰度处理三种方法 im_data = plt.imread('fj.jpg') print(im_data.shape) plt.imshow(im_data) plt.show() # 方法一 使用最大值法 im_data_1 = im_data.max(axis=2) print(im_data_1.shape) plt.imshow(im_data_1) plt.show() # 方法二 求平均值 im_data_2 = im_data.mean(axis=-1) print(im_data_2.shape) plt.imshow(im_data_2) plt.show() # 方法三 加权平均法 # 红绿蓝权重 arr = np.array([0.299,0.587,0.114]) # 矩阵乘法 im_data_3 = np.dot(im_data,arr) print(im_data_3.shape) plt.imshow(im_data_3) plt.show()
绘制图
- 只含单一曲线图
nd = np.linspace(0,10,10) plt.plot(nd,nd**2) plt.show()
- 在一个图中绘制多条曲线
nd = np.arange(0,10,1) plt.plot(nd,nd*2) plt.plot(nd,nd/2) plt.plot(nd,nd**3) # 也可以将多条曲线放到一个plot中 # plt.plot(nd,nd*2,nd,nd/2,nd,nd**3) plt.show()
网格线
- 绘制正弦余弦
设置grid参数(参数与plot函数相同),使用plt面向对象的方法,创建多个子图显示不同的网格nd = np.arange(-np.pi,np.pi,0.05) plt.plot(nd,np.sin(nd),nd,np.cos(nd)) # 为图添加网格线 plt.grid(True) plt.show()
lw代表linewidth,线的粗细
alpha表示线的明暗程度
color代表颜色#设置图片间隔大小 plt.figure(figsize=(12,9)) # 创建一行 有三列 第一个视图 nd = np.arange(-np.pi,np.pi,0.05) axes = plt.subplot(1,3,1) axes.grid(color='red',linestyle='--',linewidth=2) axes.plot(nd,np.sin(nd)) # 创建一行 有三列 第二个视图 nd2 = np.arange(-20,20,0.05) axes2 = plt.subplot(1,3,2) axes2.grid(color='gray',linestyle='-.',linewidth=2) axes2.plot(nd2,np.cos(nd2)) # 创建一行 有三列 第三个视图 nd3 = np.arange(-10,10,0.05) axes3 = plt.subplot(1,3,3) axes3.grid(color='blue',linestyle='--',linewidth=2) axes3.plot(nd3,np.sin(nd3)) plt.show()
- 坐标轴界限
axis方法:如果axis方法没有任何参数,则返回当前坐标轴的上下限axis(xmin =,ymax =)
xlim方法和ylim方法nd = np.random.randn(10) plt.plot(nd) # 自定义设置xy轴的上下限 plt.axis([-5,15,-5,10]) plt.show()
除了plt.axis方法,还可以通过xlim,ylim方法设置坐标范围nd = np.arange(0,10,1) plt.plot(nd) plt.xlim(-2,12) plt.ylim(2,10) plt.show()
- 坐标轴标签
xlabel方法和ylabel方法nd = np.arange(0,10,1) nd2 = nd**2+5 plt.plot(nd,nd2) plt.xlabel("X",size=20) plt.ylabel("f(x) = nd**2+5",rotation=45) plt.show()
- 标题
title方法nd = np.linspace(-np.pi,np.pi,100) plt.plot(nd,np.sin(nd)) plt.title("f(x) = sin(x)") plt.show()
图例
-
legend方法
两种传参方法:- 在plot函数中增加label参数
- 在legend方法中传入字符串列表
nd = np.arange(0,10,1) plt.plot(nd,nd,nd,nd*2,nd,nd/2) # 参数传递需要加中括号 # loc = (0.5,1) 相对值,相对图片的宽高,一个图片的宽度单位 plt.legend(['normal','fast','slow'],loc=0) plt.show()
nd = np.arange(0,10,1) plt.plot(nd,nd,label='normal') # 如果不想label参数再图例中进行显示,则将参数设为'_xxx' plt.plot(nd,nd*2,label='_fast') plt.plot(nd,nd/2,label='slow') plt.legend() plt.show()
-
loc参数
字符串 数值 字符串 数值 best 0 center left 6 upper right 1 center right 7 upper left 2 lower center 8 lower left 3 upper center 9 lower right 4 center 10 right 5 -
ncol参数
ncol控制图例中有几列nd = np.arange(0,10,1) plt.plot(nd,nd,nd,nd*2,nd,nd/2) # loc = (0.5,1) 相对值,相对图片的宽高,一个图片的宽度单位 plt.legend(['normal','fast','slow'],loc=(0.5,1),ncol=2) plt.show()
-
linestyle,color,marker 修改线条样式
nd = np.random.randn(100) nd2 = np.random.randn(100) nd3 = np.random.randn(100) plt.plot(nd.cumsum(),color='red',linestyle='--',marker='o') plt.plot(nd2.cumsum(),color='yellow',linestyle='-.',marker='>') plt.plot(nd3.cumsum(),color='blue',linestyle=':',marker='*') plt.legend(['X','Y','Z']) plt.show()
保存图片
figure.savefig的选项
- filename:含有文件路径的字符串或者python的文件型对象,图像格式由文件扩展名推断得出,例如,pdf推断出PDF,png推断出PNG(“png”,“pdf”,“svg”,…)
- dpi:图像分辨率(每英寸点数),默认为100
- facecolor:图像的背景色,默认为"w"(白色)
nd = np.random.randn(100) nd2 = np.random.randn(100) nd3 = np.random.randn(100) plt.plot(nd.cumsum(),color='red',linestyle='--',marker='o') plt.plot(nd2.cumsum(),color='yellow',linestyle='-.',marker='>') plt.plot(nd3.cumsum(),color='blue',linestyle=':',marker='*') plt.legend(['X','Y','Z']) plt.savefig(fname='pic.jpg',dpi=500,facecolor='w') plt.show()
设置plot的风格和样式(三种设置方式)
- 方式一:向方法中传入关键字参数
plot语句中支持除X,Y以外的参数,以字符串形式存在,来控制颜色,线型,点型等要素,语法形式为:plt.plot(X,Y,‘format’,…)
-
点和线的样式
颜色:参数color或者c -
颜色值的方式
别名:color = ‘r’
合法的HTML颜色名:color=‘red’颜色 别名 HTML颜色名 颜色 别名 HTML颜色名 蓝色 b blue 绿色 g green 红色 r red 黄色 y yellow 青色 c cyan 黑色 b black 洋红色 m magenta 白色 w write -
jpg,png的区别
格式不同,导致存储数据的时候
png:归一化的红绿蓝数据
jpg:0-255 -
HTML 十六进制字符串
color=“ffffff” -
归一化到(0,1]的RGB元组
color = (0.3,0.4,0.5) -
透明度
alpha参数nd = np.arange(0,10,0.1) plt.plot(nd,np.sin(nd),'r',alpha=0.5) plt.show()
-
背景色
设置背景色,通过plt.subplot()方法传入facecolor参数,来设置坐标轴的背景色nd = np.arange(0,10,0.1) axes = plt.subplot(facecolor='green') axes.plot(nd,np.sin(nd),'r') plt.show()
-
线型
参数linestyle或者ls线条风格 描述 线条风格 描述 ‘-’ 实线 ‘.’ 虚线 ‘–’ 破折线 ‘steps’ 阶梯线 ‘-.’ 点划线 ‘None’/’,’ 什么都不画 -
线宽
linewidth或者lw参数nd = np.arange(0,10,0.1) plt.plot(nd,np.sin(nd),ls='steps',lw=2) plt.show()
-
不同宽度的破折线
dashes参数:设置破折号序列各段的宽度nd = np.arange(0,10,0.1) # dashes = [] 参数线段长度,间隔,线段的长度 plt.plot(nd,np.sin(nd),ls='-.',dashes=[2,5,5,2,15,6]) plt.show()
-
点型
marker参数标记 描述 标记 描述 ‘1’ 一脚朝下的三脚架 ‘3’ 一脚朝左的三脚架 ‘2’ 一脚朝上的三脚架 ‘4’ 一脚朝右的三脚架 ‘s’ 正方形 ‘p’ 五边形 ‘h’ 六边形1 ‘H’ 六边形2 ‘8’ 八边形 ‘.’ 点 ‘x’ X ‘*’ 星号 ‘+’ 加号 ‘,’ 像素 ‘o’ 圈圈 ‘D’ 菱形 ‘d’ 小菱形 ‘None’ 什么都没有 ‘_’ 水平线 “/” 水平线 ‘v’ 一脚朝下的三角形 ‘<’ 一脚朝左的三角形 ‘^’ 一脚朝上的三角形 ‘>’ 一脚朝右的三角形 nd = np.arange(0,10,0.1) plt.plot(nd,np.sin(nd),'r',ls='--',marker='3',markersize=10) plt.show()
-
多参数连用
颜色,点型,线型nd = np.arange(0,10,0.1) plt.plot(nd,np.sin(nd),'r--o') plt.show()
-
更多点和线的设置
参数 描述 参数 描述 color或者c 线的颜色 linestyle或者ls 线型 linewidth或者lw 线宽 marker 点型 markeredgecolor 点边沿的颜色 markeredgewidth 点边缘的宽度 markerfacecolor 点内部的颜色 markersize 点的大小 nd = np.arange(0,10,1) plt.plot(nd,'r--',marker='o',markersize=10,markeredgecolor='green',markeredgewidth=5,markerfacecolor='purple') plt.show()
-
多个曲线同一设置
属性名声明
plt.plot(x1,y1,x2,y2,fmt,…)nd = np.arange(0,10,1) # 如果设置属性的时候,不声明属性名称,那么这个属性就会给距离最近的曲线设置属性 plt.plot(nd,nd*2,nd,np.sin(nd)*5,ls ='--',lw=3,c='r') plt.show()
-
多个曲线不同设置
多个都进行设置时,无需声明属性 plt.plot(x1,y1,fmt1,x2,y2,fmt2,…)nd = np.arange(0,10,1) plt.plot(nd,nd*2,'r--<',nd,np.sin(nd)*5,'g-.>') plt.show()
-
方式二 :对实例使用一序列的set方法
nd = np.arange(0,10,0.1) line, = plt.plot(nd,np.sin(nd)) line2, = plt.plot(nd,np.cos(nd)) line3, = plt.plot(nd,nd*2) line.set_color('r') line2.set_color('y') line3.set_color('g') line.set_linestyle('--') line2.set_linestyle('-.') line3.set_linestyle('steps') plt.show()
-
方式三:使用setp()方法
nd = np.arange(0,10,0.1) line, = plt.plot(nd,np.sin(nd)) plt.setp(line,linestyle='--') plt.show()
-
X,Y轴坐标刻度
nd = np.random.randn(100) plt.plot(nd.cumsum()) plt.xticks(np.linspace(0,100,5),list('ABCDE'),rotation=60) plt.yticks(np.linspace(-10,20,3),['min',0,'max'],fontsize=20) plt.show()
2D图形绘制
-
直方图
nd = np.random.randint(0,10,10) plt.hist(nd) plt.show()
-
条形图
ndx = np.linspace(0,5,5) ndy = np.random.randint(0,20,size=5) plt.bar(ndx,ndy) # plt.barh(ndx,ndy) plt.show()
-
饼图
pie()饼图适合展示各部分占总体的比例,条形图适合比较各部分的大小参数 说明 参数 说明 labels 设置每一块的标签 labeldistance 设置标签距离圆心的距离 autopct 设置比例值的显示格式(%1.1f%%) pctdistance 设置比例值文字距离圆心的距离 explode 设置每一块顶点距圆形的长度 colors 设置每一块的颜色 shadow 为布尔值 startangle 旋转角度 普通占满饼图
nd = np.array([0.7,0.1,0.2]) # plt.figure(figsize=(4,4)) plt.pie(nd,labels=['dog','cat','dark'],autopct='%1.2f%%',labeldistance=0.8,pctdistance=0.5,explode=(0,0.2,0),colors=('purple','green','blue'),shadow=True,startangle=60) plt.axis("equal") plt.show()
-
散点图
散点图需要两个参数x,y,但此时x不是表示x轴的刻度,而是每个点的横坐标x = np.random.randn(1000) y = np.random.randn(1000) r_color = np.random.random(3000).reshape(1000,3) r_size = np.random.randint(0,20,1000) plt.scatter(x,y,color=r_color,s = r_size,marker='d') plt.show()
-
图形内的文字,注释,箭头
控制文字属性的方法python函数 API方法 描述 text() mpl.axes.Axes.text() 在axes对象的任意位置添加文字 xlabel() mpl.axes.Axes.set_xlabel() 为x轴添加标签 ylabel() mpl.axes.Axes.set_ylabel() 为y轴添加标签 title() mpl.axes.Axes.set_title() 为axes对象添加标题 legend() mpl.axes.Axes.legend() 为axes对象添加图例 figtext() mpl.figure.Figure.figtext() 在figure对象的任意位置添加文字 suptitle() mpl.figure.Figure.suptitle() 在figure对象的任意位置添加标题 annotate() mpl.axes.Axes.annotate() 为axes对象添加注释(箭头可选) 所有的方法会返回一个matplotlib.text.Text对象
-
图形内的文字
x = np.arange(0,2*np.pi,0.01) plt.plot(np.sin(x)) # x轴坐标,y轴坐标,文字 plt.text(0,0,'sin(0) = 0') # 使用figtext的时候,x,y代表相对值,图片的宽高 # plt.figtext(1,200,'sin(0) = 0') plt.show()
-
注释
参数 说明 annotate() xy参数设置箭头指示的位置,xytext参数设置注释文字的位置 arrowprops 参数以字典的形式设置箭头的样式 width 参数设置箭头长方形部分的宽度,headlength擦书设置箭头端的长度 headwidth 参数设置箭头尖端底部的宽度,shrink参数设置箭头顶点,尾部与指示点,注释文字的距离 x = np.random.randint(0,10,size=10) x[5] = 30 plt.plot(x) plt.ylim([-2,35]) plt.annotate('the text of zhe annotation',xy=(5,30),xytext=(7,31),arrowprops={'width':10,'headwidth':20,'headlength':10,'shrink':0.1}) #plt.annotate('the text of zhe annotation',xy=(5,30),xytext=(7,31),arrowprops={'arrowstyle':'->'}) plt.show()
3D图形绘制
- 曲面图
x = np.arange(0,8,0.1) y = np.arange(0,8,0.1) # 生成网格点 X,Y = np.meshgrid(x,y) def mk_Z(X,Y): return 3+0.5*np.sin(X)*np.cos(Y)-np.cos(2-X) Z = mk_Z(X,Y) axes = plt.subplot(121,projection='3d') axes.plot_surface(X,Y,Z,rstride=10,cstride=10) axes2 = plt.subplot(122,projection='3d') s_axes = axes2.plot_surface(X,Y,Z,rstride=10,cstride=10,cmap='rainbow') plt.colorbar(s_axes,shrink=0.5) axes2.set_xlabel('X') axes2.set_ylabel('Y') axes2.set_zlabel('Z') plt.show()
- 玫瑰图/极坐标图
def show_rose(values,title): # 玫瑰图的花瓣个数8,45度 n = 8 angle = np.arange(0,np.pi*2,2*np.pi/n) # 绘制的数据values radius = np.array(values) # axis 轴(x,y) # axes 整个画面 # polar 为true时为玫瑰图,为false时为条形图 plt.axes([0,0,1,1],polar= True) color = np.random.random(size=24).reshape((8,3)) plt.bar(values,radius,color=color) plt.title(title) plt.show() v = [1,2,3,4,5,6,7,8] show_rose(v,'test')