使用RegularPolyCollection在Matplotlib中只绘制一个三角形

0 投票
1 回答
1304 浏览
提问于 2025-04-18 15:59

我用 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

撰写回答