tasks = ["Sentence", "/ɑ/", "/i/", "/u/"]
# Table 2 of Toles & Murton (2025): mean (SD), dB. Order: breathy, typical, pressed.
data = {
"Women (n = 36)": {
"Breathy": [(9.0, 5.5), (12.8, 4.4), (14.2, 6.1), (11.5, 4.6)],
"Typical": [(2.7, 3.9), (8.5, 3.6), (13.3, 5.4), (9.4, 5.5)],
"Pressed": [(0.8, 3.5), (5.3, 3.1), (8.9, 6.4), (4.5, 6.0)],
},
"Men (n = 14)": {
"Breathy": [(6.4, 3.1), (9.1, 4.1), (7.7, 5.5), (7.4, 3.9)],
"Typical": [(1.6, 2.6), (4.9, 3.1), (0.1, 3.6), (0.4, 3.5)],
"Pressed": [(-0.2, 2.2), (4.0, 2.6), (1.0, 5.6), (-0.7, 3.4)],
},
}
style = {"Breathy": (vs.BLUE, "o", -0.18),
"Typical": (vs.INK, "s", 0.0),
"Pressed": (vs.ORANGE, "D", 0.18)}
fig, axes = plt.subplots(1, 2, figsize=(7.4, 3.5), sharey=True)
x = np.arange(len(tasks))
for ax, (panel, groups) in zip(axes, data.items()):
for cond, rows in groups.items():
c, m, dx = style[cond]
mu = np.array([r[0] for r in rows]); sd = np.array([r[1] for r in rows])
ax.errorbar(x + dx, mu, yerr=sd, fmt=m, ms=5, color=c, ecolor=c,
elinewidth=1.0, capsize=2.5, markeredgecolor="white",
markeredgewidth=0.6, zorder=3)
ax.axhline(0, color=vs.MUTED, lw=0.8, zorder=1)
ax.set_xticks(x, tasks)
ax.set_xlim(-0.5, len(tasks) - 0.5)
ax.set_title(panel)
vs.style_axes(ax)
axes[0].set_ylabel("H1–H2 [dB]")
handles = [Line2D([], [], marker=style[k][1], ls="", ms=5, color=style[k][0],
label=k) for k in ("Breathy", "Typical", "Pressed")]
fig.legend(handles=handles, loc="lower center", ncol=3, frameon=False,
fontsize=8, bbox_to_anchor=(0.5, -0.02))
fig.tight_layout(rect=(0, 0.06, 1, 1))