使用RegularPolyCollection在Matplotlib中只绘制一个三角形
我用 CircleCollection 画了三个圆,现在我想用 RegularPolyCollection 只画一个三角形。我的三角形的顶点坐标是:
顶点 = [2, 1], [8, 1], [5, 9]
我不太明白选项中的 sizes、offsets 和 transoffset,因为我的英语很差,而且我只见过随机顶点的例子,所以手动找出这些点对我来说很复杂。我觉得sizes是我三角形外部圆的面积,但offsets是什么呢?这是我的代码:
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib import collections, transforms
import math as math
__author__ = 'Tobal'
def triangular(n):
return n * (n + 1) / 2
def draw_triangular(n):
fig = plt.gcf()
ax = fig.add_subplot(111)
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
vertices = [2, 1], [8, 1], [5, 9]
area = math.pi * .2 ** 2 * 500
'''circle1 = plt.Circle(vertices[0], .2, color='b')
circle2 = plt.Circle(vertices[1], .2, color='b')
circle3 = plt.Circle(vertices[2], .2, color='b')
fig.gca().add_artist(circle1)
fig.gca().add_artist(circle2)
fig.gca().add_artist(circle3)'''
circles = collections.CircleCollection([area, area, area], offsets=vertices, transOffset=ax.transData)
trans = fig.dpi_scale_trans + transforms.Affine2D().scale(1.0/72.0)
circles.set_transform(trans) # the points to pixels transform
poly = patches.Polygon(vertices)
poly2 = collections.RegularPolyCollection(numsides=3, sizes=(math.pi * 5.5 ** 2 * 500, ), offsets=[5, 1],
edgecolors=('black', ), facecolors=('red', ), transOffset=ax.transData,
rotation=0)
poly2.set_transform(trans)
#ax.add_patch(poly)
ax.add_collection(poly2, autolim=True)
ax.add_collection(circles, autolim=True)
#poly.set_color('red')
circles.set_color(['blue'])
ax.autoscale_view()
ax.set_title('Números Triangulares')
plt.show()
print(triangular(5))
draw_triangular(2)
最开始,我用 patch 来画,但圆的部分出现在三角形顶点的下面,所以我想用 collections 来画我的三角形。
谢谢!
1 个回答
3
你用错工具了。RegularPolyCollection
只能包含规则的三角形(也就是等边三角形,三个角都是60°)。
如果你只是想画一个单独的三角形,应该用collections.PolyCollection
:
pc = collections.PolyCollection((vertices,))
ax.add_collection(pc)
不过,如果你对简单的补丁效果满意,但绘制顺序不对,可以在创建补丁的时候使用zorder
这个关键词。想了解Z顺序的原理,可以查看这个链接:http://matplotlib.org/examples/pylab_examples/zorder_demo.html。