IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

[LiveCharts]Ajouter des points à un graphique cartesian + espacement


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    septembre 2008
    Messages
    916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2008
    Messages : 916
    Points : 312
    Points
    312
    Par défaut [LiveCharts]Ajouter des points à un graphique cartesian + espacement
    Bonjour,

    Dans une demande précédente je cherchais de l'aide pour créer des courbes avec un axe en DateTime et dont les mesures de chaque courbes n'étaient pas (forcement) sur le même point de l'axe X.

    Problème en grand partie résolue, et qui conviens pour le moment. Mais l'on viens de me demander s'il était possible d'ajouter des points sur le haut du graphique (par exemple), lié aussi avec la période de temps de l'axe X, mais la données n'est pas une valeur mais un événement.

    Explication événement:
    Lorsque je récupère les données, j'ai aussi des événements qui sont inclus par exemple: allumage, extinction de l'appareil, reset des données etc..
    Pour le moment j'ai ajouté des évènement dans une Listview, mais l'idéal serait donc de les visualiser sur le graph afin de comprendre pourquoi il y a des irrégularités (normale ou pas du coup) dans les courbes.

    Autre point l'espacement:
    Comme je vous est indiqué au dessus, j'ai la possibilité d'avoir des événements tel que l'arrêt ou la mise en marche de l'appareil de mesure. L'axe des X étant un DateTime, j'ai des courbes qui peuvent être coupé puisque aucune mesures, mais actuellement ce n'est pas le cas puisque la liaison se créer entre tous les points. Est-il possible de couper une LineSerie?


    Voici un exemple de test qui m'a permis de faire mon code.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            <lvc:CartesianChart Series="{Binding SeriesCollection}" LegendLocation="Right" Zoom="X">
                <lvc:CartesianChart.AxisX>
                    <lvc:Axis Title="Date" LabelFormatter="{Binding AxisXLabelFormatter}" LabelsRotation="140"/>
                </lvc:CartesianChart.AxisX>
                <lvc:CartesianChart.AxisY>
                    <lvc:Axis Title="Voltage (U)"/>
                </lvc:CartesianChart.AxisY>
            </lvc:CartesianChart>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     public SeriesCollection SeriesCollection { get; set; }
            public MainWindow()
            {
                InitializeComponent();
                // Création des données de la courbe 1
                var values1 = new ChartValues<ObservablePoint>
                {
                    new ObservablePoint(DateTime.ParseExact("08/05/2023 15:01:01", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),58.45),
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 15:20:01", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),70.14),
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 15:30:01", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),80.50),
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 15:58:01", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),89.5),
                    new ObservablePoint(DateTime.ParseExact("08/05/2023 18:01:01", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),102.10),
                };
                // Création des données de la courbe 2
                var values2 = new ChartValues<ObservablePoint>
                {
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 15:10:15", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),8.5),
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 15:22:45", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),10.54),
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 15:43:01", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(), 12.12),
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 16:08:10", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),9.1),
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 17:18:05", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),2.10),
                };
     
                // Ajout des courbes au SeriesCollection
                SeriesCollection = new SeriesCollection
                {
                    new LineSeries
                    {
                        Title = "Courbe 1",
                        Values = values1
                    },
                    new LineSeries
                    {
                        Title = "Courbe 2",
                        Values = values2
                    }
                };
                DataContext = this;
            }
            public Func<double, string> AxisXLabelFormatter => value =>
            {
                var dateTime = DateTime.FromOADate(value);
                return dateTime.ToString("dd/MM/yyyy HH:mm:ss");
            };
    Ce n'est qu'un test avec des valeur en dur que j'ai adapté pour mes mesures, mais je n'est pas changer grand chose a part l'affectation des données dynamique et de 1 à 4 courbes.

    Voici ce que cela me donne:
    Nom : Exemple reussi LiveCharts.png
Affichages : 37
Taille : 25,1 Ko


    Voici ce que j'ai sur des mesures réel:


    Nom : Exemple Réaliste.png
Affichages : 34
Taille : 24,5 Ko


    Sur ce graph vous pouvez constater 3 zones. J'ai fait en sorte de pouvoir afficher ces zones de façon indépendante:

    Nom : Serie1.png
Affichages : 35
Taille : 37,2 Ko

    Etc...

    Mais voici ce que j'aimerais arriver à faire avec les évènements marqués:

    Nom : Exemple Voulu.png
Affichages : 35
Taille : 55,2 Ko

    Sa se serait vraiment top. Avoir les points en haut du graph (callé sur le Max Y) ici en vert. Et au passage de la souri l'indication de l'événement.
    Ainsi que la suppression de la courbe lorsqu'il n'y a pas de mesure..

    Pour information je suis encore sur la version 1 de liveCharts, j'ai vu qu'il y avait la version 2 après, s'il faut passé à la version 2 pour avoir ces fonctionnalité, cela attendra un peu et fera partie d'une évolution du logiciel. Sur le gitub de livecharts j'ai vue la zone "Line with missing points" ils indiquent juste qu'il faut que j'écrive un double.NaN. J'ai pas fait l'essaie encore, mais je suppose qu'il faut que j'ajoute cette valeur juste avant la reprise de la nouvelle donnée.

    Merci de votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    novembre 2009
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : novembre 2009
    Messages : 1 958
    Points : 5 295
    Points
    5 295
    Par défaut
    Il te suffit de placer un point juste apres la valeur ou tu veux la coupure (0.0001s ou 1 minute? ) et tu mets un double.NaN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
                var values1 = new ChartValues<ObservablePoint>
                {
                    new ObservablePoint(DateTime.ParseExact("08/05/2023 15:01:01", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),58.45),
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 15:20:01", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),70.14),
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 15:30:01", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),80.50), 
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 15:31:01", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(), double.NaN),
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 15:58:01", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),89.5),
                    new ObservablePoint(DateTime.ParseExact("08/05/2023 18:01:01", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),102.10),
                };
                // Création des données de la courbe 2
                var values2 = new ChartValues<ObservablePoint>
                {
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 15:10:15", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),8.5),
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 15:22:45", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),10.54),
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 15:43:01", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(), 12.12), 
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 15:44:01", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(), double.NaN),
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 16:08:10", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),9.1),
                    new ObservablePoint( DateTime.ParseExact("08/05/2023 17:18:05", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToOADate(),2.10),
                };
    Pour les points en haut, j'imagine que tu peux essayer avec les VisualElements
    (https://github.com/Live-Charts/Live-Charts/issues/305 )

    Au passage il y a le datetimepoint au lieux de l'observablePoint, je ne sais pas trop la différence mais il doit y en avoir une !

Discussions similaires

  1. [Débutant] Ajouter des points sur un graphique
    Par Blugeer dans le forum VB.NET
    Réponses: 4
    Dernier message: 22/05/2012, 14h47
  2. manipulation des points du graphique
    Par naim2009 dans le forum Interfaces Graphiques
    Réponses: 0
    Dernier message: 21/03/2009, 12h45
  3. [JGraph] ajouter des points sur un edge
    Par badi3 dans le forum 2D
    Réponses: 1
    Dernier message: 14/12/2007, 11h27
  4. [JpGraph] Ajouter des évènements au graphique
    Par Foudébois dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 07/05/2007, 18h06
  5. [DEBUG] impossible d'ajouter des points d'arrêts
    Par erwan.bodere dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 16/04/2007, 17h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo