Assume that there are two zero coupon bond with maturities $N_1$ and $N_2$ with prices $P_1 = \frac{CF_1}{(1+y)^N_1}$$P_1 = \frac{CF_1}{(1+y)^{N_1}}$ and $P_2 = \frac{CF_2}{(1+y)^N_2}$$P_2 = \frac{CF_2}{(1+y)^{N_2}}$ respectively. If we construct a bond portfolio by purchaing one each of the two ZCB, the price of the portfolio is $P=P_1+P_2$. Now, the convexity of the portfolio is
$\begin{align} {Convexity}_p &= -\frac{d^2P}{dy^2}\cdot\frac{1}{P} \\ &=\frac{1}{(1+y)^2}\left[\frac{CF_1}{(1+y)^{N_1}}N_1(N_1+1)+\frac{CF_2}{(1+y)^{N_2}}N_2(N_2+1)\right]\cdot\frac{1}{P} \\ &=\frac{1}{(1+y)^2}\left[\frac{P_1}{P}N_1(N_1+1)+\frac{P_2}{P}N_2(N_2+1)\right] \end{align}$.
Notice that $\frac{P_1}{P}+\frac{P_2}{P}=1$
Now, plot convexity against maturity ($N$),
We may see that the convexity of the barbell portfolio (in blue line) is above the convexity of the bullet portfolio (in black line).