如何使用 mplstereonet 绘制圆和平面之间的区域?

问题描述 投票:0回答:0

我正在尝试使用 mplstereonet 绘制圆和平面之间的区域,但我没有在这个包中找到一个函数来做它(如果你知道其他包做这个,请告诉我),所以我是试图编写我自己的代码来做到这一点,但我失败了。

我编写了以下函数,但在我发送的第二张图片中,我希望飞机和红色圆圈之间的区域完全被绘制出来,但那并没有发生。以下功能是更大代码的一部分。

def graficar_estereograma(self, df_lineas_interseccion_totales):
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='stereonet')
            
    dip_plano_caja = self.dipdir_plano_caja[0]-40
    strike_plano_caja = self.dipdir_plano_caja[1]+90 # Rumbo = Dip direction + 90°
    ang_friccion_interna = float(input("Ingrese el ángulo de fricción interna: "))
    
    if strike_plano_caja > 360:
        
        strike_plano_caja = strike_plano_caja - 360
    
    if strike_plano_caja < 0:
        
        strike_plano_caja = strike_plano_caja + 360
        
    ax.plane(strike_plano_caja, dip_plano_caja, 'y-', linewidth=1)
    ax.pole(strike_plano_caja, dip_plano_caja, 'yo', markersize=5)
    
    k = 0
    
    for j in range(40):
            
        for k in range(int(2*(90-ang_friccion_interna))):
                
            ax.pole(strike_plano_caja-20+j, ang_friccion_interna + k, 'yo', markersize=1)
            
    for i in range(len(self.df_planos_interseccion_caja)):
        
        dip_plano_interseccion_caja, strike_plano_interseccion_caja = dip_dipdir(self.df_planos_interseccion_caja.loc[i, ["A","B","C"]])
        
        strike_plano_interseccion_caja = strike_plano_interseccion_caja - 90
        
        if strike_plano_interseccion_caja > 360:
            
             strike_plano_interseccion_caja = strike_plano_interseccion_caja - 360
             
        if strike_plano_interseccion_caja < 0:
            
            strike_plano_interseccion_caja = strike_plano_interseccion_caja + 360
        
        self.df_planos_interseccion_caja.loc[i, "Rumbo"] = strike_plano_interseccion_caja
        
        if abs(strike_plano_interseccion_caja - strike_plano_caja) < 20 and abs(90-ang_friccion_interna) < dip_plano_interseccion_caja < dip_plano_caja:
           
            ax.pole(strike_plano_interseccion_caja, dip_plano_interseccion_caja, 'bo', markersize=5)
            
            self.df_planos_interseccion_caja.loc[i,"Falla plana"] = "SI"
            
        else:
            
            ax.pole(strike_plano_interseccion_caja, dip_plano_interseccion_caja, 'go', markersize=5)
    
    ax.set_title('Falla plana', loc="left")
    
    ax.grid()
    
    ax.cone(90, 0, abs(90-ang_friccion_interna), facecolor="white", zorder=1, linewidth=2,
            edgecolors="red")
    
    plt.show()
    
    fig2 = plt.figure()
    ax2 = fig2.add_subplot(111, projection='stereonet')
    
    for i in range(len(df_lineas_interseccion_totales)):
            
        if df_lineas_interseccion_totales.loc[i,"Interseccion"] == "SI" and abs(df_lineas_interseccion_totales.loc[i,"Trend"] - strike_plano_caja) > 45 and ang_friccion_interna < df_lineas_interseccion_totales.loc[i,"Plunge"] < dip_plano_caja:
            
            ax2.pole(df_lineas_interseccion_totales.loc[i,"Trend"]+90, df_lineas_interseccion_totales.loc[i,"Plunge"], 'bo', markersize=5)
            
    ax2.cone(90, 0, abs(90-ang_friccion_interna), facecolor="white", zorder=1, linewidth=2,
            edgecolors="red")
    
    ax2.plane(strike_plano_caja, dip_plano_caja, 'y-', linewidth=1)
    ax2.pole(strike_plano_caja, dip_plano_caja, 'yo', markersize=5)
    
    plunge = 0
    bearing = 0
    
    k = 0
    
    df_interseccion_estereonet = pd.DataFrame(columns=["plunge","bearing"])
    
    for k in range(360):
        
        plunge, bearing = mplstereonet.plane_intersection(strike_plano_caja, dip_plano_caja, k, ang_friccion_interna)
        
        plunge = plunge.item()
        bearing = bearing.item()
        
        if round(plunge) == 30:
        
            df_interseccion_estereonet.loc[k,"plunge"] = int(plunge)
            df_interseccion_estereonet.loc[k,"bearing"] = int(bearing)
            df_interseccion_estereonet = df_interseccion_estereonet.drop_duplicates()
            
            ax2.line(plunge, bearing, marker='*', markersize=15)
    
    max_bearing = df_interseccion_estereonet["bearing"].max()
    min_bearing = df_interseccion_estereonet["bearing"].min()
    plunge = df_interseccion_estereonet["plunge"].max()
    
    a = 90-ang_friccion_interna
    
    df_interseccion_estereonet2 = pd.DataFrame(columns=["plunge 2","bearing 2","plunge caja","bearing caja"])
    
    for j in range(max_bearing - min_bearing):
        
        for n in range(360):
            
            plunge2, bearing2 = mplstereonet.plane_intersection(min_bearing+j, 90, n, ang_friccion_interna)
            
            plunge2 = plunge2.item()
            bearing2 = bearing2.item()
            
            plunge_caja, bearing_caja = mplstereonet.plane_intersection(min_bearing+j, 90, strike_plano_caja, dip_plano_caja)
            plunge_caja = plunge_caja.item()
            bearing_caja = bearing_caja.item()
            
            if round(plunge2) == 30 and abs(bearing2 - bearing_caja)<90:
                
                df_interseccion_estereonet2.loc[n,"plunge 2"] = int(plunge2)
                df_interseccion_estereonet2.loc[n,"bearing 2"] = int(bearing2)
                
                ax2.line(plunge2, bearing2, marker='o', markersize=1)
                
                df_interseccion_estereonet2.loc[n,"plunge caja"] = int(plunge_caja)
                df_interseccion_estereonet2.loc[n,"bearing caja"] = int(bearing_caja)
                ax2.line(plunge_caja, bearing_caja, marker='o', markersize=1)
                df_interseccion_estereonet2 = df_interseccion_estereonet2.drop_duplicates()
    
    for k in range(len(df_interseccion_estereonet2)):
        
        for j in range(abs(df_interseccion_estereonet2.iloc[k,2]-df_interseccion_estereonet2.iloc[k,0])):
            
            ax2.pole(df_interseccion_estereonet2.iloc[k,1] + 90, dip_plano_caja + j, 'yo', markersize=1)
                
    ax2.set_title('Falla por cuña', loc="left")
    
    ax2.grid()

    plt.show()

python geometry
© www.soinside.com 2019 - 2024. All rights reserved.