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()
nd = np.arange(-np.pi,np.pi,0.05)
plt.plot(nd,np.sin(nd),nd,np.cos(nd))
# 为图添加网格线
plt.grid(True)
plt.show()
设置grid参数(参数与plot函数相同),使用plt面向对象的方法,创建多个子图显示不同的网格
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()
nd = np.random.randn(10)
plt.plot(nd)
# 自定义设置xy轴的上下限
plt.axis([-5,15,-5,10])
plt.show()
xlim方法和ylim方法nd = np.arange(0,10,1)
plt.plot(nd)
plt.xlim(-2,12)
plt.ylim(2,10)
plt.show()
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()
nd = np.linspace(-np.pi,np.pi,100)
plt.plot(nd,np.sin(nd))
plt.title("f(x) = sin(x)")
plt.show()
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的选项
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语句中支持除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()
直方图
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()
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')