Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - C# velocizzare creazione Chart
Forum - C# / VB.NET - C# velocizzare creazione Chart

Avatar
fosforo (Normal User)
Expert


Messaggi: 391
Iscritto: 06/04/2009

Segnala al moderatore
Postato alle 8:53
Lunedì, 24/07/2023
Ciao

Ho un'Array contenete migliaia di valori che dovrei raffigurare tramite una Chart.

Ho creato una semplicissima foreach che, per ogni dato letto, disegna la Chart tramite
chartPSNR.Series["X"].Points.AddXY(i, Mvolt_avg).

Funziona benissimo ma purtroppo,
essendo l'Array molto lunga, ci mette tanto a disegnare il grafico.

Esiste un metodo migliore per poterlo fare?

Grazie

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6334
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:15
Lunedì, 24/07/2023
Una sola linea senza foreach

chartPSNR.Series[0].Points.DataBindY(TuoArray);


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1198
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 16:10
Lunedì, 24/07/2023
Se l'aiuto di nessuno non fosse sufficiente, hai provato a costruirti il grafico usando le istruzioni grafiche?
In allegato un esempio dove i dati sono mostrati potendoli scorrere con una scrollbar.
Nessun problema di dimensione dell'array perché nel grafico viene mostrato solo il range visualizzabile.
Con tale metodo i grafici li puoi fare anche animati, invece di aspettare che Chart visualizzi...
Naturalmente tutto dipende dalle esigenze.



Carlo ha allegato un file: GraficoSenzaChart.zip (17109 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Carlo il 25/07/2023 alle 21:41


in programmazione tutto è permesso
PM Quote
Avatar
fosforo (Normal User)
Expert


Messaggi: 391
Iscritto: 06/04/2009

Segnala al moderatore
Postato alle 16:14
Martedì, 01/08/2023
Grazie
Scusate il ritardo.

Il consiglio di nessuno funziona benissimo.
Ho creato una List multicolonna e usato per alimentare i vari Series del Chart.

Purtroppo devo aprire un'altro Thread per capire come rilevare il valore X della chart.



Grazie 1000

Ultima modifica effettuata da fosforo il 01/08/2023 alle 16:38
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1198
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 23:17
Mercoledì, 02/08/2023
Testo quotato

Postato originariamente da fosforo:
Purtroppo devo aprire un'altro Thread per capire come rilevare il valore X della chart.


Ciao fosforo, mi piace gestire la grafica in proprio e del componente Chart avevo un brutto ricordo, risalente al VB6.
Ti ringrazio per avermi stimolato a ripescarlo e ristudiarlo.

In modalità FastLine e FastPoint, si comporta in modo egregio, si possono sovrapporre tutti i grafici che vuoi e supporta lo Zoom e il Position.

Questo un codice che fa quello che ti serve, ma altro si può fare:

Codice sorgente - presumibilmente C#

  1. using System;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4. // add reference assembly
  5. using System.Windows.Forms.DataVisualization.Charting;
  6.  
  7. namespace Chart_2
  8. {
  9.     public partial class Form1 : Form
  10.     {
  11.         const int maxdati = 50000; // quello che ti serve
  12.         Int16[] Mvolt_avg0 = new Int16[maxdati]; // matrice con dati
  13.         Int16[] Mvolt_avg1 = new Int16[maxdati]; // matrice con dati
  14.         double pos = 0;
  15.  
  16.         public Form1()
  17.         {
  18.             InitializeComponent();
  19.             //dati fittizi su due matrici, metti i tuoi
  20.             double s = 0;
  21.             for (int indice = 0; indice < maxdati; indice++)
  22.             {
  23.                 s += .1;
  24.                 Mvolt_avg0[indice] = Convert.ToInt16(Math.Sin(s) * indice / 4);
  25.                 Mvolt_avg1[maxdati - indice - 1] = Convert.ToInt16(Math.Sin(s * .1) * indice / 4);
  26.             }
  27.             hScrollBarRANGE.Minimum = 10; // al minimo mostra 10 valori di x
  28.             hScrollBarRANGE.Maximum = maxdati; // al massimo li mostra tutti
  29.             hScrollBarRANGE.Value = maxdati / 20; // si parte con una finestra scrollabile che mostra un ventesimo dei dati totali
  30.         }
  31.  
  32.         private void butArray_Click(object sender, EventArgs e)
  33.         {
  34.             chartPSNR.Series.Clear();
  35.             chartPSNR.Titles.Clear();
  36.             chartPSNR.Titles.Add("dati fittizi");
  37.             chartPSNR.Series.Add("Test0"); // Grafico su indice 0
  38.             chartPSNR.Series.Add("Test1"); // Grafico su indice 1
  39.             chartPSNR.Series[0].ChartType = SeriesChartType.FastLine; // stile visualizzazione matrice 0
  40.             chartPSNR.Series[1].ChartType = SeriesChartType.FastLine; // stile visualizzazione matrice 1
  41.             chartPSNR.Palette = ChartColorPalette.BrightPastel;
  42.             chartPSNR.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
  43.             chartPSNR.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = false;
  44.             chartPSNR.ChartAreas[0].AxisX.ScrollBar.Size = 20;
  45.             chartPSNR.ChartAreas[0].AxisX.ScrollBar.ButtonColor = Color.WhiteSmoke;
  46.             chartPSNR.ChartAreas[0].AxisX.ScrollBar.BackColor = Color.WhiteSmoke;
  47.             chartPSNR.ChartAreas[0].AxisX.ScrollBar.LineColor = Color.Gray;
  48.             chartPSNR.Series[0].Points.DataBindY(Mvolt_avg0); // carica la matrice 0
  49.             chartPSNR.Series[1].Points.DataBindY(Mvolt_avg1); // carica la matrice 1
  50.         }
  51.  
  52.         private void hScrollBarRANGE_ValueChanged(object sender, EventArgs e)
  53.         {
  54.             pos = chartPSNR.ChartAreas[0].AxisX.ScaleView.Position; // salvo la posizione
  55.             chartPSNR.ChartAreas[0].AxisX.ScaleView.MinSize = hScrollBarRANGE.Value; // aggiusto il range
  56.             chartPSNR.ChartAreas[0].AxisX.ScaleView.Zoom(0, 0); // zoom
  57.             chartPSNR.ChartAreas[0].AxisX.ScaleView.Position = pos; // reimposto la posizione
  58.         }
  59.     }
  60. }



Il codice genera due matrici di dati fittizi, tanto per provare, poi le due matrici vengono inviate in toto al componente Chart come indicato da nessuno.
In Chart ho attivato la scrollBar chartPSNR.ChartAreas[0].AxisX.ScrollBar.Enabled = true; che permette lo scorrimento dei dati con relativa visualizzazione del valore di X, ho usalto auto per la X ma si può stabilirne il tipo: Numeri, anni, mesi, settimane, giorni, ore minuti, secondi e millisecondi.
Per lo Zoom, non so se si possa inserire una scrollbar predefinita, ma siccome lo zoom si può controllare con: ...AxisX.ScaleView.MinSize ho aggiunto una HscrollBar per usare la proprietà.

In allegato anche il progetto completo.

Ps. non credo che andiamo fuori tema, visto che nel titolo si capisce che si parla del componente Chart, al limite potresti modificare il titolo in: C# velocizzare creazione Chart, scroll e zoom

Commenti, consigli e ampliamenti sull'uso di Chart sono benvenuti.


Carlo ha allegato un file: Chart_2.zip (16307 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Carlo il 03/08/2023 alle 14:20


in programmazione tutto è permesso
PM Quote