Page 1 sur 1

module complémentaire ce_chart

Message non luPosté: 16 Juil 2020, 21:41
de Fabien59
Bonjour,
J'aimerai utiliser le module complémentaire ce_chart pour tracer un histogramme comme, par exemple, celui obtenu à l'aide du code python suivant :

Code: Tout sélectionner
import matplotlib.pyplot as plt
V=[24.97,24.96,24.87,24.94,24.98,24.87,24.96,24.98,24.92,24.96,24.98,24.97,24.95,24.98,24.99,24.89,24.88,24.93,24.95,24.95]
plt.hist(V,bins=5,range=(min(V),max(V)),color='r',edgecolor = 'b')
plt.ylabel('Fréquence')
plt.show()


Je ne sais pas comment faire.
Merci
Fabien

Re: module complémentaire ce_chart

Message non luPosté: 16 Juil 2020, 22:37
de critor
Bonsoir.

ce_chart ne prend pas directement de liste de données brutes.
Il faut réduire cela à des couples étiquette-effectif ou étiquette-fréquence.

Voici une première fonction pour réduire à des couples étiquette-effectif :
Code: Tout sélectionner
def liste_brute2effectifs(lbrut):
  lbrut.sort()
  leff = []
  val, nbr = lbrut[0], 0
  for v in lbrut:
    if v == val: nbr += 1
    else:
      leff.append((str(val), nbr))
      val, nbr = v, 1
  if nbr: leff.append((str(val), nbr))
  return leff


En théorie, voici maintenant un script pour tracer l'histogramme de ces données réduites :
Code: Tout sélectionner
from ce_chart import *

def liste_brute2effectifs(lbrut):
  lbrut.sort()
  leff = []
  val, nbr = lbrut[0], 0
  for v in lbrut:
    if v == val: nbr += 1
    else:
      leff.append((str(val), nbr))
      val, nbr = v, 1
  if nbr: leff.append((str(val), nbr))
  return leff

V = [24.97,24.96,24.87,24.94,24.98,24.87,24.96,24.98,24.92,24.96,24.98,24.97,24.95,24.98,24.99,24.89,24.88,24.93,24.95,24.95]
V = liste_brute2effectifs(V)
cht = chart()
cht.data(V)
cht.title('Fréquence')
cht.show()


En pratique toutefois, ça ne marche pas. ce_chart n'est à mon sens qu'un gadget très limité. Sauf erreur de ma part, il ne permet pas de tracer d'histogramme nécessitant plus de 8 barres, et ici il en faudrait 11.

Bref, il faut une autre fonction de réduction des données brutes pour les regrouper selon 5 classes comme le demande ton code initial, et là ça marchera. :)

Re: module complémentaire ce_chart

Message non luPosté: 16 Juil 2020, 23:03
de critor
Voilà, un peu de progrès, j'arrive à t'obtenir ça, et voici de quoi comparer :
Image
Code: Tout sélectionner
from ce_chart import *

n_classes = 5
n_decimales = 2

def nbr2str(n):
  return str(round(n, n_decimales))

def liste_brute2classes(lbrut, n):
  lbrut.sort()
  lclass = []
  vmin, vmax = lbrut[0], lbrut[len(lbrut) - 1]
  k = 1
  vcmin, vcmax = vmin, vmin + (vmax - vmin) * k / n
  nbr = 0
  for v in lbrut:
    if v > vmin + (vmax - vmin) * k / n:
      lclass.append(('>'+nbr2str(vcmin), nbr))
      k += 1
      vcmin, vcmax, nbr = vcmax, vmin + (vmax - vmin) * k / n, 0
    else:
      nbr += 1
  if nbr: lclass.append(('>'+nbr2str(vcmin), nbr))
  return lclass

V = [24.97,24.96,24.87,24.94,24.98,24.87,24.96,24.98,24.92,24.96,24.98,24.97,24.95,24.98,24.99,24.89,24.88,24.93,24.95,24.95]
V = liste_brute2classes(V, n_classes)
cht = chart()
cht.data(V)
cht.title('Fréquences')
cht.show()

Re: module complémentaire ce_chart

Message non luPosté: 17 Juil 2020, 09:46
de Fabien59
Bonjour,
Je suis impressionné :~o .
Impressionné tout d'abord par votre réactivité et par votre persévérance à me proposer une solution satisfaisante. Merci beaucoup.
Ensuite, impressionné par la complexité du script nécessaire au regard de celui écrit avec matplotlib.
J'avoue que ma motivation à utiliser, avec mes élèves, la partie python de la TI pour effectuer le tracé des histogrammes est remis en cause. C'est si simple à partir des listes.... mais moins coloré :) .
Néanmoins, on peut envisager d'importer le script permettant d'utiliser la fonction liste_brute2classes() et donc d'avoir un script aussi léger que celui écrit avec matplotlib.

Si, avec le module ce_chart, Texas Instrument veut répondre aux exigences des nouveaux programmes du lycée, il doit améliorer ce module pour qu'il prenne directement des listes de données brutes. Est-ce la raison pour laquelle ce module n'est pas proposé par défaut avec le système d'exploitation ?
Cette critique se veut constructive, car je reconnais le formidable travail fait avec les nouveaux modules comme ti_system ou ti_plotlib qui ouvrent de réelles perspectives dans l'utilisation de la calculatrice en classe.

Encore merci

Bonne journée
Fabien

Re: module complémentaire ce_chart

Message non luPosté: 17 Juil 2020, 10:13
de critor
Merci également pour ton retour.

Si l'on souhaite utiliser ce_chart en classe afin que les élèves puissent chacun afficher et exploiter leurs histogrammes de façon indépendante sans besoin de les amener devant un ordinateur, il faut apparemment faire attention à avoir des données taillées sur-mesure pour éviter de franchir les diverses limitations de ce_chart.

Il y a toujours une autre solution si on estime que les fonctions ce_chart.chart() et compagnie sont trop limitées, c'est d'importer l'environnement graphique ti_plotlib pour avoir donc un repère orthogonal, et de coder soi-même une fonction traçant des histogrammes, a priori une boucle remplissant des rectangles.
Et pour le remplissage du rectangle à chaque itération de la boucle, on peut faire appel au choix à ti_graphics.fillRect(...) ou ce_chart.rectangle(...).

Sinon, il faut choisir une autre plateforme :
  • pour rester chez Texas Instruments, il y a les TI-Nspire CX II, qui devraient disposer d'une mise à jour avec Python en septembre 2020, et je doute qu'elle soit aussi limitée puisque c'est ici du haut de gamme - voir par ici : viewtopic.php?f=43&t=23827
  • ou sinon, pour rester sur du milieu de gamme il faut passer à la concurrence : Casio Graph 35+E II, Casio Graph 90+E ou NumWorks, qui ont une véritable implémentation de matplotlib.pyplot visant à la différence à respecter le standard - voir les exemples de tracés comparatifs par ici : viewtopic.php?t=24039&p=254443#E144PYMPLC
Bon courage. :)

Re: module complémentaire ce_chart

Message non luPosté: 18 Juil 2020, 13:19
de Bisam
Est-ce que "ce_chart" accepte des dictionnaires comme entrée ? Ce serait bien plus simple de regrouper les données...