繁体   English   中英

获取与 Matplotlib 的交点坐标

[英]Get coordinates of intersection with Matplotlib

我想获取两个图形在 Matplotlib 中相交的所有坐标。我尝试使用 DataFrames 但没有得到任何结果。

在这个例子中,我画了一个圆和一条线(为简单起见)。 而且我希望有一些形式的坐标线进入圆圈并离开它。

import numpy as np
from matplotlib import pyplot as plt
import pandas as pd
r = 1
n = 64
t = np.linspace(0, 2 * np.pi, n + 1)
    
x_circle = r * np.cos(t) + 1
y_circle = r * np.sin(t) + 1
df = pd.DataFrame({'x':x, 'y':y})
plt.plot(df['x'], df['y'])
plt.plot(range(4), np.array(range(4))*0.6)
plt.show()

要获得分数:减去x_circley_circle并将其与0进行比较。

至 plot:使用plt.scatter() - 文档

完整代码:

import numpy as np
from matplotlib import pyplot as plt
import pandas as pd
r = 1
n = 64
t = np.linspace(0, 2 * np.pi, n + 1)
    
x_circle = r * np.cos(t) + 1
y_circle = r * np.sin(t) + 1

#get intersecting points
pts = np.reshape(np.where((np.array(x_circle, dtype = 'float16')-np.array(y_circle, dtype = 'float16') )== 0)[0], (1, -1))
pts = np.append(pts, np.array(x_circle)[pts], axis = 0)
print(pts)

plt.plot(x_circle)
plt.plot(y_circle)
plt.scatter(pts[0], pts[1], s = 200, marker='o')
#plt.plot(range(4), np.array(range(4))*0.6)
plt.show()

注意:由于都是浮点值,在计算np.sin()np.cos()时,它会四舍五入最后一位。 因此,在比较时,我将其更改为float16值。

这个问题的本质是获得两个几何之间的交点。 然后创建一个 plot 来可视化结果。 有几个 python 模块可以处理这个问题。 我选择shapely来演示获得结果的步骤。 Matplotlib用于plot,不判断交集。 这是代码和 output plot。请注意,我避免使用pandas ,因为它不相关。

import matplotlib.pyplot as plt
import numpy as np
from shapely import wkt
from shapely.geometry import LineString
from shapely.wkt import loads

# prep data
r = 1
n = 64
t = np.linspace(0, 2 * np.pi, n + 1)

x_circle = r * np.cos(t) + 1
y_circle = r * np.sin(t) + 1

# create the linestring of circle's perimeter
wktcode1 = "LINESTRING ("
for i,(x,y) in enumerate(zip(x_circle, y_circle)):
    if i!=len(x_circle)-1:
        wktcode1 += str(x)+" "+str(y)+", "
    else:
        wktcode1 += str(x)+" "+str(y)+")"
    #print(wktcode1)

circle_perim = loads(wktcode1)  #a geometry object

# create another geometry, for the line
wktcode2 = "LINESTRING ("
xs = range(4)
ys = np.array(range(4))*0.6
for i,(x,y) in enumerate(zip(xs, ys)):
    if i!=len(range(4))-1:
        wktcode2 += str(x)+" "+str(y)+", "
    else:
        wktcode2 += str(x)+" "+str(y)+")"
    #print(wktcode2)
    pass

line_str = loads(wktcode2)    #a geometry object

# check if they are intersect
ixx = circle_perim.intersection(line_str)

# visualization of the intersection
# plot circle
plt.plot(x_circle, y_circle)

# plot line
plt.plot(range(4), np.array(range(4))*0.6)

if ixx:
    # plot intersection points
    for ea in ixx:
        plt.scatter(*ea.xy)
        print(*ea.xy)

plt.show()

output plot:

视觉交叉点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM