Oppure

Loading
24/07 6:53
fosforo
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
aaa
24/07 10:15
nessuno
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à.
24/07 14:10
Carlo
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.

Ultima modifica effettuata da Carlo 25/07 19:41
in programmazione tutto è permesso
01/08 14:14
fosforo
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 01/08 14:38
aaa
02/08 21:17
Carlo
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:

using System;
using System.Drawing;
using System.Windows.Forms;
// add reference assembly
using System.Windows.Forms.DataVisualization.Charting;

namespace Chart_2
{
    public partial class Form1 : Form
    {
        const int maxdati = 50000; // quello che ti serve
        Int16[] Mvolt_avg0 = new Int16[maxdati]; // matrice con dati
        Int16[] Mvolt_avg1 = new Int16[maxdati]; // matrice con dati
        double pos = 0;

        public Form1()
        {
            InitializeComponent();
            //dati fittizi su due matrici, metti i tuoi
            double s = 0;
            for (int indice = 0; indice < maxdati; indice++)
            {
                s += .1;
                Mvolt_avg0[indice] = Convert.ToInt16(Math.Sin(s) * indice / 4);
                Mvolt_avg1[maxdati - indice - 1] = Convert.ToInt16(Math.Sin(s * .1) * indice / 4);
            }
            hScrollBarRANGE.Minimum = 10; // al minimo mostra 10 valori di x
            hScrollBarRANGE.Maximum = maxdati; // al massimo li mostra tutti
            hScrollBarRANGE.Value = maxdati / 20; // si parte con una finestra scrollabile che mostra un ventesimo dei dati totali
        }

        private void butArray_Click(object sender, EventArgs e)
        {
            chartPSNR.Series.Clear();
            chartPSNR.Titles.Clear();
            chartPSNR.Titles.Add("dati fittizi");
            chartPSNR.Series.Add("Test0"); // Grafico su indice 0
            chartPSNR.Series.Add("Test1"); // Grafico su indice 1
            chartPSNR.Series[0].ChartType = SeriesChartType.FastLine; // stile visualizzazione matrice 0
            chartPSNR.Series[1].ChartType = SeriesChartType.FastLine; // stile visualizzazione matrice 1
            chartPSNR.Palette = ChartColorPalette.BrightPastel;
            chartPSNR.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
            chartPSNR.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = false;
            chartPSNR.ChartAreas[0].AxisX.ScrollBar.Size = 20;
            chartPSNR.ChartAreas[0].AxisX.ScrollBar.ButtonColor = Color.WhiteSmoke;
            chartPSNR.ChartAreas[0].AxisX.ScrollBar.BackColor = Color.WhiteSmoke;
            chartPSNR.ChartAreas[0].AxisX.ScrollBar.LineColor = Color.Gray;
            chartPSNR.Series[0].Points.DataBindY(Mvolt_avg0); // carica la matrice 0
            chartPSNR.Series[1].Points.DataBindY(Mvolt_avg1); // carica la matrice 1
        }

        private void hScrollBarRANGE_ValueChanged(object sender, EventArgs e)
        {
            pos = chartPSNR.ChartAreas[0].AxisX.ScaleView.Position; // salvo la posizione
            chartPSNR.ChartAreas[0].AxisX.ScaleView.MinSize = hScrollBarRANGE.Value; // aggiusto il range
            chartPSNR.ChartAreas[0].AxisX.ScaleView.Zoom(0, 0); // zoom
            chartPSNR.ChartAreas[0].AxisX.ScaleView.Position = pos; // reimposto la posizione
        }
    }
}


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.
Ultima modifica effettuata da Carlo 03/08 12:20
in programmazione tutto è permesso