In A/B tests or regression results, showing confidence intervals along with point estimates makes conclusions more persuasive. Interval dot plots are clean and easy to read.
import numpy as np
import matplotlib.pyplot as plt
segments = ["Free", "Light", "Standard", "Premium"]
effect = np.array([0.12, 0.18, 0.27, 0.35])
low = effect - np.array([0.05, 0.06, 0.07, 0.08])
high = effect + np.array([0.05, 0.06, 0.07, 0.09])
fig, ax = plt.subplots(figsize=(6.4, 3.6))
ax.hlines(range(len(segments)), low, high, color="#94a3b8", linewidth=3)
ax.scatter(effect, range(len(segments)), color="#0ea5e9", s=90, zorder=3)
ax.axvline(0, color="#475569", linestyle="--", linewidth=1)
ax.set_yticks(range(len(segments)), labels=segments)
ax.set_xlabel("Lift vs control")
ax.set_title("Estimated effects with 90% confidence intervals")
ax.set_xlim(-0.05, 0.45)
ax.grid(axis="x", alpha=0.2)
for idx, (eff, lo, hi) in enumerate(zip(effect, low, high)):
ax.text(hi + 0.01, idx, f"{eff*100:.1f}% (+{(hi - eff)*100:.1f}/-{(eff - lo)*100:.1f})", va="center")
fig.tight_layout()
plt.show()

Reading tips #
- The length of the horizontal line shows uncertainty; shorter lines mean more stable estimates.
- Use the zero line to judge whether effects cross 0 at a glance.
- Vary dot size to represent weight or sample size if needed.