cwadayi commited on
Commit
210db34
·
verified ·
1 Parent(s): a00010c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +12 -10
app.py CHANGED
@@ -58,7 +58,6 @@ def plot_seismic_exploration(v1, v2, h, x_max, num_receivers, gain):
58
  receiver_x = np.linspace(0, x_max, int(num_receivers))
59
 
60
  # 計算每個測站的抵達時間
61
- t_direct_rx = receiver_x / v1
62
  t_reflected_rx = np.sqrt(t0**2 + (receiver_x / v1)**2)
63
  t_first_arrival_rx = np.minimum(receiver_x / v1, (receiver_x / v2) + ti)
64
 
@@ -71,14 +70,14 @@ def plot_seismic_exploration(v1, v2, h, x_max, num_receivers, gain):
71
  wavelet_amp_refl = ricker_wavelet(wavelet_t, f=40) * gain
72
  x_trace_refl = receiver_x[i] + wavelet_amp_refl
73
  y_trace_refl = t_reflected_rx[i] - wavelet_duration/2 + wavelet_t
74
- ax2.plot(x_trace_refl, y_trace_refl, 'k-', linewidth=1)
75
  ax2.fill_betweenx(y_trace_refl, receiver_x[i], x_trace_refl, where=(x_trace_refl > receiver_x[i]), color='black')
76
 
77
  # 繪製初達波震波
78
  wavelet_amp_first = ricker_wavelet(wavelet_t, f=30) * gain * 1.2
79
  x_trace_first = receiver_x[i] + wavelet_amp_first
80
  y_trace_first = t_first_arrival_rx[i] - wavelet_duration/2 + wavelet_t
81
- ax2.plot(x_trace_first, y_trace_first, 'r-', linewidth=1.5)
82
  ax2.fill_betweenx(y_trace_first, receiver_x[i], x_trace_first, where=(x_trace_first > receiver_x[i]), color='red', alpha=0.8)
83
 
84
  # 繪製地表、震源與測站
@@ -86,15 +85,19 @@ def plot_seismic_exploration(v1, v2, h, x_max, num_receivers, gain):
86
  ax2.plot(0, 0, 'r*', markersize=20, label='Source')
87
  ax2.plot(receiver_x, np.zeros_like(receiver_x), 'kv', markersize=8, label='Receivers')
88
 
89
- ax2.set_title(f"2. Visualized Seismic Profile ({int(num_receivers)} Traces)", fontsize=16, loc='left')
90
  ax2.set_xlabel("Distance (m)")
91
  ax2.set_ylabel("Two-Way Time (s)")
92
  ax2.set_xlim(-x_max * 0.05, x_max * 1.05)
93
  ax2.set_ylim(y_max * 1.1, -y_max*0.05)
94
- ax2.legend(loc='lower left')
95
 
96
- plt.tight_layout()
97
- fig1.tight_layout()
 
 
 
 
 
98
 
99
  # === PART 4: 準備輸出的說明文字 ===
100
  results_md = f"""
@@ -134,7 +137,8 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
134
  gr.Markdown("### ⚙️ 2. 佈放儀器與顯示設定")
135
  xmax_slider = gr.Slider(label="最大觀測距離 (m)", minimum=100, maximum=500, value=250, step=10)
136
  receivers_slider = gr.Slider(label="測站數量", minimum=5, maximum=100, value=40, step=1)
137
- gain_slider = gr.Slider(label="剖面增益 (Display Gain)", minimum=1, maximum=20, value=5, step=1)
 
138
 
139
  submit_btn = gr.Button("🚀 開始探勘!", variant="primary")
140
 
@@ -147,8 +151,6 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
147
  results_output = gr.Markdown("### 🔬 分析結果\n請設計你的地層模型並點擊「開始探勘!」以顯示計算結果。")
148
 
149
  # --- 事件監聽 ---
150
- # 【*** THIS IS THE FIX ***】
151
- # The incorrect 'demo.outputs[-1]' has been replaced with the correct variable name 'results_output'.
152
  submit_btn.click(
153
  fn=plot_seismic_exploration,
154
  inputs=[v1_slider, v2_slider, h_slider, xmax_slider, receivers_slider, gain_slider],
 
58
  receiver_x = np.linspace(0, x_max, int(num_receivers))
59
 
60
  # 計算每個測站的抵達時間
 
61
  t_reflected_rx = np.sqrt(t0**2 + (receiver_x / v1)**2)
62
  t_first_arrival_rx = np.minimum(receiver_x / v1, (receiver_x / v2) + ti)
63
 
 
70
  wavelet_amp_refl = ricker_wavelet(wavelet_t, f=40) * gain
71
  x_trace_refl = receiver_x[i] + wavelet_amp_refl
72
  y_trace_refl = t_reflected_rx[i] - wavelet_duration/2 + wavelet_t
73
+ ax2.plot(x_trace_refl, y_trace_refl, 'k-', linewidth=0.8)
74
  ax2.fill_betweenx(y_trace_refl, receiver_x[i], x_trace_refl, where=(x_trace_refl > receiver_x[i]), color='black')
75
 
76
  # 繪製初達波震波
77
  wavelet_amp_first = ricker_wavelet(wavelet_t, f=30) * gain * 1.2
78
  x_trace_first = receiver_x[i] + wavelet_amp_first
79
  y_trace_first = t_first_arrival_rx[i] - wavelet_duration/2 + wavelet_t
80
+ ax2.plot(x_trace_first, y_trace_first, 'r-', linewidth=1)
81
  ax2.fill_betweenx(y_trace_first, receiver_x[i], x_trace_first, where=(x_trace_first > receiver_x[i]), color='red', alpha=0.8)
82
 
83
  # 繪製地表、震源與測站
 
85
  ax2.plot(0, 0, 'r*', markersize=20, label='Source')
86
  ax2.plot(receiver_x, np.zeros_like(receiver_x), 'kv', markersize=8, label='Receivers')
87
 
88
+ ax2.set_title(f"2. Visualized Seismic Profile ({int(num_receivers)} Traces)", fontsize=14, loc='left')
89
  ax2.set_xlabel("Distance (m)")
90
  ax2.set_ylabel("Two-Way Time (s)")
91
  ax2.set_xlim(-x_max * 0.05, x_max * 1.05)
92
  ax2.set_ylim(y_max * 1.1, -y_max*0.05)
 
93
 
94
+ # 【*** FIX 1: Move legend to a better position ***】
95
+ ax2.legend(loc='upper right', fontsize='small')
96
+
97
+ # 【*** FIX 2: Manually adjust layout to prevent overlaps ***】
98
+ fig1.tight_layout(pad=1.1)
99
+ fig2.subplots_adjust(left=0.1, right=0.98, top=0.9, bottom=0.15)
100
+
101
 
102
  # === PART 4: 準備輸出的說明文字 ===
103
  results_md = f"""
 
137
  gr.Markdown("### ⚙️ 2. 佈放儀器與顯示設定")
138
  xmax_slider = gr.Slider(label="最大觀測距離 (m)", minimum=100, maximum=500, value=250, step=10)
139
  receivers_slider = gr.Slider(label="測站數量", minimum=5, maximum=100, value=40, step=1)
140
+ # 【*** FIX 3: Lower default gain for clarity ***】
141
+ gain_slider = gr.Slider(label="剖面增益 (Display Gain)", minimum=1, maximum=20, value=4, step=1)
142
 
143
  submit_btn = gr.Button("🚀 開始探勘!", variant="primary")
144
 
 
151
  results_output = gr.Markdown("### 🔬 分析結果\n請設計你的地層模型並點擊「開始探勘!」以顯示計算結果。")
152
 
153
  # --- 事件監聽 ---
 
 
154
  submit_btn.click(
155
  fn=plot_seismic_exploration,
156
  inputs=[v1_slider, v2_slider, h_slider, xmax_slider, receivers_slider, gain_slider],