Update workflow configuration and replace Altair with Matplotlib for signal visualizations

This commit is contained in:
Edgar P. Burkhart 2025-02-27 17:32:53 +01:00
parent 6cc2200683
commit 0503034e40
Signed by: edpibu
GPG key ID: 9833D3C5A25BD227
6 changed files with 115 additions and 61 deletions

View file

@ -9,12 +9,12 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4
- name: Initialize virtual environment
run: /usr/bin/python -m venv .env
run: /usr/bin/python -m venv .venv
- name: Install dependencies
run: ./.env/bin/pip install mystmd jupyter jupyterlab_myst ipykernel altair pandas
run: ./.venv/bin/pip install -r requirements.txt
- name: Build static HTML
run: |
. .env/bin/activate
. .venv/bin/activate
myst build --execute --html
- name: Copy files
run: |

View file

@ -60,7 +60,7 @@ Une thermistance (@thermistance) ou une jauge de déformation (@jauge) sont des
capteurs analogiques.
::::{figure}
:label: analogique
:label: cap_analogique
:::{figure} https://upload.wikimedia.org/wikipedia/commons/3/3b/NTC_bead.jpg
:label: thermistance

View file

@ -32,32 +32,26 @@ et un niveau **bas** ("Low").
:label: logique
```{code-cell} python
:tags: [remove-input]
import altair as alt
import matplotlib.pyplot as plt
from matplotlib import ticker
import numpy as np
import pandas as pd
rng = np.random.default_rng(25)
n = 16
t = np.arange(n+1)
s = rng.choice([0, 1], n+1)
s[-1] = s[-2]
data = pd.DataFrame({
"t": t,
"s": s,
})
alt.Chart(
data
).mark_line(
interpolate="step-after",
strokeWidth=3,
).encode(
alt.X("t:Q").axis(title="Temps (s)").scale(domain=(0,n)),
alt.Y("s:Q", axis=alt.Axis(title="Signal logique", values=[0, 1], format=".0f")).scale(domain=(0,1)),
).properties(
width="container",
height=100,
s = rng.choice([0, 1], n)
fig, ax = plt.subplots()
ax.stairs(s, t, lw=3)
ax.set(
xlim=(0, n),
ylim=(-.5, 1.5),
xlabel="Temps (s)",
ylabel="Signal logique",
)
ax.yaxis.set_major_locator(ticker.MultipleLocator(1))
ax.xaxis.set_major_locator(ticker.MultipleLocator(1))
```
Exemple de signal logique
````
@ -77,35 +71,38 @@ Un exemple de signal analogique est donné en @analogique.
:label: analogique
```{code-cell} python
:tags: [remove-input]
import altair as alt
import matplotlib.pyplot as plt
from matplotlib import ticker
import numpy as np
import pandas as pd
from scipy.interpolate import CubicSpline
from scipy.stats import qmc
rng = np.random.default_rng(25)
n = 20
t_max = 16
t = np.linspace(0, t_max, n)
t_base = np.linspace(0, t_max, n)
lhs = (qmc.LatinHypercube(d=n-2, rng=rng).random(1)[0] - .5) * t_max/n
t = t_base + np.concatenate(([0], lhs, [0]))
t = t_base
s = 5 * rng.random(n)
s[-1] = s[-2]
data = pd.DataFrame({
"t": t,
"s": s,
})
alt.Chart(
data
).mark_line(
interpolate="basis",
strokeWidth=3,
).encode(
alt.X("t:Q").axis(title="Temps (s)").scale(domain=(0,t_max)),
alt.Y("s:Q", axis=alt.Axis(title="Signal analogique")).scale(domain=(0,5)),
).properties(
width="container",
height=200,
t_interp = np.linspace(0, t_max, 1024)
s_interp = np.clip(CubicSpline(t, s)(t_interp), 0, 5)
fig, ax = plt.subplots()
ax.plot(t_interp, s_interp, lw=3)
ax.set(
xlim=(0, t_max),
ylim=(-.5, 5.5),
xlabel="Temps (s)",
ylabel="Signal analogique",
)
ax.yaxis.set_major_locator(ticker.MultipleLocator(1))
ax.xaxis.set_major_locator(ticker.MultipleLocator(1))
```
Exemple de signal analogique
````
@ -119,32 +116,38 @@ Un exemple de signal analogique est donné en @numerique.
:label: numerique
```{code-cell} python
:tags: [remove-input]
import altair as alt
import matplotlib.pyplot as plt
from matplotlib import ticker
import numpy as np
import pandas as pd
rng = np.random.default_rng(25)
n = 16
t = np.arange(n+1)
s = rng.integers(0, 16, n+1)
s[-1] = s[-2]
data = pd.DataFrame({
"t": t,
"s": s,
})
alt.Chart(
data
).mark_line(
interpolate="step-after",
strokeWidth=3,
).encode(
alt.X("t:Q").axis(title="Temps (s)").scale(domain=(0,n)),
alt.Y("s:Q", axis=alt.Axis(title="Signal numérique", values=np.arange(0, 16))).scale(domain=(0,15)),
).properties(
width="container",
height=200,
s = rng.integers(0, 16, n)
fig, ax = plt.subplots()
ax.stairs(s, t, lw=3)
ax.set(
xlim=(0, n),
ylim=(-.5, 16.5),
xlabel="Temps (s)",
ylabel="Signal numérique",
)
ax.yaxis.set_major_locator(ticker.MultipleLocator(1))
ax.xaxis.set_major_locator(ticker.MultipleLocator(1))
# alt.Chart(
# data
# ).mark_line(
# interpolate="step-after",
# strokeWidth=3,
# ).encode(
# alt.X("t:Q").axis(title="Temps (s)").scale(domain=(0,n)),
# alt.Y("s:Q", axis=alt.Axis(title="Signal numérique", values=np.arange(0, 16))).# scale(domain=(0,15)),
# ).properties(
# width="container",
# height=200,
# )
```
Exemple de signal numérique
````

1
cours/SIN/matplotlibrc Symbolic link
View file

@ -0,0 +1 @@
../../matplotlibrc

43
matplotlibrc Normal file
View file

@ -0,0 +1,43 @@
lines.linewidth: 3
font.family: Fira Code
image.cmap: inferno
axes.linewidth: 1
axes.grid: True
axes.grid.which: major
axes.titlelocation: right
axes.titleweight: 700
axes.axisbelow: True
axes.prop_cycle: cycler(color=["#4269d0","#efb118","#ff725c","#6cc5b0","#3ca951","#ff8ab7","#a463f2","#97bbf5","#9c6b4e","#9498a0"])
axes.formatter.use_locale: True
grid.color: "#bebebe"
grid.linewidth: 1
grid.alpha: 1
hatch.linewidth: 8
hatch.color: "#00000013"
boxplot.showmeans: true
boxplot.meanprops.markeredgecolor: "k"
boxplot.meanprops.marker: "+"
boxplot.flierprops.markerfacecolor: C0
boxplot.medianprops.color: C0
figure.figsize: 8, 4.5
figure.dpi: 96
figure.constrained_layout.use: True
xtick.direction: in
xtick.major.size: 4
xtick.minor.size: 2
ytick.direction: in
ytick.major.size: 4
ytick.minor.size: 2
savefig.format: pdf

7
requirements.txt Normal file
View file

@ -0,0 +1,7 @@
mystmd
jupyter-server
ipykernel
matplotlib
numpy
pandas
scipy