nj_grp = df[df['NJ'] == 1]
pa_grp = df[df['NJ'] == 0]
nj_before = nj_grp['EMPTOT'].mean()
nj_after = nj_grp['EMPTOT2'].mean()
pa_before = pa_grp['EMPTOT'].mean()
pa_after = pa_grp['EMPTOT2'].mean()
pa_change = pa_after - pa_before
nj_counter_after = nj_before + pa_change
did_est = nj_after - nj_counter_after
fig, ax = plt.subplots(figsize=(7, 5))
fig.patch.set_facecolor('#1a1a2e')
ax.set_facecolor('#1a1a2e')
text_color = '#e0e0e0'
grid_color = '#3a3a5e'
waves = [0, 1]
wave_labels = ['Wave 1\n(Feb–Mar 1992)', 'Wave 2\n(Nov–Dec 1992)']
ax.plot(waves, [pa_before, pa_after], 'o-', color='#ef476f',
linewidth=2.5, markersize=8, label='Pennsylvania (control)')
ax.plot(waves, [nj_before, nj_after], 's-', color='#06d6a0',
linewidth=2.5, markersize=8, label='New Jersey (treated)')
ax.plot(waves, [nj_before, nj_counter_after], 's--', color='#06d6a0',
alpha=0.45, linewidth=2, markersize=8, label='NJ counterfactual (no policy)')
ax.annotate('', xy=(1 + 0.03, nj_after), xytext=(1 + 0.03, nj_counter_after),
arrowprops=dict(arrowstyle='<->', color='#ffd166', lw=2))
ax.text(1.07, (nj_after + nj_counter_after) / 2,
f'DiD ≈ +{did_est:.1f} FTE', color='#ffd166', fontsize=10, va='center')
for x, y, lbl in [
(0, pa_before, f'{pa_before:.1f}'),
(1, pa_after, f'{pa_after:.1f}'),
(0, nj_before, f'{nj_before:.1f}'),
(1, nj_after, f'{nj_after:.1f}'),
]:
ax.text(x + (0.04 if x == 0 else -0.06), y + 0.35, lbl,
color=text_color, fontsize=9, ha='left' if x == 0 else 'right')
ax.set_xlim(-0.25, 1.4)
ax.set_ylim(18, 26)
ax.set_xticks(waves)
ax.set_xticklabels(wave_labels, color=text_color)
ax.set_ylabel('Average FTE Employment', color=text_color)
ax.tick_params(colors=text_color)
for spine in ax.spines.values():
spine.set_edgecolor(grid_color)
ax.yaxis.set_major_formatter(mticker.FormatStrFormatter('%.0f'))
ax.grid(axis='y', color=grid_color, linewidth=0.7, linestyle='--')
ax.axvline(x=0.5, color='#ffd166', linestyle=':', linewidth=1.2, alpha=0.6)
ax.text(0.5, 25.5, 'NJ minimum wage\nincreased to $5.05', color='#ffd166',
fontsize=8.5, ha='center', alpha=0.85)
ax.legend(facecolor='#2a2a4e', edgecolor=grid_color, labelcolor=text_color,
loc='lower left', fontsize=9)
ax.set_title('Difference-in-Differences:\nFTE Employment Around NJ Minimum Wage Increase',
color=text_color, fontsize=11)
plt.tight_layout()
plt.show()