Afficher les valeurs extrêmes de plusieurs courbes

Vous avez créé un tutoriel, postez-le ici

Modérateurs : jturlier, Météo Villarzel

Répondre
Avatar du membre
PascalWMR
Messages : 323
Enregistré le : 16 févr. 2014, 09:28
Localisation : CONFLANS EN JARNISY (F54800)
Contact :

Afficher les valeurs extrêmes de plusieurs courbes

Message par PascalWMR » 31 mai 2015, 19:00

Avez-vous déjà essayer d'afficher à l'aide d'un bouton, les valeurs extrêmes de plusieurs courbes d'un graphique et de surcroit lorsque ces courbes sont de type "areaspline" comme dans ce graphique Le vent des dernières 48 heures. :?:

Hé ben, avec la méthode Highcharts décrite ici, ça marche pas :cry:

Pourquoi :?:
  • 1: Lorsqu'il y a plusieurs courbes sur un même graphique, seul le plus grand maxi des courbes est pris.
  • 2: Également, seul le plus petit mini des courbes est pris.
  • 3: Lorsque la courbe est de type "areaspline", si le maxi est bon, la valeur du mini est toujours 0 :?
Pourtant, dans ce graphique Le vent des dernières 48 heures, ça marche. Zoomez sur une zone ou les vents sont supérieurs à zéro et cliquez sur le bouton "Afficher les extrêmes sur la plage sélectionnée" pour vous en convaincre.
Mais alors, comment qu-c'est-y qui fait :!: :!: :!:

Rien de plus simple en apparence, il faut ruser et dupliquer les yAxis et les series[] :lol: . Cependant, pour que subterfuge fonctionne, il faut prendre quelques précautions pour ne pas voir le double des courbes et des yAxis. C'est ce que je vais expliquer dans ce tuto.

Dans ce tuto, je fait volontairement abstraction du code pour la connexion à la BDD, l'extraction des données, l'encodage en json, etc..., Pierre-André l'a très bien fait dans sont tuto Tutoriel MySQL - Highcharts.

Le tuto suivant prend en exemple, ce graphique Le vent des dernières 48 heures.

Dans un premier temps, il vous faut un petit script que j'ai trouver sur le net pour mettre en forme les nombres du résultat.

Code : Tout sélectionner

// Copyright (c) 2003 cnx.claude

function ValideNombre(Objet) {
	//var checkOK = "0123456789-.+";
  	var checkStr = Objet.value;
  	var allValid = true;
  	//var validGroups = true;
  	//var decPoints = 0;
  	//var allNum = "";
  	  	
  	//élimine les espaces Mise en forme préparatoire
  	modele= / /g;
  	checkStr=checkStr.replace(modele,"");//remplace les espaces par rien donc élimine les espaces
  	Objet.value=checkStr;
  	
  	//recherche + et - vérifie si c'est bien la première position
  	modele= /[+-]/;
  	retour1=modele.test(checkStr);
  	if (retour1) {
  		//retour =vrai donc + ou - ont été touvé
  		longueur=checkStr.length;
  		chaine=checkStr.substring(1, longueur);
  		retour2=modele.test(chaine);
  		if (retour2) allValid=false;// une deuxième occurence a été trouvée
  	}
  	
  	//recherche le point décimal et vérifie l'absence d'autre point décimal dans la chaine
  	modele=/[.]/;
  	position1=checkStr.search(modele);
  	if (position1) {
  		longueur=checkStr.length;
  		chaine=checkStr.substring(position1+1, longueur);
  		//alert(chaine);
  		retour2=modele.test(chaine);
  		//alert(retour2);
  		if (retour2) allValid=false;// une deuxième occurence a été trouvée
  	}
  	
  	//recherche un caractère qui soit différent de + - 0-9 et .
  	modele= /[^+-.\d]/;
  	retour=modele.test(checkStr);
  	if (retour) allValid=false; //un autre caractère a été trouvé!
  	
	if (!allValid) {
    	alert("Ne tapez que  chiffre/caractères (allvalid) dans le champ " + Objet.name );
    	return (false);
    }

    return (true);
}



function formatNombre(nombre, nombreDecimale) {
	//Met en forme le nombre
	C=Math.pow(10, nombreDecimale);
	nombre=(Math.round(nombre*C)/C);
	nombre=nombre+"";

	//document.write(nombre + "<br>");

	longueurNombre=nombre.length;

	//recherche du nombre derrière la virgule (décimale)
	placePointDecimal=nombre.indexOf(".",0);
	(placePointDecimal==-1)?decimale="." : decimale=nombre.substring(placePointDecimal, longueurNombre);
	longueurDecimale=decimale.length;
	while (longueurDecimale<=nombreDecimale) {
		decimale=decimale + "0";
		longueurDecimale=decimale.length;
	}
	if (nombreDecimale==0) decimale="";

	(placePointDecimal==-1)?entier=nombre : entier=nombre.substring(0, placePointDecimal);
	longueurEntier=entier.length;
	chaine="";
	i=1;
	while (longueurEntier>0) {
		Position1=longueurEntier-3;
		if (Position1<0) Position1=0;
		Position2=longueurEntier;
		sousChaine=entier.substring(Position1, Position2);
		(chaine=="")?chaine=sousChaine: chaine=sousChaine+ " " +chaine;
	
		entier=entier.substring(0, Position1);
		longueurEntier=longueurEntier-3;
		i++;
	}
	nombreFormate=entier+chaine;

	nombreFormate=nombreFormate+decimale;
	
	/* voilà l'affichage est correct et paramètrable en nombre de décimale
	toutefois le résultat obtenu est une chaine de caractère et non pas un nombre
	pour retourner à nouveau un nombre utiliser la fonction retourneNombre()
	*/
	
	return nombreFormate;
}

function formatNombreFormulaire(Objet, nombreDecimale) {
	//utilisable avec un formulaire
	
	OK=ValideNombre(Objet);//vérifie que Objet est un nombre
	if (OK==true) {
		nombre=Objet.value;
		nombreFormate=formatNombre(nombre, nombreDecimale);
	
	
		/* voilà l'affichage est correct et paramètrable en nombre de décimale
		toutefois le résultat obtenu est une chaine de caractère et non pas un nombre
		pour retourner à nouveau un nombre utiliser la fonction retourneNombre()
		*/
	
		Objet.value= nombreFormate;
	}
	else {
		//Objet.value="";
		Objet.focus();
	}
}



function retourneNombre(nombreFormate) {
	//pour retrouver le nombre arrondi aux décimales près faire:
	tableau = nombreFormate.split(" "); //tableau = chaine.split(" ") 
	longueurTableau=tableau.length; //donne la dimension du tableau
	
	newNombre="";
	for (i=0 ; i<longueurTableau; i++) {
		newNombre=newNombre + tableau[i];
	}
	newNombre=newNombre*1;//voilà c'est un nombre!
	
	return newNombre;
}

function firstUpperCase(chaine) {
	//retourne la chaine avec sa première lettre en majuscule
	position=0;// premier caractère position 0
	premiereLettre= chaine.charAt(position);//isole le premier caractère
	premiereLettre=premiereLettre.toUpperCase();//met en majuscule le premier caractère
	//alert(premiereLettre);
	position1=1;
	position2=chaine.length;
	souschaine=chaine.substring(position1, position2);
	//alert(souschaine);
	chaine= premiereLettre + souschaine;
	return chaine;
}

function firstUpperCaseForm(Objet) {
	//retourne la chaine avec sa première lettre en majuscule pour formulaire
	chaine=Objet.value;
	chaine=firstUpperCase(chaine);
	Objet.value=chaine;
}

Sauvegardez-le dans le répertoire de votre choix, sous le nom de formatNombre.js

Appelez ce script avec cette ligne entre les balises <head> et </head> de votre code html

Code : Tout sélectionner

<script type="text/javascript" src="../Scripts/formatNombre.js"></script>
Pensez à changer le chemin d'accès au fichier dans src

Toujours entre les balises <head> et </head> de votre code html ou dans votre fichier de style CSS si vous en avez un, ajouter ce code qui mettra en forme le résultat.

Code : Tout sélectionner

</style>
<style type="text/css">
.extreme_maxi {
	font-family: "Comic Sans MS", cursive;
	font-size: 14px;
	font-weight: bolder;
	text-align: left;
	color: #FF0000;
}
.extreme_mini {
	font-family: "Comic Sans MS", cursive;
	font-size: 14px;
	font-weight: bolder;
	text-align: left;
	color: #0000FF;
}
</style>
Ensuite, nous allons dupliquer l'yAxis de la vitesse des vents.
Voici le code de cet yAxis dans l'exemple. Il porte le numero 0

Code : Tout sélectionner

{ // 1er yAxis (numero 0 axe vitesse du vent)
				gridLineWidth: 1,
				opposite: false,
				lineColor: '#990033',
				lineWidth: 2,
				tickColor: '#990033',
            	tickWidth: 2,
				min: 0,
				labels: {
					y: 3,
					formatter: function() {
						return this.value +' km/h';
					},
					style: {
						color: '#990033'
					}
				},
				title: {
					text: 'Vitesse (km/h)',
					style: {
						color: '#990033'
					}
				},
			},
Nous allons le dupliquer 2 fois car nous avons 2 courbes dont nous voulons obtenir les extrêmes. Les rafales et la vitesse du vent.
Ils portent respectivement les numéros 2 et 3. Ceci est important pour la suite
Ils portent les numéros 2 et 3 car dans mon exemple, l'yAxis 1 est celui de la direction des vents.
Voici le code que je vais expliquez après.

Code : Tout sélectionner

		{ // répétition de l'yAxis 0 pour affichage getExtremes rafale (numero 2)
				gridLineWidth: 0,
				lineWidth: 0,
				tickWidth: 0,
				linkedTo: 0,
				labels: {
					enabled: false,
					},
				title: {
					enabled: false
					},
			},
			{ // répétition de l'yAxis 0 pour affichage getExtremes vitesse (numero 3)
				gridLineWidth: 0,
				lineWidth: 0,
				tickWidth: 0,
				linkedTo: 0,
				labels: {
					enabled: false,
					},
				title: {
					enabled: false
					},
			},
Seuls, les paramètres ci-dessus sont nécessaires. Dans l'exemple cité ici, il ne doit pas y en avoir d'autre.

Explications.
Les paramètres gridLineWidth, lineWidth, tickWidth, ont tous pour valeur 0.
Ceci permet d'avoir un yAxis qui existe et que l'on peut utiliser mais qui est totalement invisible.
L'affichage des paramètres labels et title est désactivé grace à la valeur enabled: false

Nous avons enfin un paramètre important. C'est le paramètre linkedTo. Celui-ci permet de lier l'yAxis à un autre afin que, lors d'un zoom par exemple, les échelles restent les mêmes et que les courbes continues à se chevaucher afin de rester invisibles.
Ici, ce paramètre a la valeur 0. Les deux yAxis dupliqués, sont donc liés à l'yAxis de la vitesse du vent.

Dans d'autres cas comme dans ce graphique, La pluviométrie des 31 derniers jours, les paramètres min, top, height, et offset, peuvent être nécessaire.

Maintenant, nous allons dupliquer les séries dont nous voulons les extrêmes afin de les afficher respectivement sur les yAxis que nous avons dupliqués.
Important
Le code de chaque série dupliquée, doit être immédiatement avant le code de la série à dupliquer. Ceci afin que la courbe de la série dupliquée, qui elle est visible, soit masquée par la série que l'on duplique.
Voici le code de la série rafale de vent de l'exemple.

Code : Tout sélectionner

			{ // chart.serie[0] : duplication des données rafales pour affichage getExtremes sur yAxis 2
				name: 'Rafale-2',
				color: '#0080C0',
				yAxis: 2,
				type: 'spline',
				showInLegend: false,
				enableMouseTracking: false,
				data: comArr(windgust),
				},
				{ // chart.serie[1] Rafale de vent
				name: 'Rafale de vent',
				yAxis: 0,
				type: 'areaspline',
				color: '#0080C0',
				fillColor: {
					linearGradient: [0, 0, 0, 240],
					stops: [
						[0, 'rgba(112, 112, 112, .8)'],
						[1, 'rgba(0, 204 , 255, .3)']
					]
				},
				events: {
					legendItemClick: function () {
						var chart = $('#container').highcharts(),
							visibility = this.visible ? 'visible' : 'hidden';
						if (visibility == "visible") {
							chart.series[0].setVisible(false,true);
							}
						else {
							chart.series[0].setVisible(true,true);
							}
						},	
					},
				data: comArr(windgust),
				},
			},
.

Explications des paramètres de la série dupliquée :
  • name: 'Rafale-2', : On peut donner n'importe quel nom, ça n'a aucune importance.
  • color: '#0080C0', : Ce paramètre doit avoir la même valeur que celui de la série qui est dupliquée.
  • yAxis: 2, : On attribue ici le numéro d'un yAxis que l'on a dupliqué.
  • type: 'spline', : Impératif, le type doit être line ou spline. La méthode getExtremes ne fonctionne qu'avec ces types de graphique.
  • showInLegend: false, : La valeur doit être false afin que la courbe n'apparaisse pas dans la légende.
  • enableMouseTracking: false, : Ce paramètre doit avoir la valeur false. Ceci empêche l'affichage de la valeur de la courbe dans le tooltip lors du survol du graphique par la souris.
  • data: comArr(windgust), : Enfin la valeur du paramètre data doit être la même que celui de la série à dupliquer.
.

Explications des paramètres de la série qui est dupliquée :
On retrouve tous les paramètres habituels. Pour ma part, le type "areaspline" me plait bien (affaire de gout).
Cependant, notez l’existence d'un paramètre que l'on ne croise pas souvent. Le paramètre events.
Le code de celui-ci, va permettre de masquer la courbe de la série dupliquée en même temps que la courbe de la série originale lorsque l'on cliquera sur l'Item de la légende de la série originale ;) .
Sans cela, lorsque, dans la légende, l'on clique sur l'item de la série originale, les données de celle-ci sont masquées mais la courbe dupliquée, elle, reste visible. :(
  • Dans un premier temps, l'on teste la visibilité de la série avec ce code :visibility = this.visible ? 'visible' : 'hidden';
  • Ensuite, dans une boucle if - else, à l'aide de la commande chart.series[0].setVisible(false,true); l'on masque la série dupliquée ou chart.series[0].setVisible(true,true); l'on affiche la série dupliquée.
    1. chart.series[x] : x doit avoir le numéro de la série à afficher ou a masquer.
    2. setVisible(y,z);: y doit avoir la valeur false pour masquer et true pour afficher. z doit avoir la valeur true pour retracer le graphique lorsque l'on clique sur l'item de la série dans la légende.
      Pour plus d'info, voir http://api.highcharts.com/highstock#Series.setVisible
Voici le code de la série vitesse du vent.

Code : Tout sélectionner

			{ // chart.serie[2] : duplication des données vitesses pour affichage getExtremes sur yAxis 3
				name: 'Vent-2',
				color: '#33CC66',
				yAxis: 3,
				type: 'spline',
				showInLegend: false,
				enableMouseTracking: false,
				data: comArr(windspeed),
				},
				{ // chart.serie[3] Vitesse du vent
				name: 'Vitesse du vent',
				yAxis: 0,
				type: 'areaspline',
				color: '#33CC66',
				fillColor: {
					linearGradient: [0, 0, 0, 240],
					stops: [
						[0, 'rgba(128, 128, 128, .9)'],
						[1, 'rgba(255, 255, 204, .7)']
					]
				},
				events: {
					legendItemClick: function () {
						var chart = $('#container').highcharts(),
							visibility = this.visible ? 'visible' : 'hidden';
						if (visibility == "visible") {
							chart.series[2].setVisible(false,true);
							}
						else {
							chart.series[2].setVisible(true,true);
							}
						},	
					},
				data: comArr(windspeed),
				},
Vous remarquerez que la valeur de yAxis de la série dupliquée Vent-2 est 3 alors que la série originale s'affiche toujour sur l'yAxis 0.
Remarquez également la valeur de chart.series[]. Elle a la valeur du numéro de la série duplique Vent-2.

Maintenant, nous allons voir le code qui est exécuté lorsque l'on clique sur le bouton.
Celui-ci doit être placé juste avant les }); de fermeture du code $(function () {var chart;
Le voici, les explications sont en dessous.

Code : Tout sélectionner

	// the button getExtrèmes action
    $('#button').click(function()
		{
			var Rafaleextremes = chart.yAxis[2].getExtremes(), Ventextremes = chart.yAxis[3].getExtremes()
        $('#report').html(
            '<span class="extreme_maxi" >'+ 'Vitesse maxi des rafales: '+ formatNombre(Rafaleextremes.dataMax,1) +' Km/h - ' + 
            '<span class="extreme_mini">'+'Vitesse mini des rafales: '+ formatNombre(Rafaleextremes.dataMin,1) +' Km/h ' + '<br>' +
            '<span class="extreme_maxi" >'+ 'Vitesse maxi du vent: '+ formatNombre(Ventextremes.dataMax,1) +' Km/h - '+ 
            '<span class="extreme_mini">'+'Vitesse mini du vent: '+ formatNombre(Ventextremes.dataMin,1) +' Km/h '
        )
    });
  • On défini deux variables Rafaleextremes et Ventextremes dont on obtient les valeurs extrêmes affichée sur la courbe avec la fonction
  • chart.yAxis[x].getExtremes(). La valeur de x doit être le numéro de l'yAxis dupliqué sur lequel est tracé la courbe dupliquée. Simple. ;) Non.
  • Ensuite, l'on affiche 2 <span> de classe extreme_maxi et extreme_mini (classe définie dans le style css)
    1. On met une légende Vitesse maxi des rafales et Vitesse mini des rafales
    2. Pour obtenir la valeur maxi, l'on se sert de la fonction Variable.dataMax
    3. Pour obtenir la valeur mini, l'on se sert de la fonction Variable.dataMin
    4. On met en forme la valeur des mini maxi obtenu à l'aide du fichier javascript formatNombre.js
      La syntaxe de formatNombre est
      • formatNombre(
      • la variable à mettre en forme Variable.dataMax
      • suivie d'une virgule ,
      • suivie d'un chiffre indiquant le nombre de chiffres après la virgule.
      • fermé par un parenthèse ).
    5. On met enfin l'unité de mesure des données. +' Km/h '
Et enfin,
pour afficher tout cela, dans le body de votre code html, après la div <div id="container" style="width: 1060px; height: 570px; margin: 0"></div><br> qui sert à l'affichage du graphique,
on créer un bouton
<button id="button">Afficher les extrêmes sur la plage selectionnée</button><br>
qui lorsqu'on cliquera dessus, affichera les valeurs minimales et maximales des données actuellement affichées sur la courbe dans une div dont l'id est report
<div id="report"></div>

Voila voili
That all folks :D :D :D

NB :pour avoir le code complet, faites un clic droit sur mon graphique puis Code source de la page.

Pascal
Modifié en dernier par PascalWMR le 20 nov. 2021, 10:43, modifié 5 fois.
Station VP2Plus, Windows 10 64 bits,WeatherLink 6.0.5, VP2SQL, Graphiques Dynamiques à partir d'une BDD MySQL
Météo Conflans-en-Jarnisy
Image

alain
Messages : 101
Enregistré le : 21 nov. 2014, 20:23

Re: Afficher les valeurs extrêmes de plusieurs courbes

Message par alain » 31 mai 2015, 21:53

bonjour
WAOOH
tu es bon dis donc :D
non seulement tes pages sont très agréable, les couleurs me plaisent. Mais en plus tes pages sont vraiment bien finit. Quel soucis du détail
BRAVO
station Orégon WMR 200
logiciel Xnet version 2012-03-17a et Graphweather V 3.0.15
windows XP SP3 sur vieux portable destiné a la météo
Windows7 sur mon portable, permet de tester les applications qui ne veulent plus de XP
http://mapetitemeteo.esy.es/

Avatar du membre
Météo Villarzel
Administrateur du site
Messages : 524
Enregistré le : 06 févr. 2014, 09:48
Contact :

Re: Afficher les valeurs extrêmes de plusieurs courbes

Message par Météo Villarzel » 01 juin 2015, 20:46

Salut Pascal,

Alors là, je ne sais pas ou tu es allé chercher ça, mais chapeau bas.
J'utilisais la méthode highcharts, mais effectivement avec plusieurs courbes, il fallait désactiver les courbes une par une pour afficher le min/max de la valeur choisie.

Je vais tester ça au plus vite.

Merci beaucoup pour le tuto très complet, good job :!:

A+
Station Vantage Pro2+ avec station agricole - Weatherlink - GraphWeather 3.0.15b - Cumulus 1.9.4 - Windows 7/64
Graphique dynamique à partir d'une bd MySql - VP2SQL

Image

muchistic
Messages : 142
Enregistré le : 17 févr. 2014, 20:20
Localisation : Canejan (33)
Contact :

Re: Afficher les valeurs extrêmes de plusieurs courbes

Message par muchistic » 17 nov. 2021, 14:48

Bonjour à tous,

Je profite de la saison où l'on est un peu moins occupé dehors pour refaire mon site et du même coup modifier certains graphiques. J'ai déjà fais ce graphique ici : https://mobile.meteo-canejan.fr/graphiq ... -jour.php et j'essai maintenant de le faire sur celui ci : https://mobile.meteo-canejan.fr/graphiq ... i-mini.php .

Tout fonctionne bien mais j'aurais voulus savoir si il y avait une solution pas trop compliqué pour que les valeurs extrêmes qui s'affichent sous le graphique en cliquant sur le bouton, s'affiche par défaut SANS appuyer sur le bouton.

un peu comme sur le graphique de Pascal : https://www.monsite-meteo.eu/PC/G-HS-Temperatures.php

Dominique
https://www.meteo-canejan.fr/

ma config : VP2sql , Weaterlink 6.03 , NOAAtable, minimaxibis (sonde agricole), Windows 10 .

Avatar du membre
PascalWMR
Messages : 323
Enregistré le : 16 févr. 2014, 09:28
Localisation : CONFLANS EN JARNISY (F54800)
Contact :

Re: Afficher les valeurs extrêmes de plusieurs courbes

Message par PascalWMR » 17 nov. 2021, 18:36

Salut à tous

C'est pas compliqué à faire.
Il faut utiliser les fonctions getextremes avec les événements event des xAxis, yAxis et on load.

J'expliquerai tout ça ce Week-end quand je serai rentré

A+
Pascal
Station VP2Plus, Windows 10 64 bits,WeatherLink 6.0.5, VP2SQL, Graphiques Dynamiques à partir d'une BDD MySQL
Météo Conflans-en-Jarnisy
Image

muchistic
Messages : 142
Enregistré le : 17 févr. 2014, 20:20
Localisation : Canejan (33)
Contact :

Re: Afficher les valeurs extrêmes de plusieurs courbes

Message par muchistic » 18 nov. 2021, 07:49

PascalWMR a écrit :
17 nov. 2021, 18:36
Salut à tous

C'est pas compliqué à faire.
Il faut utiliser les fonctions getextremes avec les événements event des xAxis, yAxis et on load.

J'expliquerai tout ça ce Week-end quand je serai rentré

A+
Pascal
bonjour à tous,

Merci Pascal, impatient de connaître ces explications. J'ai regardé "event" sur api.highcharts et c'est pas évident.
bonne journée
Dominique
https://www.meteo-canejan.fr/

ma config : VP2sql , Weaterlink 6.03 , NOAAtable, minimaxibis (sonde agricole), Windows 10 .

Avatar du membre
PascalWMR
Messages : 323
Enregistré le : 16 févr. 2014, 09:28
Localisation : CONFLANS EN JARNISY (F54800)
Contact :

Re: Afficher les valeurs extrêmes de plusieurs courbes

Message par PascalWMR » 20 nov. 2021, 15:07

Salut à tous

Voila, je viens donner les explications promises.

Pour afficher les extrêmes automatiquement et sans bouton, c'est pas bien compliqué.
Au lieu d’exécuter une fonction en cliquant sur un bouton, on va la faire s’exécuter automatiquement
  1. Au chargement initial du graphique,
  2. Lors du redimensionnement par zoom de l'xAxis (l'axe du temps),
  3. Lors du redimensionnement par zoom de l'yAxis
Il faut bien sur utiliser les dernières librairies Highcharts.
En effet, dans ces fonctions on utilise l'option time{} de la librairie.
J'ai déjà parlé de cette option dans ce post viewtopic.php?f=9&t=276&p=2192#p2192. J'avais même précisé dans un post que ça n'était pas un bonne idée de nommer time les variables tstamp encodées en Json que l'on envoie au script Highcharts.
Mais pour utiliser cette option, il faut aussi 2 autres scripts javascripts.
moment.js et moment-with-locales.js

Pour avoir ces 2 scripts, ouvrez les liens ci-dessous dans des nouveaux onglets et enregistrez les.
https://www.monsite-meteo.eu/Scripts/JS/moment.js
https://www.monsite-meteo.eu/Scripts/JS ... locales.js

Ensuite, il faut exécuter la même fonction dans 3 évènements events différents. Cette fonction est semblable à celle exécutée lorsque l'on clique sur un bouton
N'essayez pas de créer un seule fonction et de l'appeler dans les events, ça ne fonctionne pas. Les fonctions doivent être intégrées à l'objet conteneur du script Highcharts (windows.chart pour mon graphique)
windows.chart peut également être une variable var option ou tout autre mot que vous voulez.
que se soit windows.chart ou option ou autre, ces variables sont obligatoirement définies par = new Highcharts.StockChart({}). pour un graphique type Stockchart ou par = new Highcharts.Chart({}). pour un graphique type Highcharts.
La fonction doit être réécrite dans les 3 events différents.

Voici le corps de la fonction. C'est ce code qui doit être mis dans 3 endroits différents du scripts Highcharts.
Ce code est celui qui affiche les extrêmes en bas de cette pagehttps://www.monsite-meteo.eu/PC/G-HS-Temperatures.php
Bon après, les class CSS sont les miennes. vous en faites ce que vous voulez.
Cette fonction est commence par function(e). Ce petit e est important, c'est l'abréviation JavaScripts de events et il indique au script Highcharts que la fonction doit s’exécuter lorsque l’événement est déclenché.

Code : Tout sélectionner

function(e){
	var DHLocale = new Date();
	var Decalage = DHLocale.getTimezoneOffset();
	Decalage = Decalage *60*1000;
	var Tempextremes = chart.yAxis[1].getExtremes();
	var Humidexextremes = chart.yAxis[2].getExtremes();
	var Windchillextremes = chart.yAxis[3].getExtremes();
	var Dewpointextremes = chart.yAxis[4].getExtremes();
	var extremes=chart.xAxis[0].getExtremes();
	var yAxisMax=Humidexextremes.dataMax;
	var yAxisMin=Windchillextremes.dataMin;
	chart.yAxis[0].max=yAxisMax;
	chart.yAxis[0].softMin=yAxisMin;
	$('#Extremes').html(
		'<span class="texte_dans_div_extreme">Température et indices extrêmes entre le '+ Highcharts.dateFormat('%A %e %B %Y à %Hh %Mmn', (extremes.min-Decalage))+' et le '+ Highcharts.dateFormat('%A %e %B %Y à %Hh %Mmn', (extremes.max-Decalage))+'</span>'+
		'<hr style="border-top:ridge">'+
		'<table width="350px">'+
		'<tr><td class="texte_dans_div_extreme" style="text-align: left">Température maxi</td><td class="texte_dans_div_extreme" style="text-align: center">:</td><td class="extreme_maxi" style="text-align: right">'+ formatNombre(Tempextremes.dataMax,1) +'</td><td class="texte_dans_div_extreme" style="text-align: left">°C</td></tr>'+
		'<tr><td class="texte_dans_div_extreme" style="text-align: left">Température mini</td><td class="texte_dans_div_extreme" style="text-align: center">:</td><td class="extreme_mini" style="text-align: right">'+ formatNombre(Tempextremes.dataMin,1) +'</td><td class="texte_dans_div_extreme" style="text-align: left">°C</td></tr>'+
		'<tr><td class="texte_dans_div_extreme" style="text-align: left">Indice de chaleur (Humidex) maxi</td><td class="texte_dans_div_extreme" style="text-align: center">:</td><td class="extreme_maxi" style="text-align: right">'+ formatNombre(Humidexextremes.dataMax,1) +'</td><td class="texte_dans_div_extreme" style="text-align: left"></td></tr>'+
		'<tr><td class="texte_dans_div_extreme" style="text-align: left">Refroidissement éolien (Windchill) mini</td><td class="texte_dans_div_extreme" style="text-align: center">:</td><td class="extreme_mini" style="text-align: right">'+ formatNombre(Windchillextremes.dataMin,1) +'</td><td class="texte_dans_div_extreme" style="text-align: left"></td></tr>'+
		'<tr><td class="texte_dans_div_extreme" style="text-align: left">Point de Rosée maxi</td><td class="texte_dans_div_extreme" style="text-align: center">:</td><td class="extreme_maxi" style="text-align: right">'+ formatNombre(Dewpointextremes.dataMax,1) +'</td><td class="texte_dans_div_extreme" style="text-align: left">°C</td></tr>'+
		'<tr><td class="texte_dans_div_extreme" style="text-align: left">Point de Rosée mini</td><td class="texte_dans_div_extreme" style="text-align: center">:</td><td class="extreme_mini" style="text-align: right">'+ formatNombre(Dewpointextremes.dataMin,1) +'</td><td class="texte_dans_div_extreme" style="text-align: left">°C</td></tr>'+
		'</table>'
	)
},
J'explique cette fonction.
Les variables DHLocale et Decalage servent à trouver le décalage horaire que l'on a avec l'heure UTC.
Je rappelle qu'avec les dernières librairies Highcharts, on ne calcule plus ce décalage dans le code PHP. On envoie au script Highcharts les tstamp directement en UTC.
C'est la nouvelle option time{} qui correctement paramétrée, se charge d'afficher les dates et heures en local.

Ensuite, on récupère les extrêmes comme je l'explique dans le tuto.

Puis, il faut récupérer les extrêmes des axes x et y.
On le fait avec chart.xAxis[0].getExtremes(); pour récupérer les tstamp mini et maxi affiché sur l'xAxis pour afficher les dates heures de la période affichée, et
comme pour ici le graphique de température, il faut récupérer les extrêmes possibles des données affichées sur l'yAxis. Ces variables doivent être adaptées à vos graphiques.
Pour le graphique cité en exemple,
Le maxi de l'yAxis et récupéré avec Humidexextremes.dataMax et le mini avec Windchillextremes.dataMin
On passe ces extrêmes dans des variables (ci-dessous)
var yAxisMax=Humidexextremes.dataMax;
var yAxisMin=Windchillextremes.dataMin;

Ces variables servent alors à redéfinir les valeur mini et maxi à afficher de l'yAxis[0].
On le fait avec
chart.yAxis[0].max=yAxisMax;
chart.yAxis[0].softMin=yAxisMin;

On ne redimensionne que l'yAxis[0]. Les autres étant liés à celui-ci par le paramètre linkedTo, il seront automatiquement redimensionnés.

Maintenant, ou mettre ce code.
Pour que la fonction s'éxécute au chargement du graphique, on place la fonction dans

Code : Tout sélectionner

plotOptions: {
	series: {
		events: {
			afterAnimate: function(e){
			
				blablabla la fonction que je vous ai donnée plus haut
				
			},
		},
	},
},
pour l’exécuter au redimensionnement de l'xAxis, dans

Code : Tout sélectionner

xAxis:{
	events:{
		afterSetExtremes:function(e){
			
				blablabla la fonction que je vous ai donnée plus haut

		},
	},
},
et pour l’exécuter au redimensionnement de l'yAxis, dans

Code : Tout sélectionner

yAxis:{
	events:{
		afterSetExtremes:function(e){
			
				blablabla la fonction que je vous ai donnée plus haut

		},
	},
},
Voila, c'est pas très compliqué.

A+
Pascal
Station VP2Plus, Windows 10 64 bits,WeatherLink 6.0.5, VP2SQL, Graphiques Dynamiques à partir d'une BDD MySQL
Météo Conflans-en-Jarnisy
Image

muchistic
Messages : 142
Enregistré le : 17 févr. 2014, 20:20
Localisation : Canejan (33)
Contact :

Re: Afficher les valeurs extrêmes de plusieurs courbes

Message par muchistic » 21 nov. 2021, 09:10

Bonjour à tous,

Merci Pascal pour toutes ces explications, pas trop évident quand même :D . Comme tu l'a dit au début du sujet, j'ai regardé ton code source du graph et je l'ai adapté à ce que je voulais faire, voila ce que ça donne : https://mobile.meteo-canejan.fr/graphique/extreme.php .
Pas mal de chose reste encore des mystère pour moi dans ces graphiques :D
Merci encore pour ces explications

Bon dimanche à tous
Dominique
https://www.meteo-canejan.fr/

ma config : VP2sql , Weaterlink 6.03 , NOAAtable, minimaxibis (sonde agricole), Windows 10 .

Avatar du membre
PascalWMR
Messages : 323
Enregistré le : 16 févr. 2014, 09:28
Localisation : CONFLANS EN JARNISY (F54800)
Contact :

Re: Afficher les valeurs extrêmes de plusieurs courbes

Message par PascalWMR » 21 nov. 2021, 09:49

Bonjour à tous.

Content pour toi que ça fonctionne Dominique.

Mea-culpa.

J'ai dit
N'essayez pas de créer un seule fonction et de l'appeler dans les events, ça ne fonctionne pas. Les fonctions doivent être intégrées à l'objet conteneur du script Highcharts (windows.chart pour mon graphique)
C'est faux. Pourtant, j'avais déjà essayé cette solution, mais ça ne fonctionnait pas :!: :!: :!:
Je viens de faire un autre test et là, ça fonctionne :D :D :D. J'explique:

Au lieu d'écrire 3 fois le code d'affichage des extrêmes, on ne l'écrit qu'une seule fois.
Attention cependant. Ce code doit être dans une fonction juste avant le code Highcharts et dans la même balise <script></script> qui contient le code Highcharts comme on le fait avec la fonction comArr(unitsArray) qui fait correspondre le bon tstamp à la bonne valeur.
Chez moi, ça donne:
<script type="text/javascript">
<!-- Fonction faisant correspondre chaque data à son tstamp -->
function comArr(unitsArray) {
...
}
<!-- fonction d'affichage des extrêmes sur la période affichée sur la graphique -->
function affextreme(){
...
}
<!-- Début du script Highchart-Stock-Map -->
$(function () {
})

</script>


Donc j'ai créé la fonction affextreme() ci-dessous

Code : Tout sélectionner

<!-- fonction d'affichage des extrêmes sur la période affichées sur la graphique -->
function affextreme(){
	var DHLocale = new Date();
	var Decalage = DHLocale.getTimezoneOffset();
	Decalage = Decalage *60*1000;
	var Tempextremes = chart.yAxis[1].getExtremes();
	var Humidexextremes = chart.yAxis[2].getExtremes();
	var Windchillextremes = chart.yAxis[3].getExtremes();
	var Dewpointextremes = chart.yAxis[4].getExtremes();
	var extremes=chart.xAxis[0].getExtremes();
	var yAxisMax=Humidexextremes.dataMax;
	var yAxisMin=Windchillextremes.dataMin;
	chart.yAxis[0].max=yAxisMax;
	chart.yAxis[0].softMin=yAxisMin;
	$('#Extremes').html(
		'<span class="texte_dans_div_extreme">Température et indices extrêmes entre le '+ Highcharts.dateFormat('%A %e %B %Y à %Hh %Mmn', (extremes.min-Decalage))+' et le '+ Highcharts.dateFormat('%A %e %B %Y à %Hh %Mmn', (extremes.max-Decalage))+'</span>'+
		'<hr style="border-top:ridge">'+
		'<table width="350px">'+
		'<tr><td class="texte_dans_div_extreme" style="text-align: left">Température maxi</td><td class="texte_dans_div_extreme" style="text-align: center">:</td><td class="extreme_maxi" style="text-align: right">'+ formatNombre(Tempextremes.dataMax,1) +'</td><td class="texte_dans_div_extreme" style="text-align: left">°C</td></tr>'+
		'<tr><td class="texte_dans_div_extreme" style="text-align: left">Température mini</td><td class="texte_dans_div_extreme" style="text-align: center">:</td><td class="extreme_mini" style="text-align: right">'+ formatNombre(Tempextremes.dataMin,1) +'</td><td class="texte_dans_div_extreme" style="text-align: left">°C</td></tr>'+
		'<tr><td class="texte_dans_div_extreme" style="text-align: left">Indice de chaleur (Humidex) maxi</td><td class="texte_dans_div_extreme" style="text-align: center">:</td><td class="extreme_maxi" style="text-align: right">'+ formatNombre(Humidexextremes.dataMax,1) +'</td><td class="texte_dans_div_extreme" style="text-align: left"></td></tr>'+
		'<tr><td class="texte_dans_div_extreme" style="text-align: left">Refroidissement éolien (Windchill) mini</td><td class="texte_dans_div_extreme" style="text-align: center">:</td><td class="extreme_mini" style="text-align: right">'+ formatNombre(Windchillextremes.dataMin,1) +'</td><td class="texte_dans_div_extreme" style="text-align: left"></td></tr>'+
		'<tr><td class="texte_dans_div_extreme" style="text-align: left">Point de Rosée maxi</td><td class="texte_dans_div_extreme" style="text-align: center">:</td><td class="extreme_maxi" style="text-align: right">'+ formatNombre(Dewpointextremes.dataMax,1) +'</td><td class="texte_dans_div_extreme" style="text-align: left">°C</td></tr>'+
		'<tr><td class="texte_dans_div_extreme" style="text-align: left">Point de Rosée mini</td><td class="texte_dans_div_extreme" style="text-align: center">:</td><td class="extreme_mini" style="text-align: right">'+ formatNombre(Dewpointextremes.dataMin,1) +'</td><td class="texte_dans_div_extreme" style="text-align: left">°C</td></tr>'+
		'</table>'
	)
}
et je l’appelle au endroits indiqués dans mon précédent post soit
  1. Au chargement du graphique,

    Code : Tout sélectionner

    plotOptions: {
    	series: {
    		events: {
    			afterAnimate: function(e){affextreme()},
    		},
    	},
    },
    
  2. Au redimensionnement de xAxis,

    Code : Tout sélectionner

    xAxis:{
    	events:{
    		afterSetExtremes:function(e){affextreme()},
    	},
    },
    
  3. Au redimensionnement de yAxis,

    Code : Tout sélectionner

    yAxis:{
    	events:{
    		afterSetExtremes:function(e){affextreme()},
    	},
    },
    
Voila. Je vais reprendre tous mes graphiques et appliquer cette solution pour réduire le code.

A+
Pascal

Re Mea-culpa.
Je re-édite mon post
En regardant le graphique de Dominique, je me suis aperçu que les extrêmes n'était pas mis à jour lorsqu'on masquait ou affichait une série en cliquant dans la légende.
J'ai vérifié sur mes graphiques et c'était idem.
J'ai trouvé la solution.
Il faut rajouter les évènements hide et show dans l'option plotOptions comme ceci.

Code : Tout sélectionner

plotOptions: {
	series: {
		events: {
			afterAnimate: function(e){affextreme()},
			hide: function(e){affextreme()},
			show: function(e){affextreme()},
		},
	},
},
A+
Pascal
Modifié en dernier par PascalWMR le 21 nov. 2021, 10:04, modifié 1 fois.
Station VP2Plus, Windows 10 64 bits,WeatherLink 6.0.5, VP2SQL, Graphiques Dynamiques à partir d'une BDD MySQL
Météo Conflans-en-Jarnisy
Image

muchistic
Messages : 142
Enregistré le : 17 févr. 2014, 20:20
Localisation : Canejan (33)
Contact :

Re: Afficher les valeurs extrêmes de plusieurs courbes

Message par muchistic » 21 nov. 2021, 10:00

ha oui !! c'est clair que lorsque l'on modifie la partie html cela évite de la reprendre 3 fois et réduit aussi la taille du fichier.

Dominique

edit : j'ai dû faire une mauvaise manip, je n'ai plus rien qui s'affiche...

finalement ça fonctionne et je ne saurai dire ce que j'ai fait ! :lol:
https://www.meteo-canejan.fr/

ma config : VP2sql , Weaterlink 6.03 , NOAAtable, minimaxibis (sonde agricole), Windows 10 .

Répondre