一.图片灰度处理
导包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
# 读取图片
jin = plt.imread('jinzhengen.png')
plt.imshow(jin)
jin.shape
输出:
(273, 411, 3)
jinzhengen.png
3种方法
# 1, 最大值法
jin_max = jin.max(axis=-1)
jin_max.shape
输出:
(273, 411)
plt.imshow(jin_max, cmap='gray')
plt.axis('off')
最大值法灰度.png
# 作为对比,使用最小值
jin_min = jin.min(axis=-1)
plt.imshow(jin_min, cmap='gray')
最小值法灰度.png
# 2,平均值
jin_mean = jin.mean(axis=-1)
plt.imshow(jin_mean,cmap='gray')
平均值法灰度.png
# 3,加权平均, 根据人眼对颜色敏感程度.
# [0.299,0.587,0.114]
jin_weight = np.dot(jin, np.array([0.299,0.587,0.114])) / 3
plt.imshow(jin_weight, cmap='gray')
加权平均法灰度.png
二.Matplotlib基础知识
导包
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
2.1 Matplotlib中的基本图表包括的元素
x轴和y轴
水平和垂直的轴线
x轴和y轴刻度
刻度标示坐标轴的分隔,包括最小刻度和最大刻度
x轴和y轴刻度标签
表示特定坐标轴的值
绘图区域
实际绘图的区域
2.2 画曲线
- 一条曲线
n = np.random.randint(0,10, size=10)
plt.plot(n)
一条曲线.png
- 多条曲线
1、可以使用多个plot函数(推荐),在一个图中绘制多个曲线
x = np.linspace(-np.pi, np.pi, 100)
y = np.sin(x)
z = np.cos(x)
plt.plot(x, y)
单条曲线.png
2、也可以在一个plot函数中传入多对X,Y值,在一个图中绘制多个曲线
plt.plot(x,y, x,z)
双条曲线.png
2.3 网格线
使用plt.grid(True)方法为图添加网格线
lw代表linewidth,线的粗细
alpha表示线的明暗程度
color代表颜色
方法一
plt.figure(figsize=(3*5, 5))
axes1 = plt.subplot(131) # plt.subplot(1,3,1) 返回一个轴面
# 要在这个创造出来的轴面中画图
x = np.linspace(-20,20, 1000)
axes1.plot(x, np.sin(x))
axes1.grid(True, linewidth=2, axis='both')
axes2 = plt.subplot(1,3,2)
axes2.plot(x, np.cos(x))
# alpha是线的透明度.
axes2.grid(True, color='r', alpha=0.6)
axes3 = plt.subplot(1,3,3)
axes3.plot(x, x**2)
# linestyple是线的风格
axes3.grid(True, color='g', linestyle='--', alpha=0.7)
网格图片.png
方法二
# 通过figure对象来创建子图
figure = plt.figure(figsize=(3*5, 5))
axes1 = figure.add_subplot(1,3,1)
x = np.linspace(-20,20, 1000)
axes1.plot(x, np.sin(x))
axes1.grid(True, linewidth=2, axis='both')
axes2 = plt.subplot(1,3,2)
axes2.plot(x, np.cos(x))
# alpha是线的透明度.
axes2.grid(True, color='r', alpha=0.6)
axes3 = plt.subplot(1,3,3)
axes3.plot(x, x**2)
# linestyple是线的风格
axes3.grid(True, color='g', linestyle='--', alpha=0.7)
网格图2.png
2.4 坐标轴界限axis方法设置
如果axis方法没有任何参数,则返回当前坐标轴的上下限axis(xmin =,ymax = )
plt.axis('xxx') 'tight'、'off'、'equal'……
x = np.linspace(-np.pi, np.pi, 100)
y = np.sin(x)
plt.plot(x,y)
# axis什么也不传,返回的是当前图形的坐标轴的界限.
plt.axis()
axis未传参数图.png
plt.plot(x,y)
# 通过axis方法来设置坐标轴的界限
plt.axis([-np.pi, np.pi, -1,1])
axis设置坐标图.png
plt.plot(x,y)
# tight是axis默认的样式,紧致的样式
# plt.axis('tight')
# off关闭坐标轴, 经常用在显示图片上.
# plt.axis('off')
# 设置equal, 把画布的长宽设置成一样大
plt.axis('equal')
axis设置equal图.png
除了plt.axis方法,还可以通过xlim,ylim方法设置坐标轴范围
plt.plot(x,y)
# 单独设置y轴的界限
# plt.ylim(ymin=-1, ymax=1)
plt.ylim((-1,1))
# xlim设置x轴界限
plt.xlim(-np.pi, np.pi)
xlim和ylim设置图.png
2.5 坐标轴标签
xlabel方法和ylabel方法
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
axes = plt.subplot(1,1,1)
line, = axes.plot(x,y)
# 设置x轴标签
# plt.xlabel('这是x轴', fontdict=dict(fontsize=20))
# 使用对象的set_xlabel方法,查看全部参数
axes.set_xlabel('这是X轴', fontdict=dict(fontsize=20))
X轴标签.png
axes = plt.subplot(1,1,1)
line, = axes.plot(x,y)
# 设置x轴标签
# plt.xlabel('这是x轴', fontdict=dict(fontsize=20))
# 使用对象的set_xlabel方法,查看全部参数
ylabel = axes.set_ylabel('这是Y轴', fontdict=dict(fontsize=20), rotation=0, position=(0,1))
ylabel.set_alpha(0.5)
ylabel.set_bbox(dict(facecolor='red', alpha=0.5))
Y轴标签.png
2.6 坐标轴标题
title方法
plt.plot(x,y)
title = plt.title('这是一个正弦', fontdict=dict(fontsize=20), loc='right')
坐标轴标题.png
2.7 图例legend
legend方法
两种传参方法:
1.【推荐使用】在plot函数中增加label参数
2.在legend方法中传入字符串列表
x = np.linspace(0,10, 100)
y1 = 2*x
# label中的字符串不能用下划线开头, 加了下划线开头的图裂将不会显示.
plt.plot(x,y1, label='_fast')
plt.plot(x,x, label='normal')
plt.plot(x, 0.5*x, label='slow')
# 两种方法设置图例
# 第一种, 在画图的时候,指定label, 再调用legend方法
plt.legend()
图例1.png
# 第二种方法
# 不需要在创建图形的时候写label
x = np.linspace(0,10, 100)
y1 = 2*x
plt.plot(x,y1)
plt.plot(x,x)
plt.plot(x, 0.5*x)
# 通过legend方法传入一个列表,分别表示对不同的图形的说明
plt.legend(['fast', 'normal', 'slow'])
图例2.png
-
loc参数
loc.png
x = np.linspace(0,10, 100)
y1 = 2*x
plt.plot(x,y1)
plt.plot(x,x)
plt.plot(x, 0.5*x)
# 通过legend方法传入一个列表,分别表示对不同的图形的说明
plt.legend(['fast', 'normal', 'slow'], loc=5)
loc图.png
2.8 ncol参数
ncol控制图例中有几列
x = np.linspace(0,10, 100)
y1 = 2*x
plt.plot(x,y1)
plt.plot(x,x)
plt.plot(x, 0.5*x)
# 通过legend方法传入一个列表,分别表示对不同的图形的说明
plt.legend(['fast', 'normal', 'slow'], loc=(0,1), ncol=3)
nloc图.png
2.9 linestyle、color、marker
修改线条样式
2.10 保存图片
figure.savefig的选项:
filename:含有文件路径的字符串或Python的文件型对象。图像格式由文件扩展名推断得出,例如,.pdf推断出PDF,.png推断出PNG (“png”、“pdf”、“svg”、“ps”、“eps”……)
dpi:图像分辨率(每英寸点数),默认为100
facecolor:图像的背景色,默认为“w”(白色)
n1 = np.random.normal(loc=0, scale=2 ,size=100)
n2 = np.random.normal(loc=10, scale=3, size=100)
n3 = np.random.normal(loc=20,scale=5, size=100)
# 点的形状叫做点型, marker
figure = plt.figure(figsize=(12,9))
plt.plot(n1, label='one', linestyle='-.', marker='d', markersize=10)
plt.plot(n2, label='two', linestyle='--', marker='o')
plt.plot(n3, label='three', linestyle=':', marker='*', markersize=20)
plt.legend()
figure.savefig('art.jpg', dpi=500, facecolor='r', transparent=True)
保存图片.png
三.设置plot的风格和样式
3.1 点和线的样式
-
颜色
参数color或c
颜色.png
x = np.linspace(-10, 10, 1000)
plt.plot(x, np.sin(x), c='r')
颜色r.png
- 透明度
alpha参数
x = np.linspace(-10, 10, 1000)
# 透明度一般0到1就够了.
plt.plot(x, np.sin(x), c='r', alpha=0.8)
透明度.png
- 背景色
设置背景色,通过plt.subplot()方法传入facecolor参数,来设置坐标轴的背景色
axes = plt.subplot(1,1,1, facecolor='g')
x = np.linspace(-10, 10, 1000)
# 透明度一般0到1就够了.
plt.plot(x, np.sin(x), c='r', alpha=0.8)
背景色.png
-
线型
参数linestyle或ls
线型.png
x = np.linspace(-1, 1 ,1000)
y = (1-x**2)**0.5
plt.plot(x,y, linestyle='steps')
线型设置.png
- 线宽
inewidth或lw参数
x = np.linspace(-1, 1 ,1000)
y = (1-x**2)**0.5
plt.plot(x,y, linewidth=2)
线宽.png
- 点型
marker参数
x = np.linspace(-1, 1 ,20)
y = (1-x**2)**0.5
plt.figure(figsize=(12,9))
plt.plot(x,y, linewidth=2, marker='2', markersize=20)
点型.png
- 多参数连用
x = np.linspace(0, 5, 10)
plt.plot(x,3*x,'r-.')
plt.plot(x, x**2, 'b^:') # blue line with dots
plt.plot(x, x**3, 'go-.') # green dashed line
plt.show()
多参数连用.png
-
更多点和线的设置
y = np.arange(1, 3, 0.3)
plt.plot(y, color='blue',
linestyle='dashdot',
linewidth=4, marker='o',
markerfacecolor='red',
markeredgecolor='black',
markeredgewidth=3,
markersize=12);
plt.show()
点线设置图.png
3.2 X、Y轴坐标刻度
- xticks()和yticks()方法
x = [5, 3, 7, 2, 4, 1]
plt.plot(x);
plt.xticks(range(len(x)), ['a', 'b', 'c', 'd', 'e', 'f']); # 传入位置和标签参数,以修改坐标轴刻度
plt.yticks(range(1, 8, 2));
plt.show()
xticks.png
- 面向对象方法
set_xticks、set_yticks、set_xticklabels、set_yticklabels方法
fig = plt.figure(figsize=(10, 4))
ax = fig.add_subplot(111)
x = np.linspace(0, 5, 100)
ax.plot(x, x**2, x, x**3, lw=2)
ax.set_xticks([1, 2, 3, 4, 5])
ax.set_xticklabels(['a','b','c','d','e'], fontsize=18)
yticks = [0, 50, 100, 150]
ax.set_yticks(yticks)
ax.set_yticklabels([y for y in yticks], fontsize=18); # use LaTeX formatted labels
面向对象.png
- 正弦余弦:LaTex语法,用等表达式在图表上写上希腊字母
x = np.arange(-np.pi,np.pi,0.01)
plt.figure(figsize=(12,9))
plt.plot(x,np.sin(x),x,np.cos(x))
plt.axis([x.min()-1,x.max()+1,-1.2,1.2])
#xticks:参数一刻度,参数二,对应刻度上的值
plt.xticks(np.arange(-np.pi,np.pi+1,np.pi/2),
['$-\delta$','$-\pi$/2','0','$\pi$/2','$\pi$'],size = 20)
plt.yticks([-1,0,1],['min','0','max'],size = 20)
plt.show()
正弦余弦.png
四.2D图形
4.1 直方图
【直方图的参数只有一个x!!!不像条形图需要传入x,y】
hist()的参数
bins
可以是一个bin数量的整数值,也可以是表示bin的一个序列。默认值为10
normed
如果值为True,直方图的值将进行归一化处理,形成概率密度,默认值为False
color
指定直方图的颜色。可以是单一颜色值或颜色的序列。如果指定了多个数据集合,颜色序列将会设置为相同的顺序。如果未指定,将会使用一个默认的线条颜色
orientation
通过设置orientation为horizontal创建水平直方图。默认值为vertical
x = np.random.randint(5,size = 5)
display(x)
plt.hist(x,histtype = 'bar'); # 默认绘制10个bin
plt.show()
- 普通直方图/累计直方图
n = np.random.randn(10000)
fig,axes = plt.subplots(1,2,figsize = (12,4))
axes[0].hist(n,bins = 50)#普通直方图
axes[0].set_title('Default histogram')
axes[0].set_xlim(min(n),max(n))
axes[1].hist(n,bins = 50,cumulative = True)# 累计直方图
axes[1].set_title('Cumulative detailed histogram')
axes[1].set_xlim(min(n),max(n))
直方图.png
- 正太分布
u = 100 #数学期望
s = 15 #方差
x = np.random.normal(u,s,1000) # 生成正太分布数据
ax = plt.gca() #获取当前图表
ax.set_xlabel('Value')
ax.set_ylabel('Frequency') #设置x,y轴标题
ax.set_title("Histogram normal u = 100 s = 15") #设置图表标题
ax.hist(x,bins = 100,color = 'r',orientation='horizontal')
plt.show()
正态分布.png
4.2 条形图
- bar
# 第一个参数为条形左下角的x轴坐标,第二个参数为条形的高度;
# width参数设置条形宽度;color参数设置条形颜色;bottom参数设置条形底部的垂直坐标
plt.bar([1, 2, 3], [3, 2, 5], width=0.5, color='r', bottom=1);
plt.ylim([0, 7])
plt.show()
bar图.png
# 例子:绘制并列条形图
data1 = 10*np.random.rand(5)
data2 = 10*np.random.rand(5)
data3 = 10*np.random.rand(5)
locs = np.arange(1, len(data1)+1)
width = 0.27
plt.bar(locs, data1, width=width);
plt.bar(locs+width, data2, width=width, color='red');
plt.bar(locs+2*width, data3, width=width, color='green') ;
plt.xticks(locs + width*1, locs);
plt.show()
bar1.png
- barh
plt.barh([1, 2, 3], [3, 2, 5],height = 0.27,color = 'cyan');
plt.show()
barh.png
4.3 饼图
pie()
饼图适合展示各部分占总体的比例,条形图适合比较各部分的大小
plt.figure(figsize = (4,4)) # 饼图绘制正方形
x = [45,35,20] #百分比
labels = ['Cats','Dogs','Fishes'] #每个区域名称
plt.pie(x,labels = labels)
plt.show()
饼图1.png
plt.figure(figsize=(4, 4));
x = [0.1, 0.2, 0.3] # 当各部分之和小于1时,则不计算各部分占总体的比例,饼的大小是数值和1之比
labels = ['Cats', 'Dogs', 'Fishes']
plt.pie(x, labels=labels); # labels参数可以设置各区域标签
plt.show()
饼图2.png
# labels参数设置每一块的标签;labeldistance参数设置标签距离圆心的距离(比例值)
# autopct参数设置比例值的显示格式(%1.1f%%);pctdistance参数设置比例值文字距离圆心的距离
# explode参数设置每一块顶点距圆形的长度(比例值);colors参数设置每一块的颜色;
# shadow参数为布尔值,设置是否绘制阴影
plt.figure(figsize=(4, 4));
x = [4, 9, 21, 55, 30, 18]
labels = ['Swiss', 'Austria', 'Spain', 'Italy', 'France', 'Benelux']
explode = [0.2, 0.1, 0, 0, 0.1, 0]
colors = ['r', 'k', 'b', 'm', 'c', 'g']
plt.pie(x,
labels=labels,
labeldistance=1.2,
explode=explode,
colors=colors,
autopct='%1.1f%%',
pctdistance=0.5,
shadow=True);
plt.show()
饼图3.png
# 绘制一个正方形的figure and axes
plt.figure(1, figsize=(4, 4))
# 圆弧按照逆时针绘制
labels = 'Spring', 'Summer', 'Autumn', 'Winter'
values = [15, 16, 16, 28]
explode =[0.1, 0.1, 0.1, 0.1] # 指定分裂序列,每一个元素表示每个圆弧间的偏移量,为半径的百分比
# 绘制饼图
plt.pie(values,
explode=explode,
labels=labels,
autopct='%1.1f%%', # 格式化绘制圆弧中的标签,标签可以是一个格式化字符串或者一个可调用的对象(函数)
startangle=90) # 指定圆弧开始绘制的角度,默认从角度0(x轴)开始绘制
plt.title('Rainy days by season');
饼图4.png
4.4 散点图
【散点图需要两个参数x,y,但此时x不是表示x轴的刻度,而是每个点的横坐标!】
scatter()
# s参数设置散点的大小;c参数设置散点的颜色;marker参数设置散点的形状
x = np.random.randn(1000)
y = np.random.randn(1000)
size = 50*abs(np.random.randn(1000))
colors = np.random.randint(16777215,size = 1000)
li = []
for color in colors:
a = hex(color)
str1 = a[2:]
l = len(str1)
for i in range(1,7-l):
str1 = '0'+str1
str1 = "#" + str1
li.append(str1)
plt.scatter(x, y,s = size, c=li, marker='d');
plt.show()
散点图.png
五.图形内的文字、注释、箭头
5.1 文字
x = np.arange(0, 7, .01)
y = np.sin(x)
plt.plot(x, y);
plt.text(0.1, -0.04, 'sin(0)=0'); # 位置参数是坐标
plt.show()
文字.png
5.2 注释
# 生成3个正态分布数据数据集
x1 = np.random.normal(30, 3, 100)
x2 = np.random.normal(20, 2, 100)
x3 = np.random.normal(10, 3, 100)
# 绘制3个数据集,并为每个plot指定一个字符串标签
plt.plot(x1, label='plot') # 如果不想在图例中显示标签,可以将标签设置为_nolegend_
plt.plot(x2, label='2nd plot')
plt.plot(x3, label='last plot')
# 绘制图例
plt.legend(bbox_to_anchor=(0, 1.02, 1, 0.102), # 指定边界框起始位置为(0, 1.02),并设置宽度为1,高度为0.102
ncol=3, # 设置列数为3,默认值为1
mode="expand", # mode为None或者expand,当为expand时,图例框会扩展至整个坐标轴区域
borderaxespad=0.) # 指定坐标轴和图例边界之间的间距
# 绘制注解
plt.annotate("Important value", # 注解文本的内容
xy=(55,20), # 箭头终点所在位置
xytext=(5, 38), # 注解文本的起始位置,箭头由xytext指向xy坐标位置
arrowprops=dict(arrowstyle='->')); # arrowprops字典定义箭头属性,此处用arrowstyle定义箭头风格
注释.png
5.3 箭头
箭头.png六.3D图
6.1 导包
import numpy as np
import matplotlib.pyplot as plt
#3d图形必须的
from mpl_toolkits.mplot3d.axes3d import Axes3D
%matplotlib inline
6.2 生成数据
#系数,由X,Y生成Z
a = 0.7
b = np.pi
#计算Z轴的值
def mk_Z(X, Y):
return 2 + a - 2 * np.cos(X) * np.cos(Y) - a * np.cos(b - 2*X)
#生成X,Y,Z
x = np.linspace(0, 2*np.pi, 100)
y = np.linspace(0, 2*np.pi, 100)
X,Y = np.meshgrid(x, y)
Z = mk_Z(X, Y)
6.3 绘制图形
fig = plt.figure(figsize=(14,6))
#创建3d的视图,使用属性projection
ax = fig.add_subplot(1, 2, 1, projection='3d')
ax.plot_surface(X,Y,Z,rstride = 5,cstride = 5)
#创建3d视图,使用colorbar,添加颜色柱
ax = fig.add_subplot(1, 2, 2, projection='3d')
p = ax.plot_surface(X, Y, Z, cmap='rainbow', antialiased=True)
cb = fig.colorbar(p, shrink=0.5)
3D图.png
网友评论