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.