问题描述
我正在使用 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。有两种方法可能对您的项目特别有用。
- 用
marker=(N,angle)
创建一个正多边形标记,其中N
是边数,angle
是如何旋转标记,例如
plt.scatter([0],[0],marker=(3,0))
- 使用顶点列表创建标记。例如。您可以使用 制作一个等边三角形
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()
你可以得到这个。我希望这对实现您的目标有用。