接着上一篇博文,继续简单学习了下matplotlib绘图功能,基本包括:图片保存及工具栏使用、区域填充、形状绘制、图形美化、绘制极坐标、绘制积分函数、散点和条形图综合案例,相应学习笔记分享在此处,以便于后续参考。后续若有新功能函数及案例,也会在此处加以补充!
matplotlib不仅可以手动保存图片,也可以自动通过plt.savefig方法来保存图片,代码如下所示;
matplotlib提供了一个很方便的工具栏,其可以对图片进行放缩、调整显示格式、保存等操作。
import matplotlib.pyplot as plt
import numpy as np
#图片保存
x = np.linspace(0,5*np.pi,1000)
y1 = np.sin(x)
y2 = np.sin(2*x)
plt.plot(x,y1,'r')
plt.plot(x,y2,'b')
plt.savefig('./img/C21_1.png') #保存图片
plt.show()
#工具栏使用
x = np.random.rand(1000)
y = np.random.rand(1000)
colors = np.random.rand(1000)
area = np.pi*(15*np.random.rand(1000)**2)
plt.scatter(x,y,s=area,c=colors,alpha=0.5)
plt.show()
savefig保存的图片如下:
默认生成的散点图,及其局部放大后效果:
matplotlib可以通过fill和fill_between填充区域,达到不同的填充效果,代码如下:
import matplotlib.pyplot as plt
import numpy as np
#图片填充-填充曲线到x轴区间
x = np.linspace(0,5*np.pi,1000)
y1 = np.sin(x)
y2 = np.sin(2*x)
#plt.plot(x,y1,'r') #绘制曲线
#plt.plot(x,y2,'b')
plt.fill(x,y1,'r',alpha=0.3)
plt.fill(x,y2,'b',alpha=0.3) #默认蓝色会覆盖红色
plt.savefig('./Notes/img/C22_1.png') #保存图片
plt.show()
#图片填充--填充两个曲线之间部分
x = np.linspace(0,5*np.pi,1000)
y1 = np.sin(x)
y2 = np.sin(2*x)
plt.plot(x,y1,x,y2,'black') #绘制曲线
plt.fill_between(x,y1,y2,where=y1>y2,facecolor='red',alpha=0.3)
plt.fill_between(x,y1,y2,where=y1y2, 通过比较y1 y2的值填充不同颜色
#interpolate=True可以自动填充空白位置
plt.savefig('./Notes/img/C22_2.png')
plt.show()
matplotlib.patches库具备多种图形函数,可以根据需要添加,此处添加了4个基础图形!
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as mpatches #需要引入该库
#reference https://matplotlib.org/api/patches_api.html
fig,ax = plt.subplots()
#1 添加圆形
xy1 = np.array([0.2,0.2]) #确定圆心
circle = mpatches.Circle(xy1,0.2) #坐标,半径
ax.add_patch(circle)
#2 添加长方形
xy2=np.array([0,0.7])
rect = mpatches.Rectangle(xy2,0.4,0.3) #左下角位置,宽高
ax.add_patch(rect)
#添加多边形
xy3=np.array([0.7,0.2])
polygon=mpatches.RegularPolygon(xy3,5,0.1)#圆心位置,边数量,顶点到圆心距离
ax.add_patch(polygon)
#添加椭圆
xy4=np.array([0.7,0.8])
ellipse = mpatches.Ellipse(xy4,0.4,0.2,color='y') #圆心,长直径,短直径
ax.add_patch(ellipse)
plt.axis('equal') #调整xy轴比例,确保图像为圆形的
plt.grid()
plt.savefig('./Notes/img/C23_1.png')
plt.show()
matplotlib默认绘图样式可能看上去不太符合所有人的需求,那么可以使用 plt.style.use()函数来选择自己喜欢的绘图类型,如下代码分别选择了ggplot和bmh两种样式!
、import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
#1) 默认样式
def DrwaFigures(PicName='C24_1.png'):
# 绘制散点
fig,ax = plt.subplots(ncols=2,nrows=2)
ax1,ax2,ax3,ax4=ax.ravel()
x,y=np.random.normal(size=(2,100))
ax1.plot(x,y,'o')
#绘制10条不同颜色线段
x=np.arange(0,10)
y=np.arange(0,10)
ncolors = len(mpl.rcParams['axes.prop_cycle']) #显示颜色种类
shift = np.linspace(0,10,ncolors)
for s in shift:
ax2.plot(x,y+s,'-')
#绘制柱状图-分别使用默认的0-1-2号颜色
x=np.arange(5)
y1,y2,y3=np.random.randint(1,25,size=(3,5))
width=0.25
#print(mpl.rcParams['axes.prop_cycle'])
ax3.bar(x,y1,width,color = mpl.rcParams['axes.prop_cycle'].by_key()['color'][0])
ax3.bar(x+width,y2,width,color=mpl.rcParams['axes.prop_cycle'].by_key()['color'][1])
ax3.bar(x+2*width,y3,width,color=mpl.rcParams['axes.prop_cycle'].by_key()['color'][2])
# 添加圆形
#print(plt.rcParams['axes.prop_cycle'])
for i,xcolor in enumerate(plt.rcParams['axes.prop_cycle']):
xy=np.random.normal(size=2)
ax4.add_patch(plt.Circle(xy,radius=0.3,color=xcolor['color']))
ax4.axis('equal')
plt.savefig('./Notes/img/'+PicName)
plt.show()
def DrawFigureWithStyle():
#)2调整样式
print(plt.style.available)
# 默认样式: ['bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark-palette', 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'seaborn', 'Solarize_Light2', 'tableau-colorblind10', '_classic_test']
plt.style.use('ggplot')
DrwaFigures('C24_2.png')
plt.style.use('bmh')
DrwaFigures('C24_3.png')
if __name__ =='__main__':
DrwaFigures()
DrawFigureWithStyle()
默认样式:
ggplot样式:
bmh样式:
极坐标是一种常用的数学图形,它由极半径和极角构成,其绘制方法如下:
import matplotlib.pyplot as plt
import numpy as np
#绘制极坐标图形
r=np.arange(1,6,1)
scope = [0,np.pi/2,np.pi,3*np.pi/2,2*np.pi]
ax = plt.subplot(111,projection='polar') #定义一个坐标
ax.plot(scope,r,color='r',linewidth=2)
ax.grid(True)
plt.savefig('./Notes/img/C25_1.png')
plt.show()
#绘制一个正方形,需要你5个点按照次序相连接
r = np.empty(5) #生成大小为5的数组
r.fill(5) #填充值为5
scope = [0,np.pi/2,np.pi,3*np.pi/2,2*np.pi]
ax = plt.subplot(111,projection='polar')
ax.plot(scope,r,color='r',linewidth=2)
ax.grid(True)
plt.savefig('./Notes/img/C25_2.png')
plt.show()
#绘制8边形需要9个点连接
r = np.empty(9) #生成大小为9的数组
r.fill(9) #
print('r:',r)
scope = [0,np.pi/4,np.pi/2,3*np.pi/4,4*np.pi/4,5*np.pi/4,6*np.pi/4,7*np.pi/4,2*np.pi]
ax = plt.subplot(111,projection='polar')
ax.plot(scope,r,color='r',linewidth=2)
ax.grid(True)
plt.savefig('./Notes/img/C25_3.png')
plt.show()
以下通过积分函数来熟悉曲线、坐标轴、多边形、公式的绘制,代码如下:
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
import numpy as np
#函数积分图
def func(x):
return -(x-2)*(x-8)+40
#1)绘制函数曲线
x = np.linspace(0,10)
y = func(x)
fig,ax=plt.subplots()
plt.plot(x,y,'r',linewidth=1.5)
# 2)绘制坐标轴信息
#坐标轴参考文献 https://matplotlib.org/api/axes_api.html
a = 2
b = 9
ax.set_xticks([a,b]) #设置x轴[a,b]范围为[2,9]
ax.set_xticklabels(['$a$','$b$']) #设置为具体字符,此处为了保值字体和公式字体一样使用$a$表示公式变量
ax.set_yticks([])
plt.figtext(0.9,0.05,'$x$') #x,y范围为[0,1],1表示远离0,0表示接近0
plt.figtext(0.1,0.88,'$y$')
#3)绘制多边形
ix = np.linspace(a,b)
iy=func(ix)
ixy=zip(ix,iy)
verts=[(a,0)]+list(ixy)+[(b,0)]
#print(verts)
poly = Polygon(verts,facecolor='0.8',edgecolor='0.5') #数字越大,颜色越浅
ax.add_patch(poly)
#4)绘制公式
x_math=a+(b-a)/20 #此处也可以直接写具体位置
y_math=30
plt.text(x_math,y_math,r'$\int_a^b (-(x-2)*(x-8)+40)dx$',fontsize=15)
plt.savefig('./Notes/img/C26_1.png')
plt.show()
先绘制一个散点图,并分别用条形图描述其x、y轴分布的频率,其代码如下:
import matplotlib.pyplot as plt
import numpy as np
#1)设置散点和风格
plt.style.use('ggplot') #设置风格
x=np.random.randn(200)
y=x+np.random.randn(200)*0.5
#2)设置三个区域图形
margin_border=0.1 #边缘宽度
width=0.6 #大正方形宽高
margin_between=0.02 #大小矩形之间间隔
height=0.2 #小矩形高度
#定义大正方形坐标
left_s = margin_border
bottom_s = margin_border
height_s = width
width_s = width
#定义贴近y轴上的小矩形
left_y=margin_border
bottom_y=margin_border+width+margin_between
height_y= height
width_y = width
#定义贴近x轴上的小矩形
left_x = margin_border+width+margin_between
bottom_x =margin_border
height_x = width
width_x = height
plt.figure(1,figsize=(8,8))
rect1 = [left_s,bottom_s,width_s,height_s]
rect2 = [left_y,bottom_y,width_y,height_y]
rect3 = [left_x,bottom_x,width_x,height_x]
#3)去掉多余坐标
axScatter1=plt.axes(rect1)
axScatter2=plt.axes(rect2)
axScatter2.set_xticks([]) #去掉x轴重复坐标
axScatter3=plt.axes(rect3)
axScatter3.set_yticks([])#去掉y轴重复坐标
#4)绘制散点图和条形图
axScatter1.scatter(x,y)
bin_width=0.25
xymax=np.max([np.max(np.fabs(x)),np.max(np.fabs(y))]) #求出x或者y的最大值
lim = int(xymax/bin_width+1)*bin_width #+1防止四舍五入,lim为新的宽度值
axScatter1.set_xlim(-lim,lim)#设置x轴位置
axScatter1.set_ylim(-lim,lim)#设置y轴位置
#绘制条形图
bins = np.arange(-lim,lim+bin_width,bin_width)
axScatter2.hist(x,bins=bins)
axScatter2.set_xlim(axScatter1.get_xlim())
axScatter3.hist(y,bins=bins,orientation='horizontal')
axScatter3.set_ylim(axScatter1.get_ylim())
plt.savefig('./Notes/img/C28.png')
plt.show()
以上默认测试python版本为python3.6.3,matplotlib 3.0.0