【问题标题】:Plotting triangles within a hexagon isn't easy在六边形内绘制三角形并不容易
【发布时间】:2021-03-05 13:16:44
【问题描述】:

我正在使用 matplotlib。

我设法使用 plt.scatter 绘制了一个二维六边形数组,其中我将六边形的标记设置为“h”,并将大小设置为 s=500 左右的大小。通过简单的数学,我为每个六边形的位置制作了数组(将间距标准化为 1)。这是我的picture 按预期绘制的六边形。

但是,我想在这些六边形内绘制三角形(6 个相等的三角形),但这并不容易。这是我用来绘制三角形的部分代码:

fig4, ax4 = plt.subplots()
ax4.set_aspect('equal')
for i in range(len(powtri)):
    for j in range(len(powtri[i])):
        plt.scatter(x=X_tric[i][j], y=Y_tric[i][j], s=size, marker=markers[i][j], c=powtri[i][j], cmap='jet')
cbar3 = plt.colorbar(fraction=0.03, pad=0.04)  
cbar3.set_label('Normalized assembly power')
plt.axis('off')
plt.title('Triangle Powers')

我的选项是使用标记 4&5 或 (我在标记数组中使用它来交替左/右三角形),然后我计算了每个三角形的中心(或每个三角形的尖端位置),但是实际的问题是我的图片不断被丑陋的格式截断,三角形标记的大小和位置不断变化,所以我最终得到this

我是不是走错了路?

谢谢。

【问题讨论】:

    标签: python matplotlib triangular


    【解决方案1】:

    我认为你需要一个等边三角形来做你想做的事情,我不认为 4,5, 提供的选项是完全正确的。

    幸运的是,matplotlib 允许您create new markers however you want。有两种方法可能对您的项目特别有用。

    1. 使用marker=(N, 0, angle) 创建一个正多边形标记,其中N 是边数,angle 是如何旋转标记,例如
    plt.scatter([0], [0], marker=(3, 0, 0))
    
    1. 使用顶点列表创建标记。例如。您可以使用
    2. 制作一个等边三角形
    length = np.sqrt(1**2 - 0.5**2)
    plt.scatter([0], [0], marker=[(0, 0), (1, 0), (0.5, length)])
    

    在您的情况下,似乎第二种选择可能是要走的路。我之所以这么说是因为当与this answer 结合旋转标记时,旋转似乎发生在0 附近,而对于(3, 0, 0) 方法,它发生在三角形的中心附近(我没有调查原因)。 把它们放在一起

    import matplotlib.pyplot as plt
    from matplotlib.markers import MarkerStyle
    import numpy as np
    
    fig, ax = plt.subplots()
    
    length = np.sqrt(1**2 - 0.5**2)
    m = MarkerStyle([(0, 0), (1, 0), (0.5, length)])
    
    for deg in range(6):
        m._transform.rotate_deg(60)
        ax.scatter([0], [0], marker=m, s=10000)
    
    fig.show()
    

    你可以得到这个。我希望这对您实现目标有用。

    【讨论】:

    • 听起来是个好主意,但我已经设法让它发挥作用。这仅适用于左右三角形(十六进制垂直指向的位置)。我不得不相应地将我的主数组拆分为左右三角形版本。然后我将市场规模与屏幕尺寸相关联,以适用于任何客户。还有多田! imgur.com/DngLHVV
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    相关资源
    最近更新 更多