Matplotlib 用直线方式画圆

Matplotlib 画圆弧示意图使用matplotlib的点函数的方式来画圆弧,显然是可以完成这个任务的,不过有一点问题,就是绘图的速度有点慢,如果绘的点比较多,就更加慢了。其实示意图都不是要求那么完善的圆,所以可以使用直线来逼近,这样也是很难看得出来的,并且速度比点的方式快很多。因此使用画直线的函数plt.plot的方式,主要用来提高显示的速度。

在这里主要来学习显示如下图:

Matplotlib用直线方式画圆

在这张图里,绘制了不同的圆,有的是使用点划直线方式显示,有的是使用实线,有的是不同圆叠加在一起形成圆环。不管怎么样显示,主要都是使用画圆的参数公式:

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()

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程