令人惊讶的是,我没有找到如何用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()
…但还是没能用上。
令人惊讶的是,我没有找到如何用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()
…但还是没能用上。
当前回答
如果你想绘制一组圆圈,你可能想看看这篇文章或这个要点(更新一点)。该帖子提供了一个名为circles的功能。
函数圆的工作原理类似于散点,但绘制的圆的大小以数据单位表示。
这里有一个例子:
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)
其他回答
#!/usr/bin/python
import matplotlib.pyplot as plt
import numpy as np
def xy(r,phi):
return r*np.cos(phi), r*np.sin(phi)
fig = plt.figure()
ax = fig.add_subplot(111,aspect='equal')
phis=np.arange(0,6.28,0.01)
r =1.
ax.plot( *xy(r,phis), c='r',ls='-' )
plt.show()
或者,如果您愿意,可以查看路径http://matplotlib.sourceforge.net/users/path_tutorial.html
扩展一个通用用例的可接受答案。特别是:
以自然长宽比查看圆形。 自动扩展轴的限制,以包括新绘制的圆。
独立的例子:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.add_patch(plt.Circle((0, 0), 0.2, color='r', alpha=0.5))
ax.add_patch(plt.Circle((1, 1), 0.5, color='#00ffff', alpha=0.5))
ax.add_artist(plt.Circle((1, 0), 0.5, color='#000033', alpha=0.5))
#Use adjustable='box-forced' to make the plot area square-shaped as well.
ax.set_aspect('equal', adjustable='datalim')
ax.plot() #Causes an autoscale update.
plt.show()
注意ax.add_patch(..)和ax.add_artist(..)之间的区别:在两者中,只有前者使自动缩放机制考虑到圆(参考:讨论),所以在运行上述代码后,我们得到:
参见:set_aspect(..)文档。
你需要把它加到坐标轴上。Circle是Patch的子类,axis有一个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,这对于包围关键结果(如黄色数据点)非常有用。
如果你的目标是让“圆”保持1的视觉长宽比,不管数据坐标是什么,你可以使用scatter()方法。http://matplotlib.org/1.3.1/api/pyplot_api.html#matplotlib.pyplot.scatter
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
r = [100, 80, 60, 40, 20] # in points, not data units
fig, ax = plt.subplots(1, 1)
ax.scatter(x, y, s=r)
fig.show()
import matplotlib.pyplot as plt
circle1 = plt.Circle((0, 0), 0.2, color='r')
plt.gca().add_patch(circle1)
一个公认答案的快速浓缩版本,快速插入一个圆到现有的情节。参考已接受的答案和其他答案了解细节。
顺便说一下:
gca()表示获取当前轴