Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
more
  • Loading branch information
josephsalmon committed Dec 14, 2020
1 parent b4317c3 commit fa89ee5
Showing 1 changed file with 357 additions and 0 deletions.
357 changes: 357 additions & 0 deletions Widgets/Densite_echantillons.ipynb
@@ -0,0 +1,357 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# HLMA 408: Lois gaussiennes et visualisation interactive\n",
"\n",
"***\n",
"> __Auteur__: Joseph Salmon <joseph.salmon@umontpellier.fr>\n",
"\n",
"Inspiré des codes :\n",
"- https://medium.com/kapernikov/ipywidgets-with-matplotlib-93646718eb84\n",
"- https://medium.com/@jdchipox/how-to-interact-with-jupyter-33a98686f24e"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# pip install download # si besoin, décommenter et exécuter cette cellule."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# pip install 'ipywidgets==7.5'"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from scipy.stats import norm, laplace, t, f, expon, beta, cauchy\n",
"import ipywidgets\n",
"import seaborn as sns"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib widget"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"distributions_dict = {'Gaussienne': norm,\n",
" 'Laplace': laplace,\n",
" 'Exponentielle': expon,\n",
" 'Cauchy': cauchy,\n",
" }\n",
"# plus d'exemples ici: https://docs.scipy.org/doc/scipy/reference/stats.html"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## Visualisation : densités et tirages aléatoires"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def make_box_layout():\n",
" return ipywidgets.Layout(\n",
" border='solid 1px black',\n",
" margin='0px 10px 10px 0px',\n",
" padding='5px 5px 5px 5px'\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "250e4daad58d4080931fc310a5bf5c0a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Sines(children=(VBox(children=(IntSlider(value=30, description='Nb tirages', max=500, min=1), FloatSlider(valu…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"class Sines(ipywidgets.HBox):\n",
"\n",
" def __init__(self):\n",
" super().__init__()\n",
" output = ipywidgets.Output()\n",
" self.n_samples = 30\n",
" self.ranges = (-5, 5) # Borne d'observation\n",
" \n",
" self.x = np.linspace(self.ranges[0], self.ranges[1], num=400)\n",
" self.mu, self.sigma = 0, 1\n",
" self.distribution = distributions_dict['Gaussienne']\n",
" self.samples = self.distribution.rvs(\n",
" size=self.n_samples, loc=self.mu, scale=self.sigma)\n",
" self.size = 3\n",
" self.initial_color = '#3646E3'\n",
" self.jitter = 0.04\n",
" self.params = dict(jitter=self.jitter, size=self.size,\n",
" color=self.initial_color, alpha=0.70)\n",
"\n",
" with output:\n",
" self.fig, self.ax = plt.subplots(2, 1, sharex=True,\n",
" constrained_layout=True, figsize=(4, 4))\n",
" self.line, = self.ax[0].plot(self.x,\n",
" self.distribution.pdf(\n",
" self.x, loc=self.mu, scale=self.sigma),\n",
" self.initial_color)\n",
" \n",
" \n",
" self.fig.canvas.set_window_title('My title')\n",
" self.ax[0].set_xlabel('Densité')\n",
" self.ax[0].set_xlim(self.ranges[0], self.ranges[1])\n",
" self.ax[0].set_ylim(0, 0.6)\n",
" \n",
" self.ax[1].set_xlabel('Tirage')\n",
" self.ax[1].set_xlim(self.ranges[0], self.ranges[1])\n",
" self.ax[1].axes.get_yaxis().set_visible(False)\n",
"\n",
" self.points = sns.stripplot(\n",
" x=self.samples, ax=self.ax[1], **self.params)\n",
" self.fig.canvas.toolbar_position = 'bottom'\n",
"\n",
" # define widgets\n",
"\n",
" n_samples_slider = ipywidgets.IntSlider(\n",
" value=self.n_samples, min=1, max=500, step=1, description=\"Nb tirages\")\n",
" mu_slider = ipywidgets.FloatSlider(\n",
" value=0, min=-2, max=2, step=0.1, description='$\\mu$')\n",
" sigma_slider = ipywidgets.FloatSlider(\n",
" value=1, min=1.1, max=5, step=0.1, description='$\\sigma$')\n",
" color_picker = ipywidgets.ColorPicker(\n",
" value=self.initial_color,\n",
" description='Couleur')\n",
" jitter_slider = ipywidgets.FloatSlider(\n",
" value=self.jitter, min=0.005, max=0.3, step=0.005, description='jitter')\n",
" text_distribution = ipywidgets.Dropdown(\n",
" options=list(distributions_dict),\n",
" value='Gaussienne',\n",
" description='Distribution')\n",
" int_range_slider = ipywidgets.FloatRangeSlider(\n",
" value=(-5, 5),\n",
" min=-5, max=5, step=0.1,\n",
" description=\"Amplitude\")\n",
"\n",
" controls = ipywidgets.VBox([\n",
" n_samples_slider,\n",
" mu_slider,\n",
" sigma_slider,\n",
" text_distribution,\n",
" color_picker,\n",
" int_range_slider,\n",
" jitter_slider\n",
" ])\n",
"\n",
" controls.layout = make_box_layout()\n",
"\n",
" out_box = ipywidgets.Box([output])\n",
" output.layout = make_box_layout()\n",
"\n",
" # Observe stuff\n",
" n_samples_slider.observe(self.update_n_samples, 'value')\n",
" mu_slider.observe(self.update_mu, 'value')\n",
" sigma_slider.observe(self.update_sigma, 'value')\n",
" color_picker.observe(self.line_color, 'value')\n",
" text_distribution.observe(self.update_text_distribution, 'value')\n",
" int_range_slider.observe(self.update_range_slider, 'value')\n",
" jitter_slider.observe(self.update_jitter_slider, 'value')\n",
"\n",
" # Add to children\n",
" self.children = [controls, output]\n",
"\n",
" def update_mu(self, change):\n",
" \"\"\"Draw line in plot.\"\"\"\n",
" self.mu = change.new\n",
" self.samples = self.distribution.rvs(\n",
" size=self.n_samples, loc=self.mu, scale=self.sigma)\n",
" self.line.set_ydata(self.distribution.pdf(self.x, loc=self.mu, scale=self.sigma))\n",
" self.ax[1].clear() # <-- clear axes\n",
" self.points = sns.stripplot(\n",
" x=self.samples, ax=self.ax[1], **self.params)\n",
" self.ax[1].set_xlabel('Tirage')\n",
" self.fig.canvas.draw()\n",
"\n",
" def update_sigma(self, change):\n",
" \"\"\"Draw line in plot.\"\"\"\n",
" self.sigma = change.new\n",
" self.samples = self.distribution.rvs(\n",
" size=self.n_samples, loc=self.mu, scale=self.sigma)\n",
" self.line.set_ydata(self.distribution.pdf(\n",
" self.x, loc=self.mu, scale=self.sigma))\n",
" self.ax[1].clear() # <-- clear axes\n",
" self.points = sns.stripplot(\n",
" x=self.samples, ax=self.ax[1], size=self.size, color=self.initial_color)\n",
" self.ax[1].set_xlim(self.ranges)\n",
" self.ax[1].set_xlabel('Tirage')\n",
"# self.fig.canvas.draw()\n",
"\n",
" def update_n_samples(self, change):\n",
" \"\"\"Draw.\"\"\"\n",
" self.n_samples = change.new\n",
" self.samples = self.distribution.rvs(\n",
" size=self.n_samples, loc=self.mu, scale=self.sigma)\n",
" self.ax[1].clear() # <-- clear axes\n",
" np.random.seed(123)\n",
" self.points = sns.stripplot(\n",
" x=self.samples, ax=self.ax[1], **self.params)\n",
" self.ax[1].set_xlim(self.ranges)\n",
" self.ax[1].set_xlabel('Tirage')\n",
"# self.fig.canvas.draw()\n",
"\n",
" def update_jitter_slider(self, change):\n",
" self.params['jitter'] = change.new\n",
" self.ax[1].clear() # <-- clear axes\n",
" self.points = sns.stripplot(\n",
" x=self.samples, ax=self.ax[1], **self.params)\n",
" self.ax[1].set_xlabel('Tirage')\n",
"\n",
" def line_color(self, change):\n",
" self.initial_color = change.new\n",
" self.line.set_color(self.initial_color)\n",
" self.ax[1].set_color(self.initial_color)\n",
"\n",
" def update_range_slider(self, change):\n",
" self.ranges = change.new\n",
" self.line.set_ydata(self.distribution.pdf(\n",
" self.x, loc=self.mu, scale=self.sigma))\n",
" self.ax[0].set_xlim(self.ranges)\n",
" self.ax[1].clear() # <-- clear axes\n",
" np.random.seed(123)\n",
" self.points = sns.stripplot(\n",
" x=self.samples, ax=self.ax[1], size=self.size, color=self.initial_color)\n",
" self.ax[1].set_xlabel('Tirage')\n",
"\n",
" def update_text_distribution(self, change):\n",
" self.distribution = distributions_dict[change.new]\n",
" self.line.set_ydata(self.distribution.pdf(\n",
" self.x, loc=self.mu, scale=self.sigma))\n",
"\n",
" self.samples = self.distribution.rvs(\n",
" size=self.n_samples, loc=self.mu, scale=self.sigma)\n",
" self.ax[0].set_xlim(self.ranges)\n",
" self.ax[1].clear() # <-- clear axes\n",
" np.random.seed(123)\n",
" self.points = sns.stripplot(\n",
" x=self.samples, ax=self.ax[1], size=self.size, color=self.initial_color)\n",
" self.ax[1].set_xlim(self.ranges)\n",
" self.ax[1].set_xlabel('Tirage')\n",
" self.fig.canvas.draw()\n",
"\n",
"\n",
"Sines()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"hide_input": false,
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": false,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
}
},
"nbformat": 4,
"nbformat_minor": 2
}

0 comments on commit fa89ee5

Please sign in to comment.