Matplotlib画图如此简单
编程我最懂 2019-12-28 15:21:07
jupyter⼊门之Matplotlib
⼀. Matplotlib基础知识
Matplotlib中的基本图表包括的元素
x轴和y轴 axis ⽔平和垂直的轴线
轴标签 axisLabel ⽔平和垂直的轴标签
x轴和y轴刻度 tick 刻度标⽰坐标轴的分隔,包括最⼩刻度和最⼤刻度
x轴和y轴刻度标签 tick label 表⽰特定坐标轴的值
绘图区域(坐标系) axes 实际绘图的区域
画布 figure 呈现所有的坐标系
可以⽤下图来概括
1.⼦画布
依赖导⼊
import numpy as npimport pandas as pdfrom pandas import Series,DataFrameimport matplotlib.pyplot as plt%matplotlib inline
只含单⼀曲线的图
1、可以使⽤多个plot函数(推荐),在⼀个图中绘制多个曲线
2、也可以在⼀个plot函数中传⼊多对X,Y值,在⼀个图中绘制多个曲线
x = np.arange(0,10,step=1)s1 = Series(x,index=list('abcdefghij'))s2 = Series(x**2,index=s1.index)# 索引和值⼀起设置plt.plot(x,x*2,x,x*3,x,x)
设置⼦画布
axes = plt.subplot()
# 221的含义是将画布分为两⾏两列,# axes1在第⼀个位置axes1 = plt.subplot(2,2,1)axes1.plot(x,x**2)# axes2在第四个位置axes2 = plt.subplot(2,2,4)axes2.plot(x,x**3)
# ⼦画布可以按照不同的⽐例进⾏拆分,可以在⼀个版⾯内共存,# 但是,如果两个⼦画布有重叠部分,后绘制的画布会覆盖先绘制的画布axes2 = plt.subplot(2,2,1)axes2.plot(x,x**2)axes1 = plt.subplot(3,3,1)axes1.plot(x,x*2)
⽹格线
2. 绘制正弦余弦
x = np.linspace(0,2*np.pi,100)y1 = np.sin(x)y2 = np.cos(x)# ⾃动选择最近的画布进⾏开启id(True)plt.plot(x,y1,x,y2)
axes1 = plt.subplot(221)# True 开启⽹格线# linewidth设置⽹格线的粗细id(True,linewidth=2)axes2 = plt.subplot(222)# alpha设置透明度 0-1之间的数id(True,alpha=0.5)axes3 = plt.subplot(id(True,color='green')axes4 = plt.subplot(224)# 使⽤id⽅法可以开启⽹格线,使⽤plt⾯向对象的⽅法,创建多个⼦图显⽰不同⽹格线
lw代表linewidth,线的粗细
alpha表⽰线的明暗程度
color代表颜⾊
axis显⽰轴向
matplotlib中subplot坐标轴界限
plt.axis([xmin,xmax,ymin,ymax])
plt.plot(x,y1)# 注意:必须x,y轴同时设置界限plt.axis([-1,7.2,-2,2])
# 画圆x = np.linspace(-1,1,100)f = lambda x:(1-x**2)**0.5plt.plot(x,f(x),x,-f(x))# 使⽤axis函数设置坐标轴的显⽰风格plt.axis('equal')
axes = plt.subplot(111)axes.plot(x,f(x),x,-f(x))axes.axis('equal')
xlim⽅法和ylim⽅法
除了plt.axis⽅法,还可以通过xlim,ylim⽅法设置坐标轴范围
# 分别设置x轴和y轴界限plt.plot(x,y2)plt.xlim(-2,20)plt.ylim(-2,2)
⾯向对象风格设置画布样式
axes = plt.subplot(111)axes.plot(x,y2)# 使⽤⾯向对象风格设置画布样式,如果属性不到,就使⽤set_XX函数设置# .+Tab键,快捷查看对象属性和⽅法axes.set_xlim(-5,5)axes.set_ylim(-5,5)
坐标轴标签
xlabel⽅法和ylabel⽅法
plt.ylabel(‘y = x^2 + 5’,rotation = 60)旋转
color 标签颜⾊
fontsize 字体⼤⼩
rotation 旋转⾓度
plt.plot(x,y1)plt.xlabel('x_label',fontsize=35)plt.ylabel('y-label',color='pink',fontsize=40)
axes = plt.subplot(111)axes.plot(x,y1)# HTML⽀持的字体设置,在这⾥都可以使⽤color fontsize linestyle linewidth# fontsize 字体⼤⼩# color 字体颜⾊# rotation 旋转⾓度axes.set_ylabel('y_label',fontsize=30,color='red',rotation=90)# 使⽤字典设置字体axes.set_xla
标题
plt.title()⽅法
loc {left,center,right}
color 标签颜⾊
fontsize 字体⼤⼩
rotation 旋转⾓度
plt.plot(x,y1)# loc设置标题显⽰位置(left,right,center)plt.title('SIN(X)',fontsize=60,color='purple',rotation=45,loc='left')
注:matplotlib显⽰中⽂如何处理?
Windows:
from pylab import mpl# 指定默认字体Params['font.sans-serif'] = ['FangSong'] # 解决保存图像是负号'-'显⽰为⽅块的问题Params['axes.unicode_minus'] = False
Mac:
import numpy as npimport matplotlibimport matplotlib.pyplot as pltfrom matplotlib.font_manager import FontProperties# 导⼊本地字体⽂件font = FontProperties(fname='/Library/')# Fixing random state for reproducibilitynp.random.seed(19680801)# 3.图例
原始⽅法
# 相关依赖导⼊...df = DataFrame(data=np.random.randint(0,100,size=(5,3)),columns=list('abc'))df.plot()
legend⽅法
两种传参⽅法:
分别在plot函数中增加label参数,再调⽤legend()⽅法显⽰
直接在legend⽅法中传⼊字符串列表
x = np.arange(0,10,step=1)plt.plot(x,x,x,x*2,x,x/2)# 传⼊⼀个列表参数,参数内容就是每⼀个data的说明plt.legend(['fast','normal','slow'])
第⼆种传参
plt.plot(x,x,label='normal')plt.plot(x,x*2,label='fast')plt.plot(x,x/2,label='slow')plt.legend(loc=10)
loc参数
loc参数⽤于设置图例标签的位置,⼀般在legend函数内
matplotlib已经预定义好⼏种数字表⽰的位置
loc参数可以是2元素的元组,表⽰图例左下⾓的坐标
[0,0] 左下
[0,1] 左上
[1,0] 右下
[1,1] 右上
图例也可以超过图的界限loc = (-0.1,0.9)
plt.plot(x,x,label='normal')plt.plot(x,x*2,label='fast')plt.plot(x,x/2,label='slow')plt.legend(loc=[0.4,1.1],ncol=3)
ncol参数
ncol控制图例中有⼏列,在legend中设置ncol,需要设置loc
linestyle、color、marker
修改线条样式
4.保存图⽚
使⽤figure对象的savefig的函数
filename
含有⽂件路径的字符串或Python的⽂件型对象。图像格式由⽂件扩展名推断得出,例如,.pdf推断出PDF,.png推断出PNG (“png”、“pdf”、“svg”、“ps”、“eps”……)
dpi
图像分辨率(每英⼨点数),默认为100
facecolor
图像的背景⾊,默认为“w”(⽩⾊)
# 获取figure对象(画布对象)# 设置画布的背景⾊figure = plt.figure(facecolor='cyan')# 设置坐标系的背景⾊axes = plt.subplot(111,facecolor='blue')# 设置线条的颜⾊axes.plot(x,x,x,x*2,color='yellow')# dpi设置像素⼤⼩figure.savefig('18011.png',dpi=50)
⼆. 设置plot的风格和样式
plot语句中⽀持除X,Y以外的参数,以字符串形式存在,来控制颜⾊、线型、点型等要素,语法形式为: plt.plot(X, Y, ‘format’, …)
1.点和线的样式
颜⾊
参数color或c
plt.plot(x,x,color='c')
常⽤⾊彩名与别名
透明度
alpha
plt.plot(x,x,alpha=0.3,color='r')
背景⾊
背景⾊
设置背景⾊,通过plt.subplot()⽅法传⼊facecolor参数,来设置坐标系的背景⾊
# 设置坐标系的背景plt.subplot(facecolor='red')plt.plot(x,np.sin(x))
线型
参数linestyle或ls
plt.plot(x,x,ls=':')plt.plot(x,x*2,ls='steps')plt.plot(x,x/2,ls='None')
常⽤线型
线宽
linewidth或lw参数
不同宽度的破折线
dashes参数 eg.dashes = [20,50,5,2,10,5]
设置破折号序列各段的宽度
# dashes⾃定义破折线的样式plt.plot(x,x,dashes=[10,2,3,5])
点型
marker 设置点形
markersize 设置点形⼤⼩
x = np.random.randint(0,10,size=6)plt.plot(x,marker='s',markersize=60)
常⽤点型参数设置
plt.plot(x,marker='4',markersize=30)plt.plot(x,x*2,marker='3',markersize=40)
plt.plot(np.random.randint(0,10,size=10),marker='h',markersize=20,label='六边形1',)plt.plot(np.random.randint(0,10,size=10),marker='H',markersize=20,label='六边形2')plt.plot(np.random.randint(0,10,size=10),marker='8',markersize=20,label='⼋边形')plt.plot(np.rand 标记参数
2.多参数连⽤
颜⾊、点型、线型,可以把⼏种参数写在⼀个字符串内进⾏设置 ‘r-.o’
# 参数连⽤需要对不同的线进⾏分别设置plt.plot(x,x,'r:v',x,x*2,'b--h')
更多点和线的设置
markeredgecolor = ‘green’,
markeredgewidth = 2,
markerfacecolor = ‘purple’
多个曲线同⼀设置
属性名声明,不可以多参数连⽤
plt.plot(x1, y1, x2, y2, fmt, …)
x = np.arange(0,10,1)# 统⼀设置plt.plot(x,x,x,x*2,x,x/2,linewidth=3,color='blue')# 分别设置plt.plot(x,x,'r-.s',x,x*2,'b--h')
多曲线不同设置
多个都进⾏设置时,多参数连⽤ plt.plot(x1, y1, fmt1, x2, y2, fmt2, …)
三种设置⽅式
1.向⽅法传⼊关键字参数
1. import matplotlib as mpl
2.对实例使⽤⼀系列的setter⽅法
plt.plot()⽅法返回⼀个包含所有线的列表,设置每⼀个线需要获取该线对象
1. eg: lines = plt.plot(); line = lines[0]
2. line.set_linewith()
3. line.set_linestyle()
4. line.set_color()
3.对坐标系使⽤⼀系列的setter⽅法
axes = plt.subplot()获取坐标系
set_title()
set_facecolor()
set_xticks、set_yticks 设置刻度值
set_xticklabels、set_yticklabels 设置刻度名称
例:
lines = plt.plot(x,x,x,x*2,x,x/2)# 根据line对象设置line的属性lines[0].set_linewidth(3)lines[1].set_color('cyan')lines[2].set_linestyle('--')
X、Y轴坐标刻度
需指定刻度值和刻度名称 icks([刻度列表],[名称列表])
⽀持fontsize、rotation、color等参数设置
x = np.linspace(0,2*np.pi,100)plt.plot(x,np.sin(x))# xticks函数设置坐标轴刻度和标签icks([0,np.pi/2,np.pi,3*np.pi/2,2*np.pi],['0','π/2','π','3π/2','2π'])
axes = plt.subplot(111)axes.plot(x,np.sin(x))# 使⽤画布对象设置坐标轴刻度和坐标轴刻度标签axes.set_xticks([0,np.pi/2,np.pi,3*np.pi/2,2*np.pi])axes.set_xticklabels(['0','$\pi$/2','π','3π/2','2π'],fontsize=20)axes.set_yticks([-1,0,1])axes.set_yticklabels(['min',0,'max']
三、2D图形
1.直⽅图
【直⽅图的参数只有⼀个x!!!不像条形图需要传⼊x,y】
hist()的参数
bins
可以是⼀个bin数量的整数值,也可以是表⽰bin的⼀个序列。默认值为10
normed
如果值为True,直⽅图的值将进⾏归⼀化处理,形成概率密度,默认值为False
color
指定直⽅图的颜⾊。可以是单⼀颜⾊值或颜⾊的序列。如果指定了多个数据集合,颜⾊序列将会设置为相同的顺序。如果未指定,将会使⽤⼀个默认的线条颜⾊
orientation
通过设置orientation为horizontal创建⽔平直⽅图。默认值为vertical
x = np.random.randint(0,100,size=100)plt.hist(x,bins=5)
2. 条形图
【条形图有两个参数x,y】
width 纵向设置条形宽度
height 横向设置条形⾼度
bar()、barh()
x = np.array([2,5,7,9,4,3,8])# x 就是底轴刻度标签# height 就是柱形图的柱⾼# width 表⽰柱宽 (0-1取值)plt.bar(x=list('abcdefg'),height=x,width=1)# y 就是底轴刻度标签# width 就是柱形图的柱⾼# height
表⽰柱宽plt.barh(y=list('abcdefg'),width=x,height=1)
3. 饼图
【饼图也只有⼀个参数x!】
pie()
饼图适合展⽰各部分占总体的⽐例,条形图适合⽐较各部分的⼤⼩
普通部分占满饼图
x = [45,6]plt.pie(x)
普通未占满饼图
x = [0.4,0.3]plt.pie(x)
饼图阴影、分裂等属性设置labels参数设置每⼀块的标签;labeldistance参数设置标签距离圆⼼的距离(⽐例值,只能设置⼀个浮点⼩数)autopct参数设置⽐例值的显⽰格式(%1.1f%%);pctdistance参数设置⽐例值⽂字距离圆⼼的距离explode参数设置每⼀块顶点距圆# labeldistance只能设置⼀个⼩数plt.
pie(x,labels=['男','⼥'],labeldistance=0.3,        autopct="%1.2f%%",pctdistance=0.8,      explode=[0.1,0.0],      colors=['blue','yellow'],      startangle=90,      shadow=True)
4. 散点图
【散点图需要两个参数x,y,但此时x不是表⽰x轴的刻度,⽽是每个点的横坐标!】
scatter()
x = al(size=1000)y = al(size=1000)# ⽣成1000个随机颜⾊colors = np.random.random(size=(1000,3))# 使⽤c参数来设置颜⾊plt.scatter(x,y,marker='d',c=colors)
四.3D图
曲⾯图
导包
from mpl_toolkits.mplot3d.axes3d import Axes3D
使⽤mershgrid函数切割x,y轴
X,Y = np.meshgrid(x, y)
创建3d坐标系
axes = plt.subplot(projection=’3d’)
绘制3d图形
p = axes.plot_surface(X,Y,Z,color=’red’,cmap=’summer’,rstride=5,cstride=5)
添加colorbar
例:
def createZ(x,y):    return np.sin(x) + np.cos(y)*2 - np.pi/5from mpl_toolkits.mplot3d.axes3d import Axes3Daxes = plt.subplot(projection='3d')x = np.linspace(-np.pi,np.pi,100)y = np.linspace(-np.pi,np.pi,100)# 使⽤x,y⽣成⼀组⽹格X,Y = np.meshgrid(x,y)Z = create
五.玫瑰图/极坐标条形图
创建极坐标,设置polar属性plt.axes(polar = True)绘制极坐标条形图index = np.arange(-np.pi,np.pi,2*np.pi/6)plt.bar(x=index ,height = [1,2,3,4,5,6] ,width = 2*np.pi/6)
# 玫瑰图x = np.array([2,5,7,9,4,3,8])plt.axes(polar = True)plt.bar(x=list('abcdefg'),height=x)
<