这是定义的函数(这个函数是没问题的,一个软件包里的,但是我需要用他画图)
def plot_P_T_axes(strike,dip,rake):
import matplotlib.pyplot as plt
import numpy as np
n_1 = np.zeros([np.size(strike),3])
u_1 = np.zeros([np.size(strike),3])
n_1[:,0] = -np.sin(dip*np.pi/180)*np.sin(strike*np.pi/180)
n_1[:,1] = np.sin(dip*np.pi/180)*np.cos(strike*np.pi/180)
n_1[:,2] = -np.cos(dip*np.pi/180)
u_1[:,0] = np.cos(rake*np.pi/180)*np.cos(strike*np.pi/180) + np.cos(dip*np.pi/180)*np.sin(rake*np.pi/180)*np.sin(strike*np.pi/180)
u_1[:,1] = np.cos(rake*np.pi/180)*np.sin(strike*np.pi/180) - np.cos(dip*np.pi/180)*np.sin(rake*np.pi/180)*np.cos(strike*np.pi/180)
u_1[:,2] = -np.sin(rake*np.pi/180)*np.sin(dip*np.pi/180)
N = np.size(strike)
#--------------------------------------------------------------------------
# lower hemisphere equal-area projection
#--------------------------------------------------------------------------
projection = -1
#--------------------------------------------------------------------------
# P/T axes
#--------------------------------------------------------------------------
P_osa = np.zeros([N,3])
T_osa = np.zeros([N,3])
P_azimuth = np.zeros(N)
T_azimuth = np.zeros(N)
P_theta = np.zeros(N)
T_theta = np.zeros(N)
P_x = np.zeros(N)
P_y = np.zeros(N)
T_x = np.zeros(N)
T_y = np.zeros(N)
for i in range(N):
P_osa[i,:] = (n_1[i,:]-u_1[i,:])/np.linalg.norm(n_1[i,:]-u_1[i,:],2)
T_osa[i,:] = (n_1[i,:]+u_1[i,:])/np.linalg.norm(n_1[i,:]+u_1[i,:],2)
if (P_osa[i,2]>0): P_osa[i,0]=-P_osa[i,0]; P_osa[i,1]=-P_osa[i,1]; P_osa[i,2]=-P_osa[i,2];
if (T_osa[i,2]>0): T_osa[i,0]=-T_osa[i,0]; T_osa[i,1]=-T_osa[i,1]; T_osa[i,2]=-T_osa[i,2];
fi = np.arctan(np.abs(P_osa[i,0]/P_osa[i,1]))*180/np.pi
if (P_osa[i,0]>0 and P_osa[i,1]>0): P_azimuth[i] = fi; # 1. kvadrant
if (P_osa[i,0]>0 and P_osa[i,1]<0): P_azimuth[i] = 180-fi; # 2. kvadrant
if (P_osa[i,0]<0 and P_osa[i,1]<0): P_azimuth[i] = fi+180; # 3. kvadrant
if (P_osa[i,0]<0 and P_osa[i,1]>0): P_azimuth[i] = 360-fi; # 4. kvadrant
P_theta[i] = np.arccos(np.abs(P_osa[i,2]))*180/np.pi
fi = np.arctan(np.abs(T_osa[i,0]/T_osa[i,1]))*180/np.pi
if (T_osa[i,0]>0 and T_osa[i,1]>0): T_azimuth[i] = fi; # 1. kvadrant
if (T_osa[i,0]>0 and T_osa[i,1]<0): T_azimuth[i] = 180-fi; # 2. kvadrant
if (T_osa[i,0]<0 and T_osa[i,1]<0): T_azimuth[i] = fi+180; # 3. kvadrant
if (T_osa[i,0]<0 and T_osa[i,1]>0): T_azimuth[i] = 360-fi; # 4. kvadrant
T_theta[i] = np.arccos(np.abs(T_osa[i,2]))*180/np.pi
P_x[i] = np.sqrt(2.)*projection*np.sin(P_theta[i]*np.pi/360)*np.sin(P_azimuth[i]*np.pi/180)
P_y[i] = np.sqrt(2.)*projection*np.sin(P_theta[i]*np.pi/360)*np.cos(P_azimuth[i]*np.pi/180)
T_x[i] = np.sqrt(2.)*projection*np.sin(T_theta[i]*np.pi/360)*np.sin(T_azimuth[i]*np.pi/180)
T_y[i] = np.sqrt(2.)*projection*np.sin(T_theta[i]*np.pi/360)*np.cos(T_azimuth[i]*np.pi/180)
plt.plot(P_y,P_x,'ro', markeredgecolor='r', markerfacecolor='none', markersize=8, markeredgewidth=1.5)
plt.plot(T_y,T_x,'b+', markersize=8, markeredgewidth=1.5)
但是只使用这个函数画出来是直角坐标:
然后在函数定义中加入下面代码
#--------------------------------------------------------------------------
# boundary circle and the centre of the circle
#--------------------------------------------------------------------------
fi = np.arange(0,360, 0.1)
plt.plot(np.cos(fi*np.pi/180.),np.sin(fi*np.pi/180.),'k-', linewidth = 2.0)
plt.plot(0,0,'k+', markersize = 10);
图片变成了这样
再在函数定义中加入代码:
#--------------------------------------------------------------------------
# plotting the stress directions in the focal sphere
#--------------------------------------------------------------------------
fig, ax = plt.subplots()
ax.set_title('Principal stress and P/T axes',fontsize = 16)
ax.axis('equal')
ax.axis([-1.05, 1.70, -1.05, 1.05])
ax.axis('off')
#ax.axis()
变成了一堆这样的图片,但是这个图片的样子是我要的,只是变成一组数据一张图了,要怎么让所有数据都在一张图上呢
调用函数的代码如下:
import matplotlib.pyplot as plt
import plot_stress as plots
from openpyxl import load_workbook
wb = load_workbook(r'satsi_output.xlsx') # 获取已存在的工作簿
ws = wb['DC_50']# 获取工作表
for i in range(2,30):
strike = ws.cell(row=i, column=39).value
dip = ws.cell(row=i, column=40).value
rake = ws.cell(row=i, column=41).value
plots.plot_P_T_axes(strike, dip, rake)
plt.show()