teaching:progappchim:plot_sinus_cosinus

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Prochaine révisionLes deux révisions suivantes
teaching:progappchim:plot_sinus_cosinus [2015/03/24 14:11] villersdteaching:progappchim:plot_sinus_cosinus [2016/03/01 11:03] – [Fixer le texte des graduations] villersd
Ligne 131: Ligne 131:
 plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi]) plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
 plt.yticks([-1, 0, +1]) plt.yticks([-1, 0, +1])
 +...
 +</sxh>
 +
 +===== Fixer le texte des graduations =====
 +  * Documentation à consulter :
 +    * [[http://matplotlib.sourceforge.net/users/index_text.html|Working with text]]
 +    * [[http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.xticks|xticks() command]]
 +    * [[http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.yticks|yticks() command]]
 +    * [[http://matplotlib.sourceforge.net/api/axes_api.html?#matplotlib.axes.Axes.set_xticklabels|set_xticklabels()]]
 +    * [[http://matplotlib.sourceforge.net/api/axes_api.html?#matplotlib.axes.Axes.set_yticklabels|set_yticklabels()]]
 +
 +Les graduations sont adéquates, mais leur écriture (3.142,...) n'est pas très explicite. on préférerait lire π au lieu de 3.142. La solution consiste à fournir en plus des graduations une seconde liste reprenant les textes correspondants à écrire. Notez qu'on utilise [[http://fr.wikipedia.org/wiki/LaTeX|LaTeX]] et sa syntaxe pour une représentation de qualité :
 +
 +<sxh python; title : 06-setting_tick_labels.py>
 +...
 +plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
 +          [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
 +plt.yticks([-1, 0, +1],
 +          [r'$-1$', r'$0$', r'$+1$'])
 +...
 +</sxh>
 +
 +<note tip>Les chaînes de caractères incluant du code LaTeX pour les formules mathématiques doivent être préfixées par la lettre "r" afin que leur interprétation des caractères "backslach" soit utilisée comme code LaTeX et pas comme des codes d'échappement de chaînes de caractères en Python. //Cf.// la [[https://docs.python.org/2/reference/lexical_analysis.html#string-literals|documentation]].</note>
 +===== Déplacer les lignes de délimitation (spines) =====
 +  * Documentation à consulter :
 +    * [[http://matplotlib.sourceforge.net/api/spines_api.html#matplotlib.spines|Spines]]
 +    * [[http://matplotlib.sourceforge.net/users/artists.html#axis-container|Axis container]]
 +    * [[http://matplotlib.sourceforge.net/users/transforms_tutorial.html|Transformations tutorial]]
 +
 +Les lignes de délimitations verticales et horizontales (spines) sont les lignes qui connectent les graduations sur les axes et délimitent les limites de la surface visualisant les données du graphique. Ces lignes peuvent être placées arbitrairement et jusqu'à présent elles délimitaient une "boîte" aux limites des axes. Nous voudrions les déplacer et juste conserver deux lignes en plein milieu du graphique. Puisqu'il y avait quatre lignes, on va éliminer la visualisation des lignes supérieures et de droite en fixant la couleur à une valeur "nulle", et on va placer les lignes "du bas" et "de gauche" aux coordonnées zéro :
 +
 +<sxh python; title : 07-moving_spines.py>
 +...
 +ax = plt.gca()  # gca stands for 'get current axis'
 +ax.spines['right'].set_color('none')
 +ax.spines['top'].set_color('none')
 +ax.xaxis.set_ticks_position('bottom')
 +ax.spines['bottom'].set_position(('data',0))
 +ax.yaxis.set_ticks_position('left')
 +ax.spines['left'].set_position(('data',0))
 +...
 +</sxh>
 +
 +===== Ajouter une légende =====
 +  * Documentation à consulter :
 +    * [[http://matplotlib.sourceforge.net/users/legend_guide.html|Legend guide]]
 +    * [[http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.legend|legend() command]]
 +    * [[http://matplotlib.sourceforge.net/api/legend_api.html#matplotlib.legend.Legend|Legend API]]
 +
 +Ajoutons une légende dans le coin supérieur gauche. Cela nécessite juste d'ajouter des couples "clé/valeur" à la commande "plot", pour lesquelles la clé est "label", et la valeur corresponde la fonction (sinus ou cosinus) qui sera affichée dans le cadre de la légende :
 +
 +
 +<sxh python; title : 08-adding_a_legend.py>
 +...
 +plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-", label="cosinus")
 +plt.plot(X, S, color="red",  linewidth=2.5, linestyle="-", label="sinus")
 +
 +plt.legend(loc='upper left')
 +...
 +</sxh>
 +
 +===== Annoter certains points =====
 +  * Documentation à consulter :
 +    * [[http://matplotlib.sourceforge.net/users/annotations_guide.html|Annotating axis]]
 +    * [[http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.annotate|annotate() command]]
 +
 +Annotons quelques points particuliers en utilisant la commande "annotate". On choisit l'abscisse 2π/3 et on veut annoter à la fois le cosinus et le sinus. On va dans les deux cas dessiner une ligne en pointillé, marquer le point par un symbole (rond par défaut) de taille 50 en unité de [[http://en.wikipedia.org/wiki/Point_%28typography%29|points typographiques]], et en utilisant la commande "annotate" pour afficher un texte accompagné d'une flèche.
 +
 +<sxh python; title : 09-annotate_some_points.py>
 +...
 +t = 2 * np.pi / 3
 +plt.plot([t, t], [0, np.cos(t)], color='blue', linewidth=2.5, linestyle="--")
 +plt.scatter([t, ], [np.cos(t), ], 50, color='blue')
 +plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',
 +            xy=(t, np.cos(t)), xycoords='data',
 +            xytext=(-90, -50), textcoords='offset points', fontsize=16,
 +            arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
 +
 +plt.plot([t, t],[0, np.sin(t)], color='red', linewidth=2.5, linestyle="--")
 +plt.scatter([t, ],[np.sin(t), ], 50, color='red')
 +plt.annotate(r'$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
 +            xy=(t, np.sin(t)), xycoords='data',
 +            xytext=(+10, +30), textcoords='offset points', fontsize=16,
 +            arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
 +...
 +</sxh>
 +
 +===== Le diable est dans les détails* =====
 +*Attribué à Nietzsche
 +
 +  * Documentation à consulter :
 +    * [[http://matplotlib.sourceforge.net/api/artist_api.html|Artists]]
 +    * [[http://matplotlib.sourceforge.net/api/artist_api.html#matplotlib.text.Text.set_bbox|BBox]]
 +
 +Les textes des graduations sont à présent difficilement lisibles à cause des lignes bleue et rouge. On peut les écrire avec une taille supérieure et on peut aussi ajuster leurs propriétés de telle sorte qu'ils soient rendus que un fond blanc semi-transparent (transparence définie par alpha). Cela nous permet de voir correctement à la fois les données et les textes des graduations.
 +
 +<sxh python; title : 10-devil_is_in_the_details.py>
 +...
 +for label in ax.get_xticklabels() + ax.get_yticklabels():
 +    label.set_fontsize(16)
 +    label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65))
 ... ...
 </sxh> </sxh>
  
  • teaching/progappchim/plot_sinus_cosinus.txt
  • Dernière modification : 2021/02/23 15:33
  • de villersd