<jupyter_start><jupyter_text>1A.1 - Tracer une pyramide bigarrée - correctionCet exercice est inspirée de l'article [2015-04-07 Motif, optimisation, biodiversité](http://lesenfantscodaient.fr//blog/2015/2015-04-07_optimisation_et_biodiversite.html). Il s'agit de dessiner un motif. *Correction*.<jupyter_code>from jyquickhelper import add_notebook_menu
add_notebook_menu()
%matplotlib inline<jupyter_output><empty_output><jupyter_text>ProblèmeIl s'agit de dessiner la pyramide suivante à l'aide de [matplotlib](https://matplotlib.org/).<jupyter_code>from IPython.display import Image
Image("http://lesenfantscodaient.fr/_images/biodiversite_tri2.png")<jupyter_output><empty_output><jupyter_text>Idée de la solutionOn sépare le problème en deux plus petits : * Trouver la position des boules dans un repère cartésien.* Choisir la bonne couleur.Le repère est hexagonal. L'image suivante est tirée de la page wikipédia [empilement compact](https://fr.wikipedia.org/wiki/Empilement_compact).<jupyter_code>from pyquickhelper.helpgen import NbImage
NbImage("data/hexa.png")<jupyter_output><empty_output><jupyter_text>Mais dans un premier temps, il faut un moyen de repérer chaque boule. On les numérote avec deux indices.<jupyter_code>Image("http://lesenfantscodaient.fr/_images/pyramide_num2.png")<jupyter_output><empty_output><jupyter_text>Les coordonnéesOn prend comme exemple [scatter_demo.py](https://matplotlib.org/examples/shapes_and_collections/scatter_demo.html) sur le site de matplotlib.<jupyter_code>import matplotlib.pyplot as plt

fig, ax = plt.subplots(1,1)
n = 10
x = []
y = []
for i in range(1,n+1):
    for j in range(i, n+1):
        x.append(i)
        y.append(j)
size = [300 for c in x]
colors = ["r" for c in x]
ax.scatter(x, y, s=size, c=colors, alpha=0.5)<jupyter_output><empty_output><jupyter_text>On inverse.<jupyter_code>fig, ax = plt.subplots(1,1)
n = 10
x = []
y = []
for i in range(1,n+1):
    for j in range(i, n+1):
        x.append(i)
        y.append(-j)
size = [300 for c in x]
colors = ["r" for c in x]
ax.scatter(x, y, s=size, c=colors, alpha=0.5)<jupyter_output><empty_output><jupyter_text>On décale.<jupyter_code>fig, ax = plt.subplots(1,1)
n = 10
x = []
y = []
for i in range(1,n+1):
    for j in range(i, n+1):
        x.append(i - j*0.5)
        y.append(-j)
size = [300 for c in x]
colors = ["r" for c in x]
ax.scatter(x, y, s=size, c=colors, alpha=0.5)<jupyter_output><empty_output><jupyter_text>Cela ressemble à de l'hexagonal mais ce n'est pas encore tout à fait cela. La hauteur d'un triangle équilatéral de côté un est $\frac{\sqrt{3}}{2}$. Ca tombe bien car dans l'exemple précédente, le côté de chaque triangle est 1. Et on change la dimension du graphe tracé avec *matplotlib* pour éviter de réduire nos effort à néant.<jupyter_code>fig, ax = plt.subplots(1,1, figsize=(4, 4*(3**0.5)/2))
n = 10
x = []
y = []
for i in range(1,n+1):
    for j in range(i, n+1):
        x.append(i - j*0.5)
        y.append(-j*(3**0.5)/2)
size = [300 for c in x]
colors = ["r" for c in x]
ax.scatter(x, y, s=size, c=colors, alpha=0.5)<jupyter_output><empty_output><jupyter_text>La couleurJe vous laisse retourner sur les deux premières images et observer la couleur de toutes les boules qui vérifient ``(i+j)%3 == 1``.<jupyter_code>fig, ax = plt.subplots(1,1, figsize=(4, 4*(3**0.5)/2))
n = 10
x = []
y = []
colors = []
trois = "rgb"
for i in range(1,n+1):
    for j in range(i, n+1):
        x.append(i - j*0.5)
        y.append(-j*(3**0.5)/2)
        colors.append(trois[(i+j) % 3])
size = [300 for c in x]
ax.scatter(x, y, s=size, c=colors, alpha=0.5)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14400443090556633, 'fraction_numerical': 0.0321240653558571, 'mean_word_length': 4.626168224299065, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 37, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '156249', 'license': 'MIT', 'n_tokens_mistral': 1502, 'n_tokens_neox': 1457, 'n_words': 368, 'path': '_doc/notebooks/td1a/td1a_pyramide_bigarree_correction.ipynb', 'repo_name': 'Jerome-maker/ensae_teaching_cs', 'size': '3611'}