Zedgraph mise à l'echelle auto, comment la désactivée

cs_lolo818 Messages postés 22 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 27 janvier 2012 - 30 nov. 2011 à 21:36
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 27 janv. 2012 à 20:58
[Aperçu de votre message]
Bonjour à tous,
Je suis débutant et cale sur un problème d'échelle avec Zegraph.
Dans mon application je charge un fichier CSV contenant plusieurs valeurs de courbes à une échelle différente.
Si j'affiche 2 courbes, la 1ere courbe s'adapte en fonction de l'échelle de la 2eme courbe si celle-ci a des valeurs plus élevées.
Pour résoudre partiellement le problème, j'affiche une courbe dans YAxis et l'autre dans Y2Axis mais si j'affiche une 3eme courbe le problème se repose.
Je poste mon code pur y voir plus clair,
J'espère avoir été clair dans mon explication, merci pour votre aide.

if (this.Graph.CurveList.Count >= 1)
{
Y2Axis item = new Y2Axis(this.listeParametre[this.selection]);
item.Scale.FormatAuto = false;
item.Scale.MaxAuto = false;
item.Scale.MinAuto = true;
this.Graph.AddCurve(this.listeParametre[this.selection], points, this.CouleurTrait(cl), SymbolType.None).IsY2Axis = true;
this.Graph.Y2AxisList.Add(item);
item.Scale.Max = num;
item.Scale.FontSpec.FontColor = this.CouleurTrait(cl);
item.IsVisible = false;
item.Title.IsVisible = true;
}
if (this.Graph.CurveList.Count <= 0)
{
this.Graph.AddCurve(this.listeParametre[this.selection], points, this.CouleurTrait(cl), SymbolType.None);
this.zg1.AxisChange();
}

29 réponses

cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9
30 nov. 2011 à 21:57
Bonsoir,

je connais pas zedgraph, mais peut'être en changent d'unité.

par ex si courbe 1 est entre 1 et 10 et que la courbe 2 est entre 1 et 10000

alors tu divises les valeurs de courbe 2 par 1000 avant de faire le graph ?

Bonne soirée




Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.
0
cs_lolo818 Messages postés 22 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 27 janvier 2012
30 nov. 2011 à 22:10
Bonsoir, j'y ai pensé, mais ça fausse toute la suite, en parcourant le graph Zegraph affiche les valeurs en pointant avec la souris, ce qui me fausserai les valeurs affichées.
Merci pour ta proposition,
Bonne soirée
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
1 déc. 2011 à 19:14
Bonsoir,

tu peux ajouter autant d'axe Y que tu veux aussi bien à gauche qu'à droite.
Je n'ai plus le code en tête (je peux voir ça demain au boulot), mas je l'avais trouvé dans le projet d'exemples fourni sur le site de zedgraph.

Sinon, je regarderais aussi comment je force une échelle.


Whismeril
0
cs_lolo818 Messages postés 22 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 27 janvier 2012
1 déc. 2011 à 20:27
Bonsoir,
ajouter des axes ok mais je ne veux pas que l’échelle de l'axe précédent soit pris comme référence.
Si tu as un exemple pour tester ce serai sympa.
Merci,bonne soirée.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
1 déc. 2011 à 20:32
Pas chez moi, mais tu peux regarder


Whismeril
0
cs_lolo818 Messages postés 22 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 27 janvier 2012
1 déc. 2011 à 22:48
@:Whismeril

Merci pour le lien,
il y a justement un exemple qui correspond à ce que je cherche à faire, c'est le 1er sur liste (Multi y Graph)mais le lien sur l'exemple du code est out :(
0
cs_lolo818 Messages postés 22 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 27 janvier 2012
13 déc. 2011 à 22:12
Bon ben je suis au même point, j'ai fais d'autres tentatives mais le résulta est toujours identique, je n'arrive pas a avoir des courbes avec des échèles différente.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
13 déc. 2011 à 23:10
Je t'ai envoyé une classe en MP le 2.
L'as tu essayée?

Whismeril
0
cs_lolo818 Messages postés 22 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 27 janvier 2012
15 déc. 2011 à 18:52
Bonsoir,
merci pour la classe, en fait je ne l'avais pas vu , désolé!!
J'ai tenté d'afficher 3 courbes avec ce code mais ça ne fonctionne toujours pas, les courbes sont affichées en fonction de l’échelle de la première courbe
LineItem Courbe = Graph.AddCurve(listeParametre[selection], ListPointPairList[0], CL[0], SymbolType.None);
Courbe = Graph.AddCurve(listeParametre[selection], ListPointPairList[1], CL[1], SymbolType.None);
Courbe = Graph.AddCurve(listeParametre[selection], ListPointPairList[2], CL[2], SymbolType.None);
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
15 déc. 2011 à 22:02
Déjà je pense que tu dois créer une référence par courbe.
LineItem Courbe = Graph.AddCurve(listeParametre[selection], ListPointPairList[0], CL[0], SymbolType.None); 
LineItem Courbe2 = Graph.AddCurve(listeParametre[selection], ListPointPairList[1], CL[1], SymbolType.None); 
LineItem Courbe3 = Graph.AddCurve(listeParametre[selection], ListPointPairList[2], CL[2], SymbolType.None); 

Ensuite, tu n'affectes pas tes courbes à un axe Y particulier, donc par défaut c'est au premier de gauche, et l'échelle prend en compte tout ce que tu lui affectes.

Il faut que tu crées des axes Y en plus (voir les méthodes creerDeuxiemeAxe et creerTroisiemeAxe) et ensuite affecter chaque courbe à l'axe que tu veux.

Courbe.YAxisIndex = 1;// deuxième axe à gauche
Courbe2.IsY2Axis = true;//premier axe à droite



Whismeril
0
cs_lolo818 Messages postés 22 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 27 janvier 2012
19 déc. 2011 à 19:31
Bonsoir whismeril,
Je comprends le problème mais je n'arrive pas affecter la courbe a mon nouvel Yaxis, je suis débutant et là pour mois c'est pas simple.
Merci en tous cas pour tes infos.
je crée mes axes:
public void PremierAxeY(GraphPane courbe, Color Couleur)
{
courbe.Y2Axis.IsVisible = true;
courbe.Y2Axis.Scale.FontSpec.FontColor = Couleur;
courbe.Y2Axis.Title.FontSpec.FontColor = Couleur;
courbe.YAxis.Scale.Align = AlignP.Inside;
}
............idem 2, 3, 4 et 4 eme axes

j'affiche une courbe:
PremierAxeY(Graph, Color.Black);
Courbe0 = Graph.AddCurve(listeParametre[selection], ListPointPairList[0], CL[0], SymbolType.None);

j'affiche 2 courbes:
PremierAxeY(Graph, Color.Black);
Courbe0 = Graph.AddCurve(listeParametre[selection], ListPointPairList[0], CL[0], SymbolType.None);
DeuxiemeAxeY(Graph, Color.Yellow);
Courbe1 = Graph.AddCurve(listeParametre[selection], ListPointPairList[1], CL[0], SymbolType.None);
j'affiche 3 courbes:
PremierAxeY(Graph, Color.Black);
Courbe0 = Graph.AddCurve(listeParametre[selection], ListPointPairList[0], CL[0], SymbolType.None);
DeuxiemeAxeY(Graph, Color.Yellow);
Courbe1 = Graph.AddCurve(listeParametre[selection], ListPointPairList[1], CL[0], SymbolType.None);
TroisiemeAxeY(Graph, Color.Green);
Courbe2 = Graph.AddCurve(listeParametre[selection], ListPointPairList[2], CL[0], SymbolType.None);
0
cs_lolo818 Messages postés 22 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 27 janvier 2012
19 déc. 2011 à 21:49
Re-bonjour,
j'ai réussi a affecter les courbes aux axes en faisant ceci:
            if (Graph.CurveList.Count == 3)
            {
                QuatriemeAxeY(Graph, CL[3]);
                Courbe2 = Graph.AddCurve(listeParametre[selection], ListPointPairList[3], CL[3], SymbolType.None);
                Courbe2.YAxisIndex = 2;
            }
            if (Graph.CurveList.Count == 2)
            {
                TroisiemeAxeY(Graph, CL[2]);
                Courbe2 = Graph.AddCurve(listeParametre[selection], ListPointPairList[2], CL[2], SymbolType.None);
                Courbe2.YAxisIndex = 1;
            }
            if (Graph.CurveList.Count == 1)
             {
                 DeuxiemeAxeY(Graph, CL[1]);
                 Courbe1 = Graph.AddCurve(listeParametre[selection], ListPointPairList[1], CL[1], SymbolType.None);
                 Courbe1.IsY2Axis = true;
             }
             if (Graph.CurveList.Count == 0)
             {
                 PremierAxeY(Graph, CL[0]);
                 Courbe0 = Graph.AddCurve(listeParametre[selection], ListPointPairList[0], CL[0], SymbolType.None);
                 Courbe0.IsX2Axis = true;
             }


Maintenant je bloque avec le clear de chaque courbes crées ( Courbe0, courbe1, etc..)
Merci,
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
19 déc. 2011 à 22:01
Bonsoir,

ci dessous une petite démo avec 4 courbes chacune sur un axe différent:

            //le GraphPane est une portion
            //tu peux partager ton graphique en plusieurs parties
            //Y a des exemples sur le site, dans ma démo un seul GraphPane
            GraphPane Portion = Graph.GraphPane;

            //j'initie le premier axe
            Portion.YAxis.Title.Text = "Axe Y de la courbe 1";
            Portion.YAxis.Color = Color.Blue;

            //J initie une courbe avec la surcharge la plus 'lisible'
            double[] Courbe1Y = {1.0,3.2,6.5,2.0,8.1,0.0,-2.5};
            double[] Courbe1X = {1.0,2.0,3.0,5.0,8.0,10.0,20.0};
            Portion.AddCurve("Coubre 1", Courbe1X, Courbe1Y, Color.Blue);

            //j'ajoute 1 Y axe à droite
            Portion.Y2Axis.IsVisible = true;
            Portion.Y2Axis.Color = Color.Green;
            Portion.Title.Text = "1er Axe Gauche";

            //J'ajoute un axe X en haut
            Portion.X2Axis.IsVisible = true;

            double[] Courbe2Y = {5.3,11.1,26.1,21.1,18.9,30.2,25.7};
            double[] Courbe2X = {-5.1,2.3,7.9,15.1,18.2,23.0,30.0};
            LineItem Courbe2 = Portion.AddCurve("Courbe 2", Courbe2X, Courbe2Y, Color.Green);
            
            //j'affecte la courbe aux deux nouveaux axes
            Courbe2.IsY2Axis = true;
            Courbe2.IsX2Axis = true;


            //j'ajoute un axe Y à gauche
            Portion.YAxisList.Add("Nouvel Axe à Gauche");
            Portion.YAxisList[1].Color = Color.Red;
            Portion.YAxisList[1].IsVisible = true;

            double[] Courbe3Y = { 65.3, 121.1, 216.1, 121.1, 88.9, 310.2 };
            double[] Courbe3X = {2.3, 7.9, 15.1, 18.2, 23.0, 30.0 };
            LineItem Courbe3 = Portion.AddCurve("Courbe 3", Courbe3X, Courbe3Y, Color.Red);

            //j'affecte la courbe au nouvel Axe Y
            Courbe3.YAxisIndex = 1 ; //là c'est le dexième par défaut donc à gauhce

            //j'ajoute un axe à droite
            Portion.Y2AxisList.Add("Nouvel Axe à Droite");
            Portion.Y2AxisList[1].Color = Color.Violet;
            Portion.Y2AxisList[1].IsVisible = true;

            double[] Courbe4Y = { 1, 2, 3, 4, 5, 1 };
            double[] Courbe4X = {7.3, 7.9, 10.1, 15.2, 18.0, 20.0 };
            LineItem Courbe4 = Portion.AddCurve("Courbe 4", Courbe4X, Courbe4Y, Color.Violet);

            //j'affecte la courbe au nouvel Axe Y
            Courbe4.IsY2Axis = true;//là c'est à froite
            Courbe4.YAxisIndex = 1;//là c'est le deuxième


            //un petit refresh
            Portion.AxisChange();
            Graph.Refresh();



Whismeril
0
cs_lolo818 Messages postés 22 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 27 janvier 2012
21 déc. 2011 à 20:33
Bonsoir,
Merci pour tous tes exemples!!
Dans mon application il y a plusieurs checkbox qui une fois cochées affichent une courbe ou s'efface lorsque l'on la décoche.
Je bloque sur l'effacement,pour chaque courbe affiché je rempli une liste "ListLineItem" :
{
PremierAxeY(Graph, CL[0]);
Courbe0 = Graph.AddCurve(listeParametre[selection], ListPointPairList[0], CL[0], SymbolType.None);
Courbe0.IsX2Axis = true;
ListLineItem.Add(Courbe0);
} 


je voudrai effacer la courbe en fonction de la sélection mais je n'y arrive pas, je récupère la sélection:
int selection = checkedListBox1.SelectedIndex;

mais après??
Merci pour vos lumières!!
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
22 déc. 2011 à 00:17
Bonsoir,

c'est un peu embrouillé, tu parles de checkbox et d'une listbox, puis d'une checklistbox.

Si tu as des checkbox, la gestion dynamique ne sera pas simple, mais avec un nombre fixe de courbe c'est une bonne solution.
Le checkBox1 gére la courbe1, est ainsi de suite:

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            Courbe1.IsVisible = checkBox1.Checked;
            Graph.Refresh();
        }


Dans ce cas la ListBox ne sert à rien (enfin de la façon que je le vois).


Dans le cas d'un CheckListBox, pour récupérer la référence de ta courbe tu peux faire ainsi:
            LineItem CourbeAAfficher = (LineItem)checkedListBox1.SelectedItem;


Whismeril
0
cs_lolo818 Messages postés 22 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 27 janvier 2012
22 déc. 2011 à 19:49
Bonsoir,
Arf.. désolé je n'ai pas relu mon post!
Pour être plus précis:
Je charge un fichier CSV qui me donne maxi 20 courbes disponibles dans un checkedListBox .
Lorsque je clique sur un item de la listBox j'affiche une courbe avec un maximum de 7 courbes.
Actuellement j'affiche bien mes courbe grace à toi avec ce code:

                if (Graph.CurveList.Count == 4)
                {
                    Courbe4 = null;
                    QuatriemeAxeY(Graph, (listeParametre[selection]), CL[4]);
                    Courbe4 = Graph.AddCurve(listeParametre[selection], ListPointPairList[4], CL[4], SymbolType.None);
                    Courbe4.YAxisIndex = 3;
                    // ListLineItem.Add(Courbe3);
                }
                if (Graph.CurveList.Count == 3)
                {
                    Courbe3 = null;
                    QuatriemeAxeY(Graph, (listeParametre[selection]), CL[3]);
                    Courbe3 = Graph.AddCurve(listeParametre[selection], ListPointPairList[3], CL[3], SymbolType.None);
                    Courbe3.YAxisIndex = 2;
                    // ListLineItem.Add(Courbe3);
                }
                if (Graph.CurveList.Count == 2)
                {
                    Courbe2 = null;
                    TroisiemeAxeY(Graph, (listeParametre[selection]), CL[2]);
                    Courbe2 = Graph.AddCurve(listeParametre[selection], ListPointPairList[2], CL[2], SymbolType.None);
                    Courbe2.YAxisIndex = 1;
                    //  ListLineItem.Add(Courbe2);
                }
                if (Graph.CurveList.Count == 1)
                {
                    Courbe1 = null;
                    DeuxiemeAxeY(Graph,(listeParametre[selection]), CL[1]);
                    Courbe1 = Graph.AddCurve(listeParametre[selection], ListPointPairList[1], CL[1], SymbolType.None);
                    Courbe1.IsY2Axis = true;
                    // ListLineItem.Add(Courbe1);
                }
                if (Graph.CurveList.Count == 0)
                {
                    Courbe0 = null;
                    PremierAxeY(Graph, (listeParametre[selection]), CL[0]);
                    Courbe0 = Graph.AddCurve(listeParametre[selection], ListPointPairList[0], CL[0], SymbolType.None);

                }
                zg1.AxisChange();
                zg1.Refresh();

Maintenant je voudrai lorsque je décoche un item supprimer la courbe affiché (ex: pour en afficher un autre).
Je vois qu'il faut supprimer la courbe mais aussi l'axe Y créer auparavant.
Merci d'avance.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
22 déc. 2011 à 21:23
Bonsoir,

je te propose une piste un peu différente de celle que tu as suivi pour le moment.

Tu crées une classe (MaClasse) ou tu stockes les infos nécessaires:
une LineItem (Courbe), un Axis (Axe) (Yaxis et Y2axis sont tous les deux dérivées de Axis) et un bool (Visible).
Dans la propriété Visible tu affectes la valeur au IsVIsible de ta courbe et de ton axe.

tu charges ton CSV, inities tes 20 courbes dans le graphique et stocke une instance de MaClasse dans le checklistbox (il faudra que tu override le ToString() de MaClasse car c'est cette méthode qui sera affichée dans la liste).

Dans l'évènement ItemChecked tu récupères le MaClasse courant et affecte le futur état (checked ou pas) à la propriété Visible.
Tu Refresh le graphe et voilà.
C'est dans cet évènement que tu gères le nombre maxi de courbes affichées.


Whismeril
0
cs_lolo818 Messages postés 22 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 27 janvier 2012
2 janv. 2012 à 19:33
Bonsoir,
Bonne année!!
Ben non je ne peu pas lancer direct mes 20 courbes après le chargement du CSV car lors de la sélection de la courbe j'affiche tout ou partie de la courbe en fonction des paramètres qui sont rentrés ,en fait j'affiche une partie de la courbe en coupant l'Xaxis.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
3 janv. 2012 à 12:05
Bonjour,
bonne année à toi aussi.

Dans ce cas il faut que te reprennes la référence qui va bien (Courbe0 par exemple).

Graph.CurveList.Remove(Courbe0);


Whismeril
0
cs_lolo818 Messages postés 22 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 27 janvier 2012
4 janv. 2012 à 19:35
Bonsoir,
le fait d'effacer la courbe0 n'est pas vraiment le problème ce sont les Yaxis qui causent problème, je n'arrive pas par exemple à effacer les courbes avec leur Yaxis.
Quand je créer mes courbes je les mets dans une liste puis en fonction de l'index j'efface les courbes correspondante.
Le problème est de gérer les yaxis et y2axis pour le prochain affichage.
Là la courbe est effacé ainsi que l'yaxis correspondant mais après l'affichage des nouvelle courbes par en sucette.
                    Graph.CurveList.Remove(listLineItem[ListCourbe.IndexOf(selection)]);
                    Graph.YAxisList.RemoveAt(ListCourbe.IndexOf(selection));                  
                    ListCourbe.RemoveAt(ListCourbe.IndexOf(selection));
0
Rejoignez-nous