私は MSChart を使用しており、X 軸でズームを有効にしたいと考えています。これがズームされたら、Y 軸を表示可能なデータに適した範囲に自動ズームします。
問題に関するご支援をいただければ幸いです。
ありがとう
私は長い間解決策を探していました。これは便利だと思いました。AxisValueChanged イベントをサブスクライブし、ScaleView を使用してビューを変更します。
private void chart1_AxisViewChanged(object sender, ViewEventArgs e)
{
if (e.Axis.AxisName == AxisName.X)
{
int start = (int)e.Axis.ScaleView.ViewMinimum;
int end = (int)e.Axis.ScaleView.ViewMaximum;
double[] temp = chart1.Series[0].Points.Where((x, i) => i >= start && i <= end).Select(x => x.YValues[0]).ToArray();
double ymin = temp.Min();
double ymax = temp.Max();
chart1.ChartAreas[0].AxisY.ScaleView.Position = ymin;
chart1.ChartAreas[0].AxisY.ScaleView.Size = ymax - ymin;
}
}
必要な種類のズームは、MSChart では自動的に実行できません。ユーザーから「ズームイン」X 値の範囲を取得したら、Y 軸のスケーリングを適切にリセットするためにもう少しコードを記述する必要があります。
これは、データ シリーズの Line スタイルを使用していて、そのシリーズのソース データが SortedList として保存されている場合に最も簡単に機能します。
Dim firstXindex as Int32 = myDataSeries.IndexOfKey(firstXzoomValue)
Dim lastXindex as Int32 = myDataSeries.IndexOfKey(lastXzoomValue)
Dim minY as Double = 1.7E+308
Dim maxY as Double = -1.7E+308
For i = firstXindex To lastXindex
If myDataSeries.GetByIndex(i) > maxY Then
maxY = myDataSeries.GetByIndex(i)
End If
If myDataSeries.GetByIndex(i) < minY Then
minY = myDataSeries.GetByIndex(i)
End If
Next
上記のコードのようなものを使用して minY と maxY を取得したら、それらの値を使用して、ChartArea の Y 軸の最小値と最大値をリセットできます。
With myChartArea
.AxisY.Maximum = maxY
.AxisY.Minimum = minY
End With
Microsoft は、さまざまなサンプルをダウンロードできるようにしています。サンプル アプリケーションには、Scrollable Appearanceと呼ばれるものがあります。
スクロール可能な外観 http://img502.imageshack.us/img502/5172/zoomablechart.png
ユーザーはグラフの領域を選択して拡大できます。また、スクロール バーを使用して移動することもできます。
C# サンプル コードは、ダウンロードに含まれています。