Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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=
|
| 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
|
| 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=
|
| 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 |
-
|
| 97 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
| 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],
|