用pyplot绘制一个圆

258 投票
9 回答
680785 浏览
提问于 2025-04-17 12:42

让我感到惊讶的是,我没有找到一个简单明了的说明,教我如何用matplotlib.pyplot来画一个圆(请不要用pylab),输入的参数是圆心的坐标(x,y)和半径r。我尝试了一些不同的写法:

import matplotlib.pyplot as plt
circle=plt.Circle((0,0),2)
# here must be something like circle.plot() or not?
plt.show()

...但还是没能成功。

9 个回答

43

如果你想画一组圆圈,可以看看这篇文章或者这个链接(这个稍微新一点)。文章里介绍了一个叫做circles的函数。

这个circles函数的用法和scatter函数类似,不过它画出的圆圈大小是根据数据单位来决定的。

下面是一个例子:

from pylab import *
figure(figsize=(8,8))
ax=subplot(aspect='equal')

#plot one circle (the biggest one on bottom-right)
circles(1, 0, 0.5, 'r', alpha=0.2, lw=5, edgecolor='b', transform=ax.transAxes)

#plot a set of circles (circles in diagonal)
a=arange(11)
out = circles(a, a, a*0.2, c=a, alpha=0.5, edgecolor='none')
colorbar(out)

xlim(0,10)
ylim(0,10)

在这里输入图片描述

114
import matplotlib.pyplot as plt

circle1 = plt.Circle((0, 0), 0.2, color='r')
plt.gca().add_patch(circle1)

这是一个简明扼要的版本,告诉你如何快速在一个已有的图表中添加一个圆形。想要了解更多细节,可以参考被接受的答案和其他答案。

顺便提一下:

  • gca() 的意思是获取当前坐标轴
333

你需要把它添加到一个坐标轴上。一个 CirclePatch 的一个子类,而坐标轴上有一个 add_patch 方法。(你也可以用 add_artist,但不推荐这样做。)

下面是一个示例:

import matplotlib.pyplot as plt

circle1 = plt.Circle((0, 0), 0.2, color='r')
circle2 = plt.Circle((0.5, 0.5), 0.2, color='blue')
circle3 = plt.Circle((1, 1), 0.2, color='g', clip_on=False)

fig, ax = plt.subplots() # note we must use plt.subplots, not plt.subplot
# (or if you have an existing figure)
# fig = plt.gcf()
# ax = fig.gca()

ax.add_patch(circle1)
ax.add_patch(circle2)
ax.add_patch(circle3)

fig.savefig('plotcircles.png')

这样会得到下面的图:

第一个圆在原点,但默认情况下 clip_onTrue,所以当圆超出坐标轴时,它会被裁剪掉。第三个(绿色)圆展示了当你不裁剪 Artist 时会发生什么。它超出了坐标轴的范围(但没有超出整个图形的范围,也就是说,图形的大小不会自动调整以显示你所有的图形元素)。

x、y 和半径的单位默认对应于数据单位。在这个例子中,我没有在坐标轴上绘制任何东西(fig.gca() 返回当前的坐标轴),而且由于限制从未设置过,所以它们默认的 x 和 y 范围是从 0 到 1。

下面是这个例子的延续,展示了单位的重要性:

circle1 = plt.Circle((0, 0), 2, color='r')
# now make a circle with no fill, which is good for hi-lighting key results
circle2 = plt.Circle((5, 5), 0.5, color='b', fill=False)
circle3 = plt.Circle((10, 10), 2, color='g', clip_on=False)
    
ax = plt.gca()
ax.cla() # clear things for fresh plot

# change default range so that new circles will work
ax.set_xlim((0, 10))
ax.set_ylim((0, 10))
# some data
ax.plot(range(11), 'o', color='black')
# key data point that we are encircling
ax.plot((5), (5), 'o', color='y')
    
ax.add_patch(circle1)
ax.add_patch(circle2)
ax.add_patch(circle3)
fig.savefig('plotcircles2.png')

结果是:

你可以看到我把第二个圆的填充设置为 False,这对于圈出关键结果(比如我那个黄色的数据点)非常有用。

撰写回答