Matplotlib 画圆弧示意图使用matplotlib的点函数的方式来画圆弧,显然是可以完成这个任务的,不过有一点问题,就是绘图的速度有点慢,如果绘的点比较多,就更加慢了。其实示意图都不是要求那么完善的圆,所以可以使用直线来逼近,这样也是很难看得出来的,并且速度比点的方式快很多。因此使用画直线的函数plt.plot的方式,主要用来提高显示的速度。
在这里主要来学习显示如下图:
在这张图里,绘制了不同的圆,有的是使用点划直线方式显示,有的是使用实线,有的是不同圆叠加在一起形成圆环。不管怎么样显示,主要都是使用画圆的参数公式:
xlast = xc + r*np.cos(p1)
ylast = yc + r*np.sin(p1)
(xc, yc)是圆心坐标,r是圆的半径,p1是圆的角度。根据不同的角度变化,就可以计算出来所有圆周上的坐标,再使用直线的方式把相邻两点连接到一起,就完成了画圆的任务。
整个画圆的源代码如下:
import numpy as np
import matplotlib.pyplot as plt
plt.figure('deepinout.com 极客笔记')
plt.axis([-75, 75, 50, -50])
plt.axis('on')
plt.grid(True)
#显示辅助坐标系
plt.arrow(0,0, 20,0, head_length = 4, head_width = 3, color = 'k')
plt.arrow(0,0, 0,20, head_length = 4, head_width = 3, color = 'k')
plt.text(16, -3, 'x')
plt.text(-5, 17, 'y')
#画绿色的圆
xc = 0
yc = 0
r = 40
p1 = 0*np.pi/180
p2 = 360*np.pi/180
dp = (p2 - p1)/100
xlast = xc + r*np.cos(p1)
ylast = yc + r*np.sin(p1)
for p in np.arange(p1, p2 + dp, dp):
x = xc + r*np.cos(p)
y = yc + r*np.sin(p)
if p > 90*np.pi/180 and p < 270*np.pi/180:
plt.plot([xlast, x], [ylast, y], color = 'g', linestyle = ':')
else:
plt.plot([xlast, x], [ylast, y], color = 'g')
xlast = x
ylast = y
plt.scatter(xc, yc, s = 15, color = 'g')
#画红色的圆
xc = -20
yc = -20
r = 10
p1 = 0*np.pi/180
p2 = 360*np.pi/180
dp = (p2 - p1)/100
xlast = xc + r*np.cos(p1)
ylast = yc + r*np.sin(p1)
for p in np.arange(p1, p2 + dp, dp):
x = xc + r*np.cos(p)
y = yc + r*np.sin(p)
plt.plot([xlast, x], [ylast, y], color = 'r')
xlast = x
ylast = y
plt.scatter(xc, yc, s = 15, color = 'r')
#画紫色的圆
xc = 20
yc = 20
r = 50
p1 = 0*np.pi/180
p2 = 360*np.pi/180
dp = (p2 - p1)/100
xlast = xc + r*np.cos(p1)
ylast = yc + r*np.sin(p1)
for p in np.arange(p1, p2 + dp, dp):
x = xc + r*np.cos(p)
y = yc + r*np.sin(p)
plt.plot([xlast, x], [ylast, y], linewidth = 2, color = (0.8, 0, 0.8))
xlast = x
ylast = y
plt.scatter(xc, yc, s = 15, color = (0.5, 0, 0.5))
#画蓝色的圆
xc = -53
yc = -30
r1 = 0
r2 = 10
dr = 1
p1 = 0*np.pi/180
p2 = 360*np.pi/180
dp = (p2 - p1)/100
xlast = xc + r1*np.cos(p1)
ylast = yc + r1*np.sin(p1)
for r in np.arange(r1, r2, dr):
for p in np.arange(p1, p2 + dp, dp):
x = xc + r*np.cos(p)
y = yc + r*np.sin(p)
plt.plot([xlast, x], [ylast, y], color = (0, 0, 0.8))
xlast = x
ylast = y
plt.show()