在六边形内绘制三角形并不容易

问题描述

我正在使用 matplotlib。

我设法使用 plt.scatter 绘制了一个 2D 六边形阵列,在那里我将标记设置为 'h' 表示六边形,并将大小设置为 s=500 左右。通过简单的数学运算,我为每个六边形的位置制作了数组(将间距标准化为 1)。这是我按预期绘制的六边形的 picture

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

[Unit]
Description=HttpApiHost .NET Web API App running on Ubuntu

[Service]
WorkingDirectory=/home/ubuntu/myapp/MyAppApi
ExecStart=/usr/bin/dotnet /home/ubuntu/myapp/MyAppApi/MyApp.HttpApi.Host.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=http-api-host-syslog
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

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

我是否以错误的方式处理这个问题?

谢谢。

解决方法

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

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

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

在您的情况下,似乎第二种选择可能是要走的路。我这么说的原因是因为当与 this answer 结合旋转标记时,旋转似乎发生在 0 附近,而对于 (3,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,length)])

for deg in range(6):
    m._transform.rotate_deg(60)
    ax.scatter([0],marker=m,s=10000)

fig.show()

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

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...