用pyplot绘制一个圆
让我感到惊讶的是,我没有找到一个简单明了的说明,教我如何用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
你需要把它添加到一个坐标轴上。一个 Circle
是 Patch
的一个子类,而坐标轴上有一个 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_on
是 True
,所以当圆超出坐标轴时,它会被裁剪掉。第三个(绿色)圆展示了当你不裁剪 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
,这对于圈出关键结果(比如我那个黄色的数据点)非常有用。