2017-06-09 14 views
0

C#で設定したデータを考慮して、X軸とY軸のスケールを調整したい。C#のデータセットに基づいてX軸とY軸のスケールを拡大する方法を教えてください。

これは、これは私がグラフをプロットするために使用されるコードである。CSVファイルに設定データ

Name,Speed,Distance 
Amal,20.50,100.20 
Kamal,52.60,254.90 
Nimal,42.00,245.00 
Perera,20.30,142.00 
Kasun,56.40,368.00 
Piyal,45.60,784.00 
Roy,45.00,521.00 
Tony,25.00,36.00 
Nikky,36.00,56.00 
Jems,47.00,48.00 
Jully,56.00,120.00 
Tizz,78.00,354.00 
Taly,45.00,100.00 
Row,18.00,350.00 
Saga,15.60,250.00 
Peter,45.00,120.00 
Taw,89.00,56.00 
Nanny,78.60,487.00 
Jumo,108.00,150.00 

の一部です。

private void Output_Load(object sender, EventArgs e) 
{ 

    List<Graph> ObservingData = new List<Graph>(); // List to store all available Graph objects from the CSV 

    // Loops through each lines in the CSV 
    foreach (string line in System.IO.File.ReadAllLines(pathToCsv).Skip(1)) // .Skip(1) is for skipping header 
    { 
     // here line stands for each line in the csv file 

     string[] InCsvLine = line.Split(','); 

     // creating an object of type Graph based on the each csv line 

     Graph Inst1 = new Graph(); 

     Inst1.Speed = double.Parse(InCsvLine[1]); 
     Inst1.Distance= double.Parse(InCsvLine[2]); 

     chart1.Series["Distance"].YAxisType = AxisType.Primary; 
     chart1.Series["Distance"].Points.AddXY(Inst1.Speed, Inst1.Distance); 
     chart1.Series["Distance"].ChartType = SeriesChartType.FastLine; 

     ChartArea CA = chart1.ChartAreas[0]; 
     CA.AxisX.ScaleView.Zoomable = false; 
     CA.AxisY.ScaleView.Zoomable = false; 
     CA.CursorX.AutoScroll = true; 
     CA.CursorX.IsUserSelectionEnabled = true; 

    } 
} 

これはデータを格納するクラスです。

class Graph 
{ 
    public string Name { get; set; } // property to store Name 
    public double Speed{ get; set; } // property to store Speed 
    public double Distance { get; set; } // property to store Distance 
} 

は、今私は.csvファイルに設定されたデータを考慮して、このX軸とY軸をスケールします。スケールは条件を満たしている必要があります。

私はそれを例に挙げて説明します。 は、我々が持っているデータセットに言うことができます:

距離最大= 784.00 &分=その後、Y軸のみ33から787

(means +/- 0.3) 

プログラムに値を表示する必要があることを

36.00ファイルの読み取り中に.csvファイルの最小値と最大値を取得する必要があります。

は賢明にX軸を考えます。

私はそれをどのようにコードすることができますか?任意の助けは非常に感謝します。

+0

は、この[トピック](https://stackoverflow.com/questions/で見てください361681 /アルゴリズムのためのアルゴリズムのためのグリッド線) –

答えて

0

プログラムは、ファイルの読み取り中に.csvファイルの最小値と最大値を取得する必要があります。

すべてのデータがロードされた後に最小値と最大値を取得しないのはなぜですか?あなたのケースでは、グラフの詳細の初期化からデータ部分の読み込みを分割する方が望ましいと思われます。あなたのコードで、アイテムを格納するのにList<Graph> ObservingDataを使用していないことがわかります。これは、データセット全体がロードされた後に最小距離と最大距離の値を引き出すことができるため、ソリューションに追加しました。次に、軸間隔を設定することができます。

private void Output_Load(object sender, EventArgs e) 
{ 

    List<Graph> ObservingData = new List<Graph>(); // List to store all available Graph objects from the CSV 

    // Loops through each lines in the CSV 
    foreach (string line in System.IO.File.ReadAllLines(pathToCsv).Skip(1)) // .Skip(1) is for skipping header 
    { 
     // here line stands for each line in the csv file 

     string[] InCsvLine = line.Split(','); 

     // creating an object of type Graph based on the each csv line 
     Graph Inst1 = new Graph(); 
     Inst1.Speed = double.Parse(InCsvLine[1]); 
     Inst1.Distance= double.Parse(InCsvLine[2]); 

     chart1.Series["Distance"].Points.AddXY(Inst1.Speed, Inst1.Distance); 

     // you forgot to store the items: 
     ObservingData.Add(Inst1); 
    } 

     // after the loop you can pull out the min and max values to adjust your axes: 
     double min = ObservingData.Min(x=>x.Distance); 
     double max = ObservingData.Maxn(x=>x.Distance); 

     chart1.ChartAreas[0].AxisY.Minimum = min - 3; 
     chart1.ChartAreas[0].AxisY.Maximum = max + 3; 

     chart1.Series["Distance"].YAxisType = AxisType.Primary; 
     chart1.Series["Distance"].ChartType = SeriesChartType.FastLine; 

     ChartArea CA = chart1.ChartAreas[0]; 
     CA.AxisX.ScaleView.Zoomable = false; 
     CA.AxisY.ScaleView.Zoomable = false; 
     CA.CursorX.AutoScroll = true; 
     CA.CursorX.IsUserSelectionEnabled = true; 
} 

EDIT:あなたのX軸用として

あなたはY軸の治療のようにして、X軸を扱うことができません。 X軸は、そうあなたもそれの最小値と最大値のため、これらの値を取得する必要がありますSpeed の値を示しています

double minX = ObservingData.Min(x=>x.Speed); 
double maxX = ObservingData.Maxn(x=>x.Speed); 

次のポイントは、使用これらの値をにもなります!また、+と - の値は、この場合には、より適切であると思わ0.3Speed値の 範囲に収まる必要があります。

chart1.ChartAreas[0].AxisX.Minimum = minX - 0.3;  
chart1.ChartAreas[0].AxisX.Maximum = maxX + 0.3; 
+0

あなたの助けをありがとうございます。働いています。間違いを示してくれてありがとうございます。 – SNP

+0

@SNPあなたは大歓迎です。 –

+0

。これはうまくいきますが、私のx軸はスケールがうまくありません。なぜですか?例として、x軸1.2〜9.0があると仮定していますが、出力は2.4-3.5のみです.b軸Y軸データはその範囲。データポイントが明確ではありませんwell.how私はそれを増やしています。どんな助けても – SNP

1

のはあなたがチャートに表示するデータポイントのコレクションを持っているとしましょう:

List<Graph> ObservingData = new List<Graph>(); 

次に、あなたが行うことができますまず最初にに応じて、あなたの軸の最小値と最大を設定することですあなたが持っている値:

if (minY == maxY && minY == 0) 
{ 
    minY = -0.1; 
    maxY = 0.1; 
} 
0:

double minY = ObservingData.Min(x => x.Distance) * 0.9; 
double maxY = ObservingData.Max(x => x.Distance) * 1.1; 

double minX = ObservingData.Min(x => x.Speed) * 0.9; 
double maxX = ObservingData.Max(x => x.Speed) * 1.1; 

、その後、あなたは軸を設定する必要がminY = maxY = 0場合は、次のように、必要に応じていくつかの特定の値に手動で範囲

次に、その値を軸に割り当てます。

chart1.ChartAreas[0].AxisY.Maximum = maxY; 
chart1.ChartAreas[0].AxisY.Minimum = minY; 

X軸についても同じ手順を繰り返します。

ともう一つ:あなたは、ループ内でこれを行う理由:

chart1.Series["Distance"].YAxisType = AxisType.Primary; 
    chart1.Series["Distance"].ChartType = SeriesChartType.FastLine; 

    ChartArea CA = chart1.ChartAreas[0]; 
    CA.AxisX.ScaleView.Zoomable = false; 
    CA.AxisY.ScaleView.Zoomable = false; 
    CA.CursorX.AutoScroll = true; 
    CA.CursorX.IsUserSelectionEnabled = true; 

それは十分あなたがforeachループの外に、最初に、一度それを行う場合は、それ。

UPDATE 13/06/2017:

代わりのmaxあなたは

chart1.ChartAreas[0].AxisX.Minimum = minX - 3; 
chart1.ChartAreas[0].AxisX.Maximum = maxX + 3; 

chart1.ChartAreas[0].AxisY.Minimum = minY - 3; 
chart1.ChartAreas[0].AxisY.Maximum = maxY + 3; 

上で計算しているminX, maxX, minYmaxYを割り当てる必要があります私はまた、(あなたがやったように一定のオフセットを使用しないことをお勧め+/- 3)、前述のように、軸の範囲を最小値と最大値のパーセンテージで拡張しようとします。

double minY = ObservingData.Min(x => x.Distance) * 0.9; // Yaxis min is 90% of Min value 
double maxY = ObservingData.Max(x => x.Distance) * 1.1; // Yaxis max is 110% of Max value 

double minX = ObservingData.Min(x => x.Speed) * 0.9; // like above 
double maxX = ObservingData.Max(x => x.Speed) * 1.1; 

これにより、表示している値には依存しません.1.5などの小さな値と1500.0,99999.0などの大きな値の両方で問題ありません。

+0

@ pitersmx.whyここでは '0.9と1.1' – SNP

+0

@ pitersmx..Itは働いています。ありがとうございます。約0.9と1.1' – SNP

+0

@SNP - それらの0.9と1.1は単なる例です - あなたはこれらの乗数を無視することができます、私はちょうどグラフ上でより明確になるように最小値と上記の最大値の下にいくつかの軸スペースを追加したいです:) – pitersmx