I am fitting a Gaussian process based on the second plot shown here and draw samples from it. However, the drawn samples do not resemble the fitted function and generally looks very different from the predicted mean (specifically, they are not as smooth and have sharp changes) and don't go through (or close) to the given data points (red dots in the plot).
Example plot (black line is predicted mean, blue and orange lines are the samples):

After many runs, the result is always similar (even if not exactly the same). Any ideas what causes that and how I can make the drawn samples more similar to the mean?
The code used for generating the plot is
import numpy as np
from matplotlib import pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, WhiteKernel as White
rng = np.random.RandomState(0)
X = rng.uniform(0, 5, 20)[:, np.newaxis]
y = 0.5 * np.sin(3 * X[:, 0]) + rng.normal(0, 0.5, X.shape[0])
kernel = 1.0 * RBF(length_scale=1.0, length_scale_bounds=(1e-2, 1e3)) \
+ White(noise_level=1e-5, noise_level_bounds=(1e-10, 1e+1))
gp = GaussianProcessRegressor(kernel=kernel, alpha=0.0)
gp.fit(X, y)
X_ = np.linspace(0, 5, 100)
y_mean, y_cov = gp.predict(X_[:, np.newaxis], return_cov=True)
plt.figure(figsize=(14,7))
plt.plot(X_, y_mean, 'k', lw=3, zorder=9)
plt.fill_between(X_, y_mean - np.sqrt(np.diag(y_cov)),
y_mean + np.sqrt(np.diag(y_cov)),
alpha=0.5, color='k')
plt.scatter(X[:, 0], y, c='r', s=50, zorder=10, edgecolors=(0, 0, 0))
plt.title("Initial: %s\nOptimum: %s\nLog-Marginal-Likelihood: %s"
% (kernel, gp.kernel_, gp.log_marginal_likelihood(gp.kernel_.theta)))
y_samples = gp.sample_y(X_.reshape(-1, 1), 2)
plt.plot(X_, y_samples, lw=2)
plt.tight_layout()


What we should expect from a sample given by gp.sample_y ?