python - 如何使用matplotlib PATH绘制多边形

标签 python matplotlib path

我在使用 python 的 matplotlib PATH 模块时遇到问题 我想像这样画一个紧密的多边形:

enter image description here

但是我不知 Prop 体连接点的顺序,结果图片不能满足我的需求。不自己确定顺序,而是通过代码确定顺序,如何才能正确绘制多边形?

这是我的代码:

import matplotlib
import matplotlib.pyplot as plt
import pandas
from matplotlib.path import Path
import matplotlib.patches as patches
#read data
info = pandas.read_csv('/Users/james/Desktop/nba.csv')
info.columns = ['number', 'team_id', 'player_id', 'x_loc', 'y_loc', 
'radius', 'moment', 'game_clock', 'shot_clock', 'player_name', 
'player_jersey']

#first_team_info
x_1 = info.x_loc[1:6]
y_1 = info.y_loc[1:6]
matrix= [x_1,y_1]
z_1 = list(zip(*matrix))
z_1.append(z_1[4])
n_1 = info.player_jersey[1:6]
verts = z_1
codes = [Path.MOVETO,
     Path.LINETO,
     Path.LINETO,
     Path.LINETO,
     Path.LINETO,
     Path.CLOSEPOLY,
     ]
     path = Path(verts, codes)
     fig = plt.figure()
     ax = fig.add_subplot(111)
     patch = patches.PathPatch(path, facecolor='orange', lw=2)
     ax.add_patch(patch)
     ax.set_xlim(0, 100)
     ax.set_ylim(0, 55)
     plt.show()

我得到了这个:

enter image description here

最佳答案

Matplotlib 绘制路径上的点,以便将它们分配给补丁。 如果无法控制顺序,这可能会导致不良结果,例如问题中的情况。

所以解决方案可能是

  • (A) 使用船体。 Scipy 提供了scipy.spatial.ConvexHull 来计算点的周长,自动按照正确的顺序计算。这在许多情况下会产生良好的结果,请参见第一行,但在其他情况下可能会失败,因为船体内部的点被忽略了。
  • (B) 对点进行排序,例如围绕中间某一点逆时针旋转。在下面的示例中,我取所有点的平均值。排序可以想象成雷达扫描仪,点按它们与 x 轴的角度排序。这解决了例如第二排船体的问题,但当然也可能在更复杂的形状中失败。

enter image description here

import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import ConvexHull

p = [(1,1), (2,1.6), (0.8,2.7), (1.7,3.2)]
p2 = [(0.7,1.3),(2,0.9),(1.4,1.5),(1.9,3.1),(0.6,2.5),(1.4,2.3)]

def convexhull(p):
    p = np.array(p)
    hull = ConvexHull(p)
    return p[hull.vertices,:]

def ccw_sort(p):
    p = np.array(p)
    mean = np.mean(p,axis=0)
    d = p-mean
    s = np.arctan2(d[:,0], d[:,1])
    return p[np.argsort(s),:]

fig, axes = plt.subplots(ncols=3, nrows=2, sharex=True, sharey=True)

axes[0,0].set_title("original")
poly = plt.Polygon(p, ec="k")
axes[0,0].add_patch(poly)

poly2 = plt.Polygon(p2, ec="k")
axes[1,0].add_patch(poly2)

axes[0,1].set_title("convex hull")
poly = plt.Polygon(convexhull(p), ec="k")
axes[0,1].add_patch(poly)

poly2 = plt.Polygon(convexhull(p2), ec="k")
axes[1,1].add_patch(poly2)

axes[0,2].set_title("ccw sort")
poly = plt.Polygon(ccw_sort(p), ec="k")
axes[0,2].add_patch(poly)

poly2 = plt.Polygon(ccw_sort(p2), ec="k")
axes[1,2].add_patch(poly2)


for ax in axes[0,:]:
    x,y = zip(*p)
    ax.scatter(x,y, color="k", alpha=0.6, zorder=3)
for ax in axes[1,:]:
    x,y = zip(*p2)
    ax.scatter(x,y, color="k", alpha=0.6, zorder=3)


axes[0,0].margins(0.1)
axes[0,0].relim()
axes[0,0].autoscale_view()
plt.show()

关于python - 如何使用matplotlib PATH绘制多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44025403/

相关文章:

python - 如何选择伪元素并更改状态 from::after a::before?

c# - XElement.Load ("~/App_Data/file.xml") 找不到路径的一部分

c# - 有没有比字符串更好的方式来保存文件路径?

python - Plotly 传奇无法在手机上扩展

python - 在 Pandas 中执行类似 excel 的计数

python - 如何在数据框中添加和重命名(无标题)列

python - 使用 matplotlib 将 networkx 图嵌入到 wxPython 中

python - 可视化两个数值数组之间的差异

python - 寻找物体中心: showing wrong coordinate outside of the target object

winapi - 获取 "Application Data"目录路径的最佳方法?