<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 1A.1 - Tracer une pyramide bigarrée - correction
Cet exercice est inspirée de l'article 2015-04-07 Motif, optimisation, biodiversité. Il s'agit de dessiner un motif. Correction.
Step1:  Problème
Il s'agit de dessiner la pyramide suivante à l'aide de matplotlib.
Step2:  Idée de la solution
On sépare le problème en deux plus petits 
Step3:  Mais dans un premier temps, il faut un moyen de repérer chaque boule. On les numérote avec deux indices.
Step4:  Les coordonnées
On prend comme exemple scatter_demo.py sur le site de matplotlib.
Step5:  On inverse.
Step6:  On décale.
Step7:  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.
Step8:  La couleur
Je vous laisse retourner sur les deux premières images et observer la couleur de toutes les boules qui vérifient (i+j)%3 == 1.
<ASSISTANT_TASK:>
Python Code:
from jyquickhelper import add_notebook_menu
add_notebook_menu()
%matplotlib inline
Explanation: 1A.1 - Tracer une pyramide bigarrée - correction
Cet exercice est inspirée de l'article 2015-04-07 Motif, optimisation, biodiversité. Il s'agit de dessiner un motif. Correction.
End of explanation
from IPython.display import Image
Image("http://www.xavierdupre.fr/app/code_beatrix/helpsphinx/_images/biodiversite_tri2.png")
Explanation: Problème
Il s'agit de dessiner la pyramide suivante à l'aide de matplotlib.
End of explanation
from pyquickhelper.helpgen import NbImage
NbImage("data/hexa.png")
Explanation: Idée de la solution
On 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.
End of explanation
Image("http://www.xavierdupre.fr/app/code_beatrix/helpsphinx/_images/pyramide_num2.png")
Explanation: Mais dans un premier temps, il faut un moyen de repérer chaque boule. On les numérote avec deux indices.
End of explanation
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)
Explanation: Les coordonnées
On prend comme exemple scatter_demo.py sur le site de matplotlib.
End of explanation
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)
Explanation: On inverse.
End of explanation
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)
Explanation: On décale.
End of explanation
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)
Explanation: 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.
End of explanation
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)
Explanation: La couleur
Je vous laisse retourner sur les deux premières images et observer la couleur de toutes les boules qui vérifient (i+j)%3 == 1.
End of explanation
<END_TASK>