python-Matplotlib
Matplotlib:python的2D绘图库,可生成绘图/直方图/功率图/条形图/错误图/散点图等。Matplotlib被集成进Anaconda。
网址:https://matplotlib.org
一、绘制基础
常用场景:画点、画线。
pylot基本方法:
方法 |
说明 |
title() |
标题 |
xticks(x,ticks,rotation) |
设置x轴的刻度,rotation旋转角度。 |
yticks() |
设置y轴的刻度 |
figure(name,figsize=(w,h),dpi=n) |
设置图片大小。创建画布有返回值,参数dpi分辨率,figsize画布大小。 |
xlabel(),ylabel() |
x/y轴。通过plt.ylabel(‘纵轴名’)指定轴的名称 |
plot() |
绘制线性图表 |
axis() |
参数是 [xmin, xmax, ymin, ymax] 列表作为参数来指定了各个轴的视口大小 |
show() |
展示方法,展示之后会清空内存中图片,因此要先保存图片再show |
savefig() |
保存图片参数是保存路径和文件名 |
legend() |
函数作用是给图加上图例,plt.legend([x,y,z])里面的参数使用的是list的的形式将图表的的名称喂给这个函数。 |
grid() |
设置为true添加网格图plt.grid(True, linestyle=’–’, alpha=0.5) |
例1:绘制线性图
import matplotlib.pyplot as plt x=[1,2,5,7,10] y=[12,1,7,0,3] plt.plot(x,y) plt.show()
例2:设置线条的粗细/设置文字等
import matplotlib.pyplot as plt x=[1,2,5,7,10] y=[12,1,7,0,3] #linewidth设置线条宽度 plt.plot(x,y,linewidth=5) #添加名称 plt.xlabel('x') plt.ylabel('x&y') plt.rcParams['font.sans-serif']=['Arial Unicode MS'] #用来正常显示中文标签 plt.title('多个点折叠') plt.show()
例3:绘制一元二次方程的曲线
#绘制一元二次方程 import matplotlib.pyplot as plt #200个点的x坐标 x=range(-100,100) #生成y坐标 y=[i**2 for i in x] #绘制一元二次方程 plt.plot(x,y) #调用savefig将一元二次曲线保存为result.jpg plt.savefig('result.jpg') #如果直接写成plt.savefig('cos')会生成cos.png plt.show()
例4:绘制正弦余弦曲线
import matplotlib.pyplot as plt import numpy as np #生成x坐标(0-10的100个等差数列) x=np.linspace(0,10,100) sin_y=np.sin(x) #绘制正弦曲线 plt.plot(x,sin_y) #绘制余弦曲线 cos_y=np.cos(x) plt.plot(x,cos_y) plt.show() plt.plot()
例5:将画布分为区域,将图画到画布的指定区域
import matplotlib.pyplot as plt import numpy as np #将画布分为区域,将图画到画布的指定区域 x=np.linspace(1,10,100) #将画布分为2行2列,将图画画到画布的1区域 plt.subplot(2,2,1)
#修改x、y轴的坐标
plt.xlim(-5,20)
plt.ylim(-2,2) plt.plot(x,np.sin(x)) plt.subplot(2,2,3) plt.plot(x,np.cos(x)) plt.show()
改坐标前改坐标后
二、绘制散点图
使用scatter函数可以绘制随机点,该函数需要接收x坐标和y坐标的序列。
1)scatter和plot区别:plot绘制图像的速度优于scatter,所以如果画一堆点,而且点的形状没有差别,使用plot;如果点的形式有差别(指点的大小和颜色不同)则必须使用scatter。
2)大小颜色不同的散点,点的个数和颜色的个数要相同;点的个数和点大小的个数可以不同,如果点的个数大于大小的个数,则会循环获取大小—-根据不同的matplotlib版本有关。
例6:sin函数的散点值
import matplotlib.pyplot as plt import numpy as np #画散点图 x=np.linspace(0,10,100) #生成0-10中100个等差值 plt.scatter(x,np.sin(x)) plt.show()
例7:绘制100种大小100种颜色的散点图
import matplotlib.pyplot as plt import numpy as np import random np.random.seed(0) #执行多次,每次获取的随机数都是一样的 x=np.random.rand(100) y=np.random.rand(100) #生成100种大小 size=np.random.rand(100)*1000 #不同的matplotlib版本,size的个数和x/y个数可以不同/相同 #生成100种颜色 color=np.random.rand(100) #绘制散点图 plt.scatter(x,y,s=size,c=color,alpha=0.7) #s表示点的大小,c表示点的颜色,alpha表示透明度 plt.show()
3)绘制不同样式不同颜色的线条
缩写字母 |
代表颜色 |
标记缩写 |
代表的标记格式 |
‘b’ |
blue |
‘.’ |
点标记 |
‘g’ |
green |
‘,’ |
像素标记也就是默认 |
‘r’ |
red |
‘o’ |
大点标记 |
‘c’ |
cyan青色 |
’v‘ ‘^’ ‘<’ ‘>’ |
分别是三角形标记的四个方向 |
‘m’ |
magenta品红色 |
‘s’ |
正方形 |
‘y’ |
yellow |
‘p’ |
五角形 |
‘k’ |
black |
‘*’ |
五角星 |
‘w’ |
white |
‘H’ ‘h’ |
两个方向的六边形 |
– |
– |
‘1’ ‘2’ ‘3’ ‘4’ |
三菱线的四个方向 |
字符 |
代表的线型 |
‘+’ |
+型 |
‘–’ |
普通线型 |
‘x’ |
x型 |
‘–’ |
– –虚线 |
‘d’ ‘D’ |
d是菱形,D是倒正方形 |
‘-.’ |
– .虚线 |
“ |
“ |
‘:’ |
. .虚线 |
‘_’ |
下划线型 |
例8:绘制不同样式不同颜色的线条
import matplotlib.pyplot as plt import numpy as np x=np.linspace(0,10,100) plt.plot(x,x+0,'--g') #默认‘-’为一条直线 plt.plot(x,x+1,'-.r') plt.plot(x,x+2,':b') plt.plot(x,x+3,'.k') plt.plot(x,x+4,',c') plt.plot(x,x+5,'*y') plt.plot(x,x+6,'om') plt.show()
#使用legend()图例添加图例
import matplotlib.pyplot as plt import numpy as np x=np.linspace(0,10,100) #使用legend()图例,给plot方法添加参数label plt.plot(x,x+0,'--g',label='--g') #默认‘-’为一条直线 plt.plot(x,x+1,'-.r',label='-.r') plt.plot(x,x+2,':b',label=':b') plt.plot(x,x+3,'.k',label='.k') plt.plot(x,x+4,',c',label='.,c') plt.plot(x,x+5,'*y',label='*y') plt.plot(x,x+6,'om',label='om') plt.legend() #默认的位置在左上角,可以通过loc修改,
例plt.legend(loc='upper left',fancybox=True,framealpha=1,shadow=True,borderpad=1)左上角/边框/透明度/阴影/边框宽度,lower right为右下角 plt.show()
三、绘制柱状图
bar函数绘制柱状图。
例9:绘制柱状图
import matplotlib.pyplot as plt import numpy as np #创建x/y,x表示年份,y表示x年份的值 x=[1980,1985,1990,1995] y=[1000,3000,4000,5000] x_label=['1985年','1985年','1990年','1995年'] #调用bar函数绘制柱状图 plt.bar(x,y,width=3) #width修改柱的宽度,为标准宽度的3倍 #修改中文乱码 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] #用来正常显示中文标签 #修改x坐标的值 plt.xticks(x,x_label) #给x/y坐标添加名称 plt.xlabel('年份') plt.ylabel('销量') #添加标题title plt.title('根据年份销量对比') plt.show()
例10:bar函数和barh函数
import matplotlib.pyplot as plt import numpy as np #生成x/y np.random.seed(0) x=np.arange(5) y=np.random.randint(-5,5,5) #将画布分成1行2列,在第一个区域画bar plt.subplot(1,2,1) plt.bar(x,y,color='blue') #在0位置水平方向添加蓝色线条 plt.axhline(0,color='blue',linewidth=2) #在第二个区域画barh #barh 将y和x进行对换,竖着方向为x plt.subplot(1,2,2) plt.barh(x,y,color='red') #在0位置垂直方向添加红色线条 plt.axvline(0,color='red',linewidth=3) plt.show()
例11:柱状图设置不同颜色
import matplotlib.pyplot as plt import numpy as np #生成x/y np.random.seed(0) x=np.arange(5) y=np.random.randint(-5,5,5) v_bar=plt.bar(x,y,color='blue') #对y值大于0设置为蓝色,小于0的柱设置为绿色 for bar,height in zip(v_bar,y): if height<0: bar.set(color='green') plt.show()
例12:柱状图实例
import matplotlib.pyplot as plt import numpy as np #准备数据 #三部电影的名称 real_names=['千与千寻','玩具总动员','生活大爆炸12'] #三天内票房数 real_num1=[7548,4013,1673] real_num2=[5453,1840,1080] real_num3=[4348,2345,1890] x=np.arange(len(real_names)) #绘制柱状图 width=0.3 plt.bar(x,real_num1,alpha=0.5,width=width,label=real_names[0]) plt.bar([i+width for i in x],real_num2,alpha=0.5,width=width,label=real_names[1]) plt.bar([i+2*width for i in x],real_num3,alpha=0.5,width=width,label=real_names[2]) plt.rcParams['font.sans-serif']=['Arial Unicode MS'] #用来正常显示中文标签 #设置x坐标的值 第1天 第2天 第3天 x_label=['第{}天'.format(i+1) for i in x] plt.xticks([i+width for i in x],x_label) #添加ylabel plt.ylabel('票房数') #添加图例 plt.legend() plt.show()
四、绘制饼状图
使用pie函数,饼状图主要是用来呈现比例的,只有传入比例数据即可。
例13:绘制饼状图
import matplotlib.pyplot as plt import numpy as np #准备男、女人数比例 man=71351 woman=68187 man_perc=man/(man+woman) woman_perc=woman/(man+woman) #添加名称 labels=['男','女'] #添加颜色 colors=['blue','red'] #绘制饼状图,labels名称,colors颜色,explode将柱状图分裂,autopct绘制比例为百分比例。 paches,texts,autotexts=plt.pie([man_perc,woman_perc],labels=labels,colors=colors,explode=(0,0.05),autopct='%0.1f%%') plt.rcParams['font.sans-serif']=['Arial Unicode MS'] #用来正常显示中文标签 #设置饼状图中字体颜色 for text in autotexts: text.set_color('white') #设置字体大小 for text in texts+autotexts: text.set_fontsize(20) plt.show()
五、绘制直方图
直方图关注的是分布。hist绘制直方图。
例14:使用randn函数生成1000个正太分布的随机数,使用hist函数绘制这1000个随机数的分布状态
图1:
import matplotlib.pyplot as plt import numpy as np #生成1000个标准的正太分布随机数 x=np.random.randn(1000) #画正太分布图,修改柱的宽度,使用bins,10个柱放到一起 plt.hist(x,bins=100) plt.show()
图2 import matplotlib.pyplot as plt import numpy as np #使用np.random.normal()指定期望和均值的正太分布 x=np.random.normal(0,0.8,1000) y=np.random.normal(-2,1,1000) z=np.random.normal(3,2,1000) kwargs=dict(bins=100,alpha=0.5) #alpha是透明度,1为不透明 plt.hist(x,**kwargs) plt.hist(y,**kwargs) plt.hist(z,**kwargs) plt.show()
六、绘制等高线图和三维图
例15:绘制等高线图(俯视图)
import matplotlib.pyplot as plt import numpy as np x=np.linspace(-10,10,100) y=np.linspace(-10,10,100) #计算x和y的相交点X Y X,Y=np.meshgrid(x,y) #计算Z的坐标 Z=np.sqrt(X**2+Y**2) #绘制等高线图 plt.contour(X,Y,Z) #改为contorf函数,结果为图2 plt.show()
例16:绘制三维图
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d.axes3d import Axes3D #创建X,Y,Z坐标 X=[1,1,2,2] Y=[3,4,4,3] Z=[1,100,1,1] fig=plt.figure() #创建一个Axes3D的子图放到figure画布里 ax=Axes3D(fig) ax.plot_trisurf(X,Y,Z) plt.show()