UPDATE: Yesterday (scroll up), I hadn’t noticed that our man-hours were misconstrued. Our bot tells it best (below):
PROMPT:
import matplotlib.pyplot as plt
# Dates (now includes Aug 23)
dates = ["Aug 18", "Aug 19", "Aug 20", "Aug 21", "Aug 22", "Aug 23"]
# Data
acres = [17.5, 45, 54, 82, 90, 133]
personnel = [32, 32, 90, 129, 128, 111]
man_hours = [p*8 for p in personnel]
acres_per_manhour = [acres[i]/man_hours[i] for i in range(len(acres))]
# Daily growth (new acres added each day)
growth = [0] + [acres[i] - acres[i-1] for i in range(1, len(acres))]
# Create figure and axes
fig, ax1 = plt.subplots(figsize=(10,6))
# Plot Acres
ax1.plot(dates, acres, color='red', marker='o', label='Total Acres')
ax1.set_xlabel('Date')
ax1.set_ylabel('Acres', color='red')
ax1.tick_params(axis='y', labelcolor='red')
ax1.set_title('La Plata Fire: Growth, Personnel, and Efficiency')
# Plot Personnel on same graph with secondary y-axis
ax2 = ax1.twinx()
ax2.plot(dates, personnel, color='blue', marker='s', label='Personnel')
ax2.set_ylabel('Personnel', color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
# Plot Acres per Man-hour as bar chart
ax3 = ax1.twinx()
ax3.bar(dates, acres_per_manhour, alpha=0.3, color='green', label='Acres per Man-hour')
ax3.set_ylabel('Acres per Man-hour', color='green')
ax3.tick_params(axis='y', labelcolor='green')
ax3.spines['right'].set_position(('outward', 60)) # Move third axis out
# Plot Daily Growth as dashed orange line
ax1.plot(dates, growth, color='orange', marker='^', linestyle='--', label='Daily Growth (Acres)')
# Add legends
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
lines3, labels3 = ax3.get_legend_handles_labels()
ax1.legend(lines + lines2 + lines3, labels + labels2 + labels3, loc='upper left')
plt.tight_layout()
plt.show()
The above script appears overly generous to man-hours per acre, making them appear more efficient, beside the following data:
I found the following data:
lets go over the numbers given more data:
August 18 Federal Forest Firefighters are currently fighting a wildfire that ignited near the La Plata Trail in Chaffee County. The “La Plata” fire is estimated to be 15 to 20 acres in size at this time, at high elevation, and growing. The fire has now crossed the county line into Lake County. The fire is all in federal land and no pre- evacuations or evacuations have been called for at this time. There is zero containment at this time.
19th
Location: The wildfire is on the Leadville Ranger District, 4 miles west of Twin Lakes within Chaffee and Lake counties. Start Date: August 17, 2025, at 5:46 p.m. Size: 45 acres Containment: 0% Cause: Human caused Vegetation: Timber-understory, grass and brush Resources: Approximately 32 personnel ar
20th Size: 54 acres Containment: 0% Total Personnel: Approximately 90 personnel. More resources are on order and en route. Location: Pike-San Isabel National Forests, 4 miles west of Twin Lakes in Chaffee and Lake counties Reported: August 17, 2025, at 5:46 p.m.
21st:
Size: 82 acres Containment: 0% Total Personnel: 129 Location: Pike-San Isabel National Forests, 4 miles west of Twin Lakes in Chaffee and Lake counties Reported: Aug. 17, 2025, at 5:46 p.m.
22nd:
Size: 90 acres | Containment: 0% | Total Personnel: 128 Location: Pike-San Isabel National Forests, 4 miles west of Twin Lakes in Chaffee and Lake Counties Reported: Aug. 17, 2025, at 5:46 p.m. | Cause: Human-caused
Elapsed time: Five Days
Acres/Day: 18
Staff/Acres/Day: 7.11
Staff/Total Acres: 1.42
Non-Overtime Man-hours (assuming ~8 hours/worker/day @ full deployment): 5,120
Man Hours per Acre: 56.88
Acres per Man Hour: 0.0176
ONE DAY:
Growth since yesterday: 8 Acres
Staff/Acre Growth: 16 Staff / Acre Growth
Man hours (assuming ~8 hours/worker): 1024
Man Hours per Acre Growth: 128
Growth rate: 9.76%
August 23rd:
23rd Size: 133 acres | Containment: 0% | Total Personnel: 111
Compare to the older script which was a more accurate representation of man-hours per acre:
import matplotlib.pyplot as plt
# Dates
dates = ["Aug 18", "Aug 19", "Aug 20", "Aug 21", "Aug 22"]
# Data
acres = [17.5, 45, 54, 82, 90]
personnel = [32, 32, 90, 129, 128]
man_hours = [p*8 for p in personnel]
acres_per_manhour = [acres[i]/man_hours[i] for i in range(len(acres))]
# Create figure and axes
fig, ax1 = plt.subplots(figsize=(10,6))
# Plot Acres
ax1.plot(dates, acres, color='red', marker='o', label='Acres')
ax1.set_xlabel('Date')
ax1.set_ylabel('Acres', color='red')
ax1.tick_params(axis='y', labelcolor='red')
ax1.set_title('La Plata Fire: Growth, Personnel, and Efficiency')
# Plot Personnel on same graph with secondary y-axis
ax2 = ax1.twinx()
ax2.plot(dates, personnel, color='blue', marker='s', label='Personnel')
ax2.set_ylabel('Personnel', color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
# Plot Acres per Man-hour as bar chart
ax3 = ax1.twinx()
ax3.bar(dates, acres_per_manhour, alpha=0.3, color='green', label='Acres per Man-hour')
ax3.set_ylabel('Acres per Man-hour', color='green')
ax3.tick_params(axis='y', labelcolor='green')
ax3.spines['right'].set_position(('outward', 60)) # Move third axis out
# Add legends
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
lines3, labels3 = ax3.get_legend_handles_labels()
ax1.legend(lines + lines2 + lines3, labels + labels2 + labels3, loc='upper left')
plt.tight_layout()
plt.show()
import matplotlib.pyplot as plt
# Dates
dates = ["Aug 18", "Aug 19", "Aug 20", "Aug 21", "Aug 22", "Aug 23"]
# Reported fire size each day
acres = [17.5, 45, 54, 82, 90, 133]
# Personnel each day
personnel = [32, 32, 90, 129, 128, 111]
# Man-hours per day (8 hrs/worker)
man_hours = [p*8 for p in personnel]
# Daily growth in acres (delta from previous day)
growth = [0] + [acres[i] - acres[i-1] for i in range(1, len(acres))]
# Efficiency metrics
# WRONG (too generous): total acres ÷ today's man-hours
acres_per_mh_total = [acres[i]/man_hours[i] for i in range(len(acres))]
# RIGHT (growth-based): daily new acres ÷ today's man-hours
acres_per_mh_growth = [growth[i]/man_hours[i] if man_hours[i] > 0 else 0 for i in range(len(acres))]
# --- Plot ---
fig, ax1 = plt.subplots(figsize=(10,6))
# Fire size
ax1.plot(dates, acres, color='red', marker='o', label='Total Acres')
ax1.set_xlabel('Date')
ax1.set_ylabel('Acres', color='red')
ax1.tick_params(axis='y', labelcolor='red')
ax1.set_title('La Plata Fire: Growth, Personnel, and Efficiency')
# Personnel (2nd axis)
ax2 = ax1.twinx()
ax2.plot(dates, personnel, color='blue', marker='s', label='Personnel')
ax2.set_ylabel('Personnel', color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
# Efficiency bars (3rd axis)
ax3 = ax1.twinx()
bar_width = 0.35
x = range(len(dates))
ax3.bar([i-0.2 for i in x], acres_per_mh_total, width=bar_width,
alpha=0.3, color='green', label='Acres per Man-hour (total/biased)')
ax3.bar([i+0.2 for i in x], acres_per_mh_growth, width=bar_width,
alpha=0.6, color='orange', label='Acres per Man-hour (growth-based)')
ax3.set_ylabel('Acres per Man-hour')
ax3.tick_params(axis='y', labelcolor='black')
ax3.spines['right'].set_position(('outward', 60))
# Legend
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
lines3, labels3 = ax3.get_legend_handles_labels()
ax1.legend(lines + lines2 + lines3, labels + labels2 + labels3, loc='upper left')
plt.tight_layout()
plt.show()
import matplotlib.pyplot as plt
# Dates
dates = ["Aug 18", "Aug 19", "Aug 20", "Aug 21", "Aug 22", "Aug 23"]
# Reported fire size each day
acres = [17.5, 45, 54, 82, 90, 133]
# Personnel each day
personnel = [32, 32, 90, 129, 128, 111]
# Man-hours per day (8 hrs/worker)
man_hours_daily = [p*8 for p in personnel]
# Daily growth in acres (delta from previous day)
growth = [0] + [acres[i] - acres[i-1] for i in range(1, len(acres))]
# Efficiency metrics
# Daily (growth-based)
acres_per_mh_growth = [growth[i]/man_hours_daily[i] if man_hours_daily[i] > 0 else 0 for i in range(len(acres))]
mh_per_acre_growth = [1/x if x > 0 else 0 for x in acres_per_mh_growth] # inverse
# Cumulative totals
cum_man_hours = []
total = 0
for mh in man_hours_daily:
total += mh
cum_man_hours.append(total)
mh_per_acre_total = [cum_man_hours[i]/acres[i] if acres[i] > 0 else 0 for i in range(len(acres))]
# --- Plot ---
fig, ax1 = plt.subplots(figsize=(11,7))
# Fire size
ax1.plot(dates, acres, color='red', marker='o', label='Total Acres')
ax1.set_xlabel('Date')
ax1.set_ylabel('Acres', color='red')
ax1.tick_params(axis='y', labelcolor='red')
ax1.set_title('La Plata Fire: Growth, Personnel, and Efficiency')
# Personnel (2nd axis)
ax2 = ax1.twinx()
ax2.plot(dates, personnel, color='blue', marker='s', label='Personnel')
ax2.set_ylabel('Personnel', color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
# Efficiency metrics (3rd axis)
ax3 = ax1.twinx()
bar_width = 0.25
x = range(len(dates))
# Daily growth efficiency
ax3.bar([i-0.25 for i in x], acres_per_mh_growth, width=bar_width,
alpha=0.6, color='orange', label='Acres per Man-hour (growth)')
ax3.bar([i for i in x], mh_per_acre_growth, width=bar_width,
alpha=0.6, color='purple', label='Man-hours per Acre Growth')
ax3.plot(dates, mh_per_acre_total, color='green', marker='^', linestyle='--',
label='Cumulative Man-hours per Total Acre')
ax3.set_ylabel('Efficiency Metrics')
ax3.spines['right'].set_position(('outward', 65))
# Legend
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
lines3, labels3 = ax3.get_legend_handles_labels()
ax1.legend(lines + lines2 + lines3, labels + labels2 + labels3, loc='upper left')
plt.tight_layout()
plt.show()
ZOOMED WAY IN:
import matplotlib.pyplot as plt
# Dates
dates = ["Aug 18", "Aug 19", "Aug 20", "Aug 21", "Aug 22", "Aug 23"]
# Reported fire size each day
acres = [17.5, 45, 54, 82, 90, 133]
# Personnel each day
personnel = [32, 32, 90, 129, 128, 111]
# Man-hours per day (8 hrs/worker)
man_hours_daily = [p*8 for p in personnel]
# Daily growth in acres (delta from previous day)
growth = [0] + [acres[i] - acres[i-1] for i in range(1, len(acres))]
# Efficiency metrics
acres_per_mh_growth = [growth[i]/man_hours_daily[i] if man_hours_daily[i] > 0 else 0 for i in range(len(acres))]
mh_per_acre_growth = [1/x if x > 0 else 0 for x in acres_per_mh_growth]
# Cumulative totals
cum_man_hours = []
total = 0
for mh in man_hours_daily:
total += mh
cum_man_hours.append(total)
mh_per_acre_total = [cum_man_hours[i]/acres[i] if acres[i] > 0 else 0 for i in range(len(acres))]
# ---------------------------
# Figure 1: Fire growth & context
# ---------------------------
fig1, ax1 = plt.subplots(figsize=(11,7))
# Fire size
ax1.plot(dates, acres, color='red', marker='o', label='Total Acres')
ax1.set_xlabel('Date')
ax1.set_ylabel('Acres', color='red')
ax1.tick_params(axis='y', labelcolor='red')
ax1.set_title('La Plata Fire: Size, Personnel, and Cumulative Efficiency')
# Personnel (2nd axis)
ax2 = ax1.twinx()
ax2.plot(dates, personnel, color='blue', marker='s', label='Personnel')
ax2.set_ylabel('Personnel', color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
# Cumulative efficiency (3rd axis)
ax3 = ax1.twinx()
ax3.plot(dates, mh_per_acre_total, color='green', marker='^', linestyle='--',
label='Cumulative Man-hours per Total Acre')
ax3.set_ylabel('Cumulative Man-hours per Acre')
ax3.spines['right'].set_position(('outward', 65))
# Legend
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
lines3, labels3 = ax3.get_legend_handles_labels()
ax1.legend(lines + lines2 + lines3, labels + labels2 + labels3, loc='upper left')
plt.tight_layout()
# ---------------------------
# Figure 2: Daily efficiency vs inefficiency
# ---------------------------
fig2, (ax4, ax5) = plt.subplots(1, 2, figsize=(13,6))
# Acres per man-hour (growth)
ax4.bar(dates, acres_per_mh_growth, color='orange', alpha=0.7)
ax4.set_title('Daily Acres per Man-hour (Growth-based)')
ax4.set_ylabel('Acres per Man-hour')
ax4.set_xlabel('Date')
# Man-hours per acre growth
ax5.bar(dates, mh_per_acre_growth, color='purple', alpha=0.7)
ax5.set_title('Daily Man-hours per Acre Growth')
ax5.set_ylabel('Man-hours per Acre')
ax5.set_xlabel('Date')
plt.tight_layout()
plt.show()
import matplotlib.pyplot as plt
# Dates
dates = ["Aug 18", "Aug 19", "Aug 20", "Aug 21", "Aug 22", "Aug 23"]
# Reported fire size each day
acres = [17.5, 45, 54, 82, 90, 133]
# Personnel each day
personnel = [32, 32, 90, 129, 128, 111]
# Man-hours per day (8 hrs/worker)
man_hours_daily = [p*8 for p in personnel]
# Daily growth in acres (delta from previous day)
growth = [0] + [acres[i] - acres[i-1] for i in range(1, len(acres))]
# Daily % growth relative to prior day's size
growth_pct = [0] + [100 * (growth[i] / acres[i-1]) if acres[i-1] > 0 else 0 for i in range(1, len(acres))]
# Efficiency metrics
acres_per_mh_growth = [growth[i]/man_hours_daily[i] if man_hours_daily[i] > 0 else 0 for i in range(len(acres))]
mh_per_acre_growth = [1/x if x > 0 else 0 for x in acres_per_mh_growth]
# Cumulative totals
cum_man_hours = []
total = 0
for mh in man_hours_daily:
total += mh
cum_man_hours.append(total)
mh_per_acre_total = [cum_man_hours[i]/acres[i] if acres[i] > 0 else 0 for i in range(len(acres))]
# ---------------------------
# Figure 1: Fire growth & context
# ---------------------------
fig1, ax1 = plt.subplots(figsize=(11,7))
# Fire size
ax1.plot(dates, acres, color='red', marker='o', label='Total Acres')
ax1.set_xlabel('Date')
ax1.set_ylabel('Acres', color='red')
ax1.tick_params(axis='y', labelcolor='red')
ax1.set_title('La Plata Fire: Size, Personnel, Growth %, and Cumulative Efficiency')
# Personnel (2nd axis)
ax2 = ax1.twinx()
ax2.plot(dates, personnel, color='blue', marker='s', label='Personnel')
ax2.set_ylabel('Personnel', color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
# Cumulative efficiency (3rd axis)
ax3 = ax1.twinx()
ax3.plot(dates, mh_per_acre_total, color='green', marker='^', linestyle='--',
label='Cumulative Man-hours per Total Acre')
ax3.set_ylabel('Cumulative Man-hours per Acre')
ax3.spines['right'].set_position(('outward', 65))
# Growth % (4th axis)
ax4 = ax1.twinx()
ax4.plot(dates, growth_pct, color='orange', marker='d', linestyle='--',
label='Daily Growth %')
ax4.set_ylabel('Daily Growth (%)', color='orange')
ax4.tick_params(axis='y', labelcolor='orange')
ax4.spines['right'].set_position(('outward', 130))
# Legend
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
lines3, labels3 = ax3.get_legend_handles_labels()
lines4, labels4 = ax4.get_legend_handles_labels()
ax1.legend(lines + lines2 + lines3 + lines4,
labels + labels2 + labels3 + labels4,
loc='upper left')
plt.tight_layout()
# ---------------------------
# Figure 2: Daily efficiency vs inefficiency
# ---------------------------
fig2, (ax5, ax6) = plt.subplots(1, 2, figsize=(13,6))
# Acres per man-hour (growth)
ax5.bar(dates, acres_per_mh_growth, color='orange', alpha=0.7)
ax5.set_title('Daily Acres per Man-hour (Growth-based)')
ax5.set_ylabel('Acres per Man-hour')
ax5.set_xlabel('Date')
# Man-hours per acre growth
ax6.bar(dates, mh_per_acre_growth, color='purple', alpha=0.7)
ax6.set_title('Daily Man-hours per Acre Growth')
ax6.set_ylabel('Man-hours per Acre')
ax6.set_xlabel('Date')
plt.tight_layout()
plt.show()
import matplotlib.pyplot as plt
# Dates
dates = ["Aug 18", "Aug 19", "Aug 20", "Aug 21", "Aug 22", "Aug 23"]
# Reported fire size each day
acres = [17.5, 45, 54, 82, 90, 133]
# Personnel each day
personnel = [32, 32, 90, 129, 128, 111]
# Containment % (reported = 0 all days)
containment = [0, 0, 0, 0, 0, 0]
# Man-hours per day (8 hrs/worker)
man_hours_daily = [p*8 for p in personnel]
# Daily growth in acres (delta from previous day)
growth = [0] + [acres[i] - acres[i-1] for i in range(1, len(acres))]
# Daily % growth relative to prior day's size
growth_pct = [0] + [100 * (growth[i] / acres[i-1]) if acres[i-1] > 0 else 0 for i in range(1, len(acres))]
# Efficiency metrics
acres_per_mh_growth = [growth[i]/man_hours_daily[i] if man_hours_daily[i] > 0 else 0 for i in range(len(acres))]
mh_per_acre_growth = [1/x if x > 0 else 0 for x in acres_per_mh_growth]
# Cumulative totals
cum_man_hours = []
total = 0
for mh in man_hours_daily:
total += mh
cum_man_hours.append(total)
mh_per_acre_total = [cum_man_hours[i]/acres[i] if acres[i] > 0 else 0 for i in range(len(acres))]
# ---------------------------
# Figure 1: Context & Totals
# ---------------------------
fig1, ax1 = plt.subplots(figsize=(12,8))
# Fire size
ax1.plot(dates, acres, color='red', marker='o', label='Total Acres')
ax1.set_xlabel('Date')
ax1.set_ylabel('Acres', color='red')
ax1.tick_params(axis='y', labelcolor='red')
ax1.set_title('La Plata Fire: Size, Personnel, Containment, and Total Man-hours')
# Personnel (2nd axis)
ax2 = ax1.twinx()
ax2.plot(dates, personnel, color='blue', marker='s', label='Personnel')
ax2.set_ylabel('Personnel', color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
# Cumulative efficiency (3rd axis)
ax3 = ax1.twinx()
ax3.plot(dates, mh_per_acre_total, color='green', marker='^', linestyle='--',
label='Cumulative Man-hours per Total Acre')
ax3.set_ylabel('Cumulative Man-hours per Acre')
ax3.spines['right'].set_position(('outward', 65))
# Growth % (4th axis)
ax4 = ax1.twinx()
ax4.plot(dates, growth_pct, color='orange', marker='d', linestyle='--',
label='Daily Growth %')
ax4.set_ylabel('Daily Growth (%)', color='orange')
ax4.tick_params(axis='y', labelcolor='orange')
ax4.spines['right'].set_position(('outward', 130))
# Net cumulative man-hours
ax1.plot(dates, cum_man_hours, color='brown', marker='x', linestyle='-', label='Cumulative Man-hours')
# Containment line
ax1.plot(dates, containment, color='black', linestyle=':', label='Containment %')
# Legend
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
lines3, labels3 = ax3.get_legend_handles_labels()
lines4, labels4 = ax4.get_legend_handles_labels()
ax1.legend(lines + lines2 + lines3 + lines4,
labels + labels2 + labels3 + labels4,
loc='upper left')
plt.tight_layout()
# ---------------------------
# Figure 2: Daily Efficiency
# ---------------------------
fig2, (ax5, ax6) = plt.subplots(1, 2, figsize=(13,6))
# Acres per man-hour (growth)
ax5.bar(dates, acres_per_mh_growth, color='orange', alpha=0.7)
ax5.set_title('Daily Acres per Man-hour (Growth-based)')
ax5.set_ylabel('Acres per Man-hour')
ax5.set_xlabel('Date')
# Man-hours per acre growth
ax6.bar(dates, mh_per_acre_growth, color='purple', alpha=0.7)
ax6.set_title('Daily Man-hours per Acre Growth')
ax6.set_ylabel('Man-hours per Acre')
ax6.set_xlabel('Date')
plt.tight_layout()
plt.show()
import matplotlib.pyplot as plt
# ---------------------------
# Reported Data
# ---------------------------
dates = ["Aug 18", "Aug 19", "Aug 20", "Aug 21", "Aug 22", "Aug 23"]
# Reported fire size each day
acres = [17.5, 45, 54, 82, 90, 133]
# Reported personnel each day
personnel = [32, 32, 90, 129, 128, 111]
# Reported containment (%)
containment = [0, 0, 0, 0, 0, 0]
# ---------------------------
# Derived Metrics
# ---------------------------
# Daily man-hours (8 hrs/worker/day)
man_hours_daily = [p * 8 for p in personnel]
# Daily growth in acres
growth = [0] + [acres[i] - acres[i - 1] for i in range(1, len(acres))]
# Daily % growth relative to prior day's size
growth_pct = [0] + [100 * (growth[i] / acres[i - 1]) if acres[i - 1] > 0 else 0
for i in range(1, len(acres))]
# Efficiency metrics
acres_per_mh_growth = [growth[i] / man_hours_daily[i] if man_hours_daily[i] > 0 else 0
for i in range(len(acres))]
mh_per_acre_growth = [1 / x if x > 0 else 0 for x in acres_per_mh_growth]
# Cumulative man-hours
cum_man_hours = []
total = 0
for mh in man_hours_daily:
total += mh
cum_man_hours.append(total)
# Cumulative efficiency (man-hours per acre)
mh_per_acre_total = [cum_man_hours[i] / acres[i] if acres[i] > 0 else 0
for i in range(len(acres))]
# ---------------------------
# Figure 1: Context & Totals
# ---------------------------
fig1, ax1 = plt.subplots(figsize=(12, 8))
# Fire size (acres, red)
ax1.plot(dates, acres, color='red', marker='o', label='Total Acres')
ax1.set_xlabel('Date')
ax1.set_ylabel('Acres', color='red')
ax1.tick_params(axis='y', labelcolor='red')
ax1.set_title('La Plata Fire: Size, Personnel, Containment, and Net Man-hours')
# Personnel (blue, 2nd axis)
ax2 = ax1.twinx()
ax2.plot(dates, personnel, color='blue', marker='s', label='Personnel')
ax2.set_ylabel('Personnel', color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
# Cumulative efficiency (green, 3rd axis)
ax3 = ax1.twinx()
ax3.plot(dates, mh_per_acre_total, color='green', marker='^', linestyle='--',
label='Cumulative Man-hours per Acre')
ax3.set_ylabel('Cumulative Man-hours per Acre')
ax3.spines['right'].set_position(('outward', 65))
# Growth % (orange, 4th axis)
ax4 = ax1.twinx()
ax4.plot(dates, growth_pct, color='orange', marker='d', linestyle='--',
label='Daily Growth %')
ax4.set_ylabel('Daily Growth (%)', color='orange')
ax4.tick_params(axis='y', labelcolor='orange')
ax4.spines['right'].set_position(('outward', 130))
# Net cumulative man-hours (brown shaded area instead of line)
ax1.fill_between(dates, cum_man_hours, color='brown', alpha=0.3,
label='Cumulative Man-hours (Shaded)')
# Containment (black dotted)
ax1.plot(dates, containment, color='black', linestyle=':', label='Containment %')
# Legend (merge all axes)
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
lines3, labels3 = ax3.get_legend_handles_labels()
lines4, labels4 = ax4.get_legend_handles_labels()
ax1.legend(lines + lines2 + lines3 + lines4,
labels + labels2 + labels3 + labels4,
loc='upper left')
plt.tight_layout()
# ---------------------------
# Figure 2: Daily Efficiency
# ---------------------------
fig2, (ax5, ax6) = plt.subplots(1, 2, figsize=(13, 6))
# Acres per man-hour (growth-based)
ax5.bar(dates, acres_per_mh_growth, color='orange', alpha=0.7)
ax5.set_title('Daily Acres per Man-hour (Growth-based)')
ax5.set_ylabel('Acres per Man-hour')
ax5.set_xlabel('Date')
# Man-hours per acre growth
ax6.bar(dates, mh_per_acre_growth, color='purple', alpha=0.7)
ax6.set_title('Daily Man-hours per Acre Growth')
ax6.set_ylabel('Man-hours per Acre')
ax6.set_xlabel('Date')
plt.tight_layout()
plt.show()
So now we have a standardized set of models which we can choose from to approach any given small fire similarly, with much if not all cross-compatibility with larger fires. Slight modifications are probably in order for larger fires not for lack of accuracy, but in order to portray in human-friendly format better given anticipated changing of scales e.g. our worker ‘dots’ beside the size of circles may be adapted to fit on the paper and portray scale pleasantly.
Daily Efficiency (Acres per Man-hour)
Remember your oaths.