酸酸酸359 2023-03-08 11:13 采纳率: 66.7%
浏览 35
已结题

python如何将所有数据画在一张图上

这是定义的函数(这个函数是没问题的,一个软件包里的,但是我需要用他画图)

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)

但是只使用这个函数画出来是直角坐标:

img

然后在函数定义中加入下面代码

    #--------------------------------------------------------------------------
    # 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);

图片变成了这样

img

再在函数定义中加入代码:

    #--------------------------------------------------------------------------
    # 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()

img

变成了一堆这样的图片,但是这个图片的样子是我要的,只是变成一组数据一张图了,要怎么让所有数据都在一张图上呢

调用函数的代码如下:

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()

  • 写回答

2条回答 默认 最新

  • 「已注销」 2023-03-08 13:01
    关注

    “Devil组”引证GPT后的撰写:

    • 用Matplotlib中的子图(subplot)功能。在这种情况下,可以创建一个具有单个图形的子图网格,然后将所有数据绘制在同一个网格中。可以使用该subplot()函数定义子图网格,以及其他Matplotlib函数来绘制图形。

    下面是示例代码,其中假设数据存储在三个Numpy数组strike,dip和rake中,每个数组包含多个值,希望将它们绘制在同一张图上。

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 创建一个具有单个图形的子图网格
    fig, ax = plt.subplots()
    
    # 调用函数以获取数据
    n_1 = np.zeros([np.size(strike),3])
    u_1 = np.zeros([np.size(strike),3])
    # ... 其他变量的计算
    
    # 绘制数据
    ax.scatter(x_values, y_values, label='data1')
    ax.scatter(x_values, y_values, label='data2')
    ax.scatter(x_values, y_values, label='data3')
    
    # 添加标签和图例
    ax.set_xlabel('x label')
    ax.set_ylabel('y label')
    ax.legend()
    
    # 显示图形
    plt.show()
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月16日
  • 已采纳回答 3月8日
  • 创建了问题 3月8日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改