Python高级--matplotlib画图

Matplotlib官方文档

一、Matplotlib基础

下面的测试数据下载
Matplotlib中的基本图表包括的元素

1) x轴和y轴  axis
水平和垂直的轴线

2)轴标签 axisLabel
水平和垂直的轴标签

3)x轴和y轴刻度  tick
刻度标示坐标轴的分隔,包括最小刻度和最大刻度

4)x轴和y轴刻度标签  tick label
表示特定坐标轴的值

5)绘图区域(坐标系)  axes
实际绘图的区域

6)画布 figure
呈现所有的坐标系

这里写图片描述

1)只含单一曲线的图

画一条正弦曲线

x = np.arange(-np.pi,np.pi,0.1)  # [start,] stop[, step,] 开始值 结束值 步长值
x
y = np.sin(x)
y
plt.plot(x,y)  # plot(x, y) 最简单的参数形式 传入x和y的值

这里写图片描述

2)只含多个曲线的图

方法一:使用多个plot函数(推荐)

x1 = np.arange(-np.pi,0,0.1)
x2 = np.arange(0,np.pi,0.1)
# 方式一:多次使用 plt.plot绘制多个函数
plt.plot(x1,np.sin(x1))
plt.plot(x2,np.sin(x2))

这里写图片描述

方法二:在一个plot函数中传入多对X,Y值

x1 = np.arange(-np.pi,0,0.1)
x2 = np.arange(0,np.pi,0.1)
#调用一次plt.plot里面传入多个x和y的值 plt.plot(x1,y1,x2,y2,...xn,yn)
plt.plot(x1,np.sin(x1),x2,np.sin(x2))

这里写图片描述

3)子画布

matplotlib中画布分为主画布与子画布,主画布包含子画布

1、设置主画布的大小

plt.figure(figsize=None)

x = np.arange(-np.pi,np.pi,0.1)
plt.figure(figsize=(5,5))  #设置主画布大小  注意设置画布大小必须在图形之前才有效
plt.plot(x,np.tan(x))

这里写图片描述

2、设置子画布的大小

plt.subplot(*args, **kwargs)

'''
# subplot(2, 3, 3) 
创建一个子画布 把原来的大的画布 
上下分成2部分 左右分成3部分 占用哪个部分
'''

(1) : 创建子画布

plt.figure(figsize=(8,8))
axes1 = plt.subplot(4,2,1)  # 根据传入的参数创建子画布 返回坐标系对象这里占纵向的1/4
axes2 = plt.subplot(4,2,4)
axes3 = plt.subplot(2,2,3)  #注意,这里的纵向画布是占总画布的一半
axes4 = plt.subplot(2,2,4)

(2) : 在子画布中绘图

在每一个小的坐标系上绘图 而不是在大的画布上绘图

axes1.plot(x,np.sin(x))
axes2.plot(x,np.cos(x))
axes3.plot(x,np.tan(x))
axes4.plot(x,np.tanh(x))

这里写图片描述

4)网格线

plt.grid(b=None,which=’major’,axis=’both’,**kwargs)

注意:如果画布有子画布的话,plt.grid只会给离他最近的那个子画布绘制网格线
一般给子画布单独绘制网格线

创建一个空的画布

plt.figure(figsize=(8,8))
axes1 = plt.subplot(221)
axes2 = plt.subplot(222)
axes3 = plt.subplot(223)
axes4 = plt.subplot(224)

这里写图片描述

axis显示轴向

'''
axis: 默认为横纵都有   
    axis="x" 在 X 轴上方绘制网格线
    axis="y" 在 Y 轴上方绘制网格线
'''
axes2.grid(axis='x')  # 在轴上方绘制网格线

color(c)代表颜色

alpha表示线的明暗程度

linewidth(lw)代表线的粗细

axes4.grid(color='red',linewidth=2,alpha=0.2)
axes1.grid()  # axis='both' 默认水平竖直方向都有网格线
axes2.grid(axis='x')  # 在轴上方绘制网格线
axes3.grid(axis='y')
axes4.grid(color='red',linewidth=2,alpha=0.2)

这里写图片描述

5)坐标轴的轴线

plt.axis([xmin,xmax,ymin,ymax])

1)设置坐标轴的刻度起止值

(1) plt.axis()设置坐标轴起始值

plt.axis([xmin,xmax,ymin,ymax])

x = np.linspace(-1,1,100)
# x**2+y**2=1
# y**2=1-x**2
# y=(1-x**2)**0.5
y=(1-x**2)**0.5
plt.plot(x,y)
plt.plot(x,-y)
plt.axis([-2,2,-2,2])  # [x轴的起始值,x轴的结束值,y轴的起始值,y轴的结束值]

这里写图片描述

这里写图片描述

(2) xlim方法和ylim方法设置坐标轴起始值

2)设置坐标轴类型

plt.axis(‘xxx’) ‘off’、’equal’……

'''
equal:改变*x*或*y*轴的极限,使其等于*x*的增量
和*y*长度相同;一般用来绘制圆形
off:隐藏坐标轴
'''

这里写图片描述

(2) 绘制圆形

x = np.linspace(-1,1,100)

6)坐标轴的标签

设置坐标轴标签的方向,颜色,旋转角度

plt.xlabel( )方法 和 plt.ylabel( )方法

plt.xlabel(s,color=’orange’,fontsize=20,rotation=20)

'''
s: 标签名称
color:标签颜色
fontsize:标签字体大小
rotation: 标签旋转角度
'''
# 正弦曲线
x = np.arange(-np.pi,np.pi,0.1)
y = np.sin(x)
plt.plot(x,y)
# X  Y 标签的内容
plt.xlabel('x')             
plt.ylabel('f(x)=sin(x)')   
plt.xlabel('x',color='orange',fontsize=20,rotation=20)  #设置X轴标签的内容及样式
plt.ylabel('f(x)=sin(x)',rotation=60 ,fontsize=20)  #设置Y轴标签的内容及样式

这里写图片描述

7)画布的标题

plt.title(s, *args, **kwargs)

'''
color:颜色
fontsize:字体大小
rotation:旋转角度
loc:位置{'center', 'left', 'right'}
    默认在中间
'''
# 正弦曲线
x = np.arange(-np.pi,np.pi,0.1)
x
y = np.sin(x)
plt.plot(x,y)
plt.title('Sin(x)',color='red',fontsize=25,rotation=45,loc='right')  # 默认在中间

这里写图片描述

8)图例

(1)方式一 plt.plot()中传入名字

# 方式一 plt.plot()中传入名字
x = np.linspace(0,10,101)
x
plt.plot(x,x,label='normal')
plt.plot(x,2*x,label='fast')
plt.plot(x,x/2,label='slow')
plt.legend()  #注意,使用label之后需要调用legend()

这里写图片描述

(2)方式二 plt.plot()中传入名字

x = np.linspace(0,10,101)
x
plt.plot(x,x)
plt.plot(x,2*x)
plt.plot(x,x/2)
plt.legend(['normal','fast','slow'])

这里写图片描述

(3) 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 右下角 center 正中间 10
right 中间靠右 5
data = np.random.randint(0,100,size=(10,3))
df = DataFrame(data,columns=list('ABC'))
df
plt.plot(df['A'])
plt.plot(df['B'])
plt.plot(df['C'])
plt.legend(['1','2','3'],loc=9)

这里写图片描述

loc参数还可以是2个元素的列表,表示图例左下角的坐标

  • [0,0] 左下
  • [0,1] 左上
  • [1,0] 右下
  • [1,1] 右上
data = np.random.randint(0,100,size=(10,3))
df = DataFrame(data,columns=list('ABC'))
df
plt.plot(df['A'])
plt.plot(df['B'])
plt.plot(df['C'])
plt.legend(['1','2','3'],loc=[1,0.5])

这里写图片描述

(4) ncol参数

功能:设置图例有几列

data = np.random.randint(0,100,size=(10,3))
df = DataFrame(data,columns=list('ABC'))
df
plt.plot(df['A'])
plt.plot(df['B'])
plt.plot(df['C'])
plt.legend(ncol=3)

这里写图片描述

二、设置plot的风格和样式

1、点和线的样式

(1)颜色

参数colo=”red”或c=”red”

颜色值的方式

1.合法的HTML颜色名
2.别名
3.HTML十六进制字符串
4.归一化到[0, 1]的RGB元组
x = np.linspace(-np.pi,np.pi,100)
x
plt.plot(x,np.sin(x),color='red')  #常规设置颜色
plt.plot(x,np.sin(x),c='red')  #简写设置颜色
plt.plot(x,np.sin(x),c='#aabbcc')  #十六进制设置颜色
plt.plot(x,np.sin(x),c='r')  #十六进制设置颜色
plt.plot(x,np.sin(x),c=(1,0.2,0))  #RGB设置颜色

这里写图片描述

2)透明度plt.plot(x,y,alpha=0.2)

设置线条的颜色

x = np.linspace(-np.pi,np.pi,100)
plt.plot(x,np.sin(x),c=(1,0.2,0.5),alpha=0.5)  # 取值范围0-1

这里写图片描述

3)背景色plt.subplot(facecolor=”颜色”)

注意:
设置背景色,通过plt.subplot()方法传入facecolor参数
先画背景色 再划线 否则背景色就把线给盖住了

"""
facecolor:设置背景颜色
    facecolor="green" 可以直接传入颜色
    facecolor=(0,1,0) 可以传入RGB三色
"""
x = np.linspace(-np.pi,np.pi,100)
plt.subplot(facecolor=(0,0,1))  
plt.plot(x,np.sin(x),c=(1,0,0))

4)线型和线宽

(1)线型 参数linestyle或ls

线条风格 描述 线条风格 描述
‘-‘ 实线 ‘:’ 虚线
‘–’ 破折线 ‘steps’ 阶梯线
‘-.’ 点划线 ‘None’ / ‘,’ 什么都不画

(2)宽度 参数linewidth或lw

x = np.arange(0,10,1)
plt.plot(x,x,ls='--',lw=3)    #ls设置线型  lw设置线宽

这里写图片描述

5)破折线(断续线)

设置破折号序列各段的宽度
plt.plot(x,y,dashes=[10,10])

'''
dashes = [5, 5] #长度5,后面空5
dashes = [2, 3, 5,1] #长度2,后面空3, 长度5, 空1
'''
x = np.arange(-np.pi,np.pi,0.1)
y = np.sin(x)
plt.plot(x,y,dashes=[2,3,5,1])

这里写图片描述

6) 点型

在绘图时,是将连续的点连起来的图形
这是将点显示出来

'''
marker 设置点形
markersize 设置点形大小
'''

下面是一些点的形状

标记 描述 标记 描述
‘1’ 一角朝下的三脚架 ‘3’ 一角朝左的三脚架
‘2’ 一角朝上的三脚架 ‘4’ 一角朝右的三脚架
’s’ 正方形 ‘p’ 五边形
‘h’ 六边形1 ‘H’ 六边形2
‘8’ 八边形
‘.’ ‘x’ X
‘*’ 星号 ‘+’ 加号
‘,’ 像素
‘o’ 圆圈 ‘D’ 菱形
‘d’ 小菱形 ’ ’ , ‘None’ ,
’ ‘,None
‘_’ 水平线 ‘|’ 竖线
‘v’ 一角朝下的三角形 ‘<’ 一角朝左的三角形
‘^’ 一角朝上的三角形 ‘>’ 一角朝右的三角形
x = np.arange(1,10,1)
y = np.sin(x)
plt.plot(x,y,marker='*',markersize=20)

这里写图片描述

7)点线设置参数总结

参数 描述 参数 描述
color或c 线的颜色 linestyle或ls 线型
linewidth或lw 线宽 marker 点型
markeredgecolor 点边缘的颜色 markeredgewidth 点边缘的宽度
markerfacecolor 点内部的颜色 markersize 点的大小

2、同时设置多个曲线样式

1)多曲线同一设置

多个曲线样式相同

x = np.linspace(0,100,30)
# plt.plot(x1,y1,x2,y2,x3,y3...)  颜色 点的形状 线的样式
plt.plot(x,x,x,2*x,x,x/2,c='r',marker='*',ls=':')

这里写图片描述

2)多个曲线不同设置

多个都进行设置时,多参数连用 plt.plot(x1, y1, fmt1, x2, y2, fmt2, …)

'''
fmt = '[color][marker][line]' 颜色 点的样式 线的样式
fmt format 格式 格式化字符串 就是按照人家指定的格式去设置样式的字符串
'''

这里写图片描述

x = np.linspace(0,100,30)  # 0-100要30个
plt.plot(x,x,'ro:',x,2*x,'k*--',x,x/2,'c1-.')   #[color][marker][line]' '颜色 点的样式 线的样式'

3、曲线样式的三种设置方式

(1)对坐标系使用一系列的setter方法

x = np.linspace(0,100,30)  # 0-100要30个
x
axes  = plt.subplot()  #获取坐标系
axes.plot(x,x,x,2*x,x,x/2)  #画三条线
axes.set_title('title')     #设置标题
axes.set_facecolor('gray')  #设置背景色
axes.set_xlabel('x')        #设置X轴标签
axes.set_ylabel('y')        #设置Y轴标签

这里写图片描述

(2)对线使用一系列的setter方法

plt.plot()方法返回一个包含所有线的列表
设置每一个线需要获取该线对象

x = np.linspace(0,100,30)  # 0-100要30个
x
lines = plt.plot(x,x,x,2*x,x,x/2)  #返回一个包含所有线的列表对象
lines[0].set_linewidth(5)       #设置第一条线的宽度
lines[1].set_linestyle(':')     #设置第二条线的样式
lines[2].set_color('y')         #设置第三条先线的颜色

4、X、Y轴坐标刻度

1)plt.xticks()和plt.yticks()方法

需指定刻度值和刻度名称 plt.xticks([刻度起始值],[名称列表])

x = np.linspace(-np.pi,np.pi,100)
plt.plot(x,np.sin(x))
plt.xticks([-np.pi,0,np.pi],['-π',0,'π'])      #设置x轴轴线的刻度
plt.yticks([-1,0,1])                             #设置Y轴
plt.grid()                   #画网格线 网格线是按照刻度来画的

这里写图片描述

使用LaTex语法,用 π σ 等表达式在图表上写上希腊字母

α β γ δ ϵ

θ λ π σ ϕ ω

Θ Λ Π Σ Φ Ω

κ

x = np.linspace(-np.pi,np.pi,100)
plt.plot(x,np.sin(x))
plt.xticks([-3.14,-3.14/2,0,3.14/2,3.14],["-$\pi$","-$\pi$/2",0,"$\pi$/2","$\pi$"])
plt.xticks([-3.14,-3.14/2,0,3.14/2,3.14],["-$\pi$","-$\pi$/2",0,"$\pi$/2","$\pi$"],fontsize=20,color="red",rotation=20)

这里写图片描述

2)plt.set__xticks()和plt.yticks()方法

5、网格线密度

网格线是由X轴和Y轴的值决定的。

x = np.arange(-np.pi, np.pi, step=0.1)
plt.plot(x,np.sin(x))
plt.xticks(np.arange(-4,4,0.5))  #密度大
# plt.xticks(np.arange(-4,4,1))  #密度小
plt.grid()

这里写图片描述

三、2D图形

1、直方图

plt.hist(x,bins=None,normed=False,color=”blue”,orientation=”vertical”,**kwargs)

'''
bins: 整数值,也可以是表示bin的一个序列。默认值为10 
density:将表示个数的值变成表示密度的值
color: 直方图的颜色
orientation: 默认为vertical 竖直直方图
'''
data = np.random.randint(0,100,size=100)
data
plt.hist(data, bins=5, density=True, color="red", orientation="horizontal")  
# bins=5 将所有的数据分为5份
# density=True 将表示有多少的数据转变为数据的密度
# orientation="horizontal" 水平直方图

这里写图片描述

2、条形图

条形图适合比较各部分的大小

# height 竖直方向的长度   width 水平方向的长度

1)竖直方向plt.bar()

# x = index
data = np.array([1,4,7,2,5,8,9])
index = [1,2,3,4,5,6,7]
plt.bar(x=index,height=data,width=0.5)

这里写图片描述

注意竖直方向与水平方向上的height和width是相反的

2)水平方向plt.barh()

# y = index
data = np.array([1,4,7,2,5,8,9])
index = [1,2,3,4,5,6,7]
plt.barh(y=index,height=0.5,width=data)

这里写图片描述

3)极坐标plt.axes(polar=True)

在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标,这样建立的坐标系叫做极坐标系。

data = np.array([1,4,7,2,5,8,9])
index = [1,2,3,4,5,6,7]
plt.axes(polar=True)           # 极坐标
plt.bar(x=index,height=data,width=0.5)

这里写图片描述

3、饼图

饼图适合展示各部分占总体的比例

1)普通各部分占满饼图

x = [89,45,32,16]
plt.pie(x)

这里写图片描述

2)普通各部分未占满饼图

x = [0.1,0.2,0.25,0.23]
plt.pie(x)

这里写图片描述

3)饼图各参数

'''
labels:设置每一块的标签; 必须一一对应,不能是中文
labeldistance:设置标签距离圆心的距离(0为 圆饼中心数 1为圆饼边缘)
autopct:设置比例值的显示格式(%1.1f%%)保留一位小数的百分比;
pctdistance:设置比例值文字距离圆心的距离(浮点值)
explode:设置每一块顶点距圆心的长度(比例值,列表);
colors:设置每一块的颜色(列表);最好一一对应
shadow:设置是否绘制阴影,默认为False
startangle:设置饼图起始角度 正右方为0度
'''
x = [89,45,32,16]
plt.pie(x, 
        labels=['A','B','C','D'],
        labeldistance=1.2,
        autopct="%1.1f%%",    #1.1f% 保留一位小数的百分比
        pctdistance=0.5,      # 比例值文字距离圆心的距离
        explode=[0,0.2,0,0],    # 每一块顶点距圆形的长度
        colors=["red","blue","yellow","green"],  #最好一一对应
        shadow=True,            # 是否有阴影
        startangle=60       #第一块开始的角度

这里写图片描述

4、散点图plt.scatter()

plt.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)

'''
s=None :大小 可以传入多个值 间隔输出
c=None :点的颜色  可以传入多个值(可以传入多个列表【多维数组】,也可以传入多个元祖) 间隔输出
marker :点的形状
cmap :颜色映射
alpha :透明度
'''
x = np.random.normal(loc=0,scale=1,size=1000)
y = np.random.normal(loc=0,scale=1,size=1000)
plt.scatter(x, y)
plt.scatter(x, y,s = [30, 100],c=[(1,0,0),(0,1,0),(0,0,1)],marker="o",alpha=0.8)

这里写图片描述

随机散点图

x = np.random.normal(loc=0,scale=1,size=1000)
y = np.random.normal(loc=0,scale=1,size=1000)
size = np.random.randint(10,100,size=1000)    #随机产生1000个整数
color = np.random.random(size=(1000,3))       #随机给1000个整数产生 RGB
plt.scatter(x, y, s=size, c=color ,marker="o", alpha=0.8)

这里写图片描述

=============以上为重点=================

四、图形内的文字、注释、箭头

1)图形内的文字

pyplot函数 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.text() 在Figure对象的任意位置添加文字
suptitle() mpl.figure.Figure.suptitle() 为Figure对象添加中心化的标题
annnotate() mpl.axes.Axes.annotate() 为Axes对象添加注释(箭头可选)

(1)图形内的文字

plt.suptitle("图形")   #整个图形的标题
plt.suptitle("suptitle")   #整个图形的标题
plt.figtext(0.5,0.5,"figtext")  #必须传入x y来设置文本位置  在整个图中,按照位置设置文字

这里写图片描述

(2)坐标内的文字

axes = plt.subplot()
plt.suptitle("suptitle")   #整个图形的标题
plt.figtext(0.5,0.5,"figtext")  #必须传入x y来设置文本位置  在整个图中,按照位置设置文字
axes.text(0.2,0.2,'axes text')  #必须传入x y来设置文本位置  坐标轴内设置文本
axes.set_title('axes title')    # 给坐标轴设置title

这里写图片描述

2)注释plt.annotate( )

'''
s:要注释的内容
xy:设置箭头指示的位置
xytext:设置注释文字的(左下角)位置  
arrowprops:以字典的形式设置箭头的样式  
    width:设置箭头长方形部分的宽度
    headlength:设置箭头尖端的长度,  
    headwidth:设置箭头尖端底部的宽度
    shrink:设置箭头顶点、尾部与指示点、注释文字的距离(比例值),可以理解为控制箭头的长度
'''
data = np.random.randint(0,10,size=10)
index = np.arange(0,10,1)
plt.plot(index, data)
plt.annotate(s="this is a annotate", xy=[5,4], xytext=[3,8],arrowprops={"width":2,'shrink':0.6})

这里写图片描述

3)箭头

4)综合运用

库里面还定义了一些arrowstyle可以选择的风格样式

'->' head_length=0.4,head_width=0.2
'-[' widthB=1.0,lengthB=0.2,angleB=None
'|-|' widthA=1.0,widthB=1.0
'-|>' head_length=0.4,head_width=0.2
'<-' head_length=0.4,head_width=0.2
'<->' head_length=0.4,head_width=0.2
'<|-' head_length=0.4,head_width=0.2
'<|-|>' head_length=0.4,head_width=0.2
'fancy' head_length=0.4,head_width=0.4,tail_width=0.4
'simple' head_length=0.5,head_width=0.5,tail_width=0.2
'wedge' tail_width=0.3,shrink_factor=0.5

这里不同  arrowprops={"arrowstyle":'->'}
plt.plot(index, data)
plt.annotate(s="this is a annotate", xy=[5,4], xytext=[3,8],arrowprops={"arrowstyle":'->'})

这里写图片描述

五、3D图

1) 导包

from mpl_toolkits.mplot3d.axes3d import Axes3D

2) 使用mershgrid函数切割x,y轴

功能: 将二维坐标转换为三维坐标, 将坐标网格化
这里写图片描述

(1) 创建坐标轴所需数据

x = np.linspace(0,10,101)
y = np.linspace(0,10,101)
x,y

(array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1. ,
         1.1,  1.2,  1.3,  1.4,  1.5,  1.6,  1.7,  1.8,  1.9,  2. ,  2.1,
         2.2,  2.3,  2.4,  2.5,  2.6,  2.7,  2.8,  2.9,  3. ,  3.1,  3.2,
         3.3,  3.4,  3.5,  3.6,  3.7,  3.8,  3.9,  4. ,  4.1,  4.2,  4.3,
         4.4,  4.5,  4.6,  4.7,  4.8,  4.9,  5. ,  5.1,  5.2,  5.3,  5.4,
         5.5,  5.6,  5.7,  5.8,  5.9,  6. ,  6.1,  6.2,  6.3,  6.4,  6.5,
         6.6,  6.7,  6.8,  6.9,  7. ,  7.1,  7.2,  7.3,  7.4,  7.5,  7.6,
         7.7,  7.8,  7.9,  8. ,  8.1,  8.2,  8.3,  8.4,  8.5,  8.6,  8.7,
         8.8,  8.9,  9. ,  9.1,  9.2,  9.3,  9.4,  9.5,  9.6,  9.7,  9.8,
         9.9, 10. ]),
 array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1. ,
         1.1,  1.2,  1.3,  1.4,  1.5,  1.6,  1.7,  1.8,  1.9,  2. ,  2.1,
         2.2,  2.3,  2.4,  2.5,  2.6,  2.7,  2.8,  2.9,  3. ,  3.1,  3.2,
         3.3,  3.4,  3.5,  3.6,  3.7,  3.8,  3.9,  4. ,  4.1,  4.2,  4.3,
         4.4,  4.5,  4.6,  4.7,  4.8,  4.9,  5. ,  5.1,  5.2,  5.3,  5.4,
         5.5,  5.6,  5.7,  5.8,  5.9,  6. ,  6.1,  6.2,  6.3,  6.4,  6.5,
         6.6,  6.7,  6.8,  6.9,  7. ,  7.1,  7.2,  7.3,  7.4,  7.5,  7.6,
         7.7,  7.8,  7.9,  8. ,  8.1,  8.2,  8.3,  8.4,  8.5,  8.6,  8.7,
         8.8,  8.9,  9. ,  9.1,  9.2,  9.3,  9.4,  9.5,  9.6,  9.7,  9.8,
         9.9, 10. ]))

(2) mershgrid函数切割x,y轴

功能:切割后能被3D坐标系使用, 将x, y 轴转换为X, Y轴为3D坐标系使用

X,Y = np.meshgrid(x,y)
X,Y

(array([[ 0. ,  0.1,  0.2, ...,  9.8,  9.9, 10. ],
        [ 0. ,  0.1,  0.2, ...,  9.8,  9.9, 10. ],
        [ 0. ,  0.1,  0.2, ...,  9.8,  9.9, 10. ],
        ...,
        [ 0. ,  0.1,  0.2, ...,  9.8,  9.9, 10. ],
        [ 0. ,  0.1,  0.2, ...,  9.8,  9.9, 10. ],
        [ 0. ,  0.1,  0.2, ...,  9.8,  9.9, 10. ]]),
 array([[ 0. ,  0. ,  0. , ...,  0. ,  0. ,  0. ],
        [ 0.1,  0.1,  0.1, ...,  0.1,  0.1,  0.1],
        [ 0.2,  0.2,  0.2, ...,  0.2,  0.2,  0.2],
        ...,
        [ 9.8,  9.8,  9.8, ...,  9.8,  9.8,  9.8],
        [ 9.9,  9.9,  9.9, ...,  9.9,  9.9,  9.9],
        [10. , 10. , 10. , ..., 10. , 10. , 10. ]]))

3)创建3d坐标系

功能: 建立一个三维坐标系, 返回一个三维坐标

axes = plt.subplot(projection=’3d’)

这里写图片描述

4)绘制3d图形

数据: 使用上边的X, Y

'''
参数:
    cmap='rainbow'  将图形显示为彩色
'''
Z = np.sin(X)-np.cos(Y)
从X矩阵中对应位置 取值 求sin 然后减去 从Y矩阵中对应位置 取值 求cos
得到的值 是 Z矩阵中对应位置的值
axes = plt.subplot(projection='3d') 
axes.plot_surface(X,Y,Z)

这里写图片描述

5)添加colorbar

功能: 为图形添加状态条

plt.colorbar(p,shrink=0.5)

'''
参数
    p 3D图形对象
    shrink 改变进度条的长度
注意: 3D图形的颜色需要时可表示的颜色才可以使用colorbar(颜色全是蓝色的就不能设置)
'''
axes = plt.subplot(projection='3d') 
p = axes.plot_surface(X,Y,Z,cmap='rainbow')
plt.colorbar(p,shrink=0.8)

这里写图片描述

6)综合绘制3D图

plt.figure(figsize=(10,6))  #改变画布大小
axes = plt.subplot(projection='3d')  ##
p = axes.plot_surface(X,Y,Z,cmap='rainbow')
plt.colorbar(p,shrink=0.5)

这里写图片描述

六、极坐标(玫瑰)图

创建极坐标,设置 polar 属性 plt.axes(polar = True)

1)普通数字绘制极坐标

data = np.array([2,4,6,8,10,12])
index = np.array([1,2,3,4,5,6])
plt.axes(polar=True)
plt.bar(x=index, height=data)

这里写图片描述

2)π 绘制极坐标

index = np.arange(0,2*np.pi,2*np.pi/8)  #将0-2π 分为8分
plt.axes(polar=True)
plt.bar(x=index,height=[1,2,3,4,5,6,7,8])

这里写图片描述

3)角度和弧度的转换

如果数据用的是角度(0-360的)
极坐标用的是弧度(0度-360度)

弧度/(2*np.pi)=角度/360
弧度=角度*np.pi/180

plt.axes(polar=True)
plt.bar(x=角度数据*np.pi/180,height= 实际数据)

猜你喜欢

转载自blog.csdn.net/PyRookie/article/details/81637157