3

私はこのZedGraph制御コードを持っています:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ZedGraph;
using Extracting_Frames;

namespace Lightnings_Extractor
{
    public partial class Histogram_Graphs : Form
    {

        public long[] histogram;

        public Histogram_Graphs()
        {
            InitializeComponent();

            histogram = Form1.GetHistogramValue;
            this.DoubleBuffered = true;
            CreateGraph_GradientByZBars(zedGraphControl1);

        }

        private void Histogram_Graphs_Load(object sender, EventArgs e)
        {

        }

        private void CreateGraph_GradientByZBars(ZedGraphControl z1)
        {
            GraphPane myPane = z1.GraphPane;
            myPane.Title.Text = "Demonstration of Multi-Colored Bars with a Single BarItem";
            myPane.XAxis.Title.Text = "Bar Number";
            myPane.YAxis.Title.Text = "Value";

            PointPairList list = new PointPairList();
            Random rand = new Random();

            for (int i = 0; i < histogram.Length; i++)
            {
                double x = (double)i + 1;
                //double y = (double)i + 1;//rand.NextDouble() * 1000;
                double z = i / 4.0;
                list.Add(x, histogram[i], z);
            }

            BarItem myCurve = myPane.AddBar("Multi-Colored Bars", list, Color.Blue);
            Color[] colors = { Color.Red, Color.Yellow, Color.Green, Color.Blue, Color.Purple };
            myCurve.Bar.Fill = new Fill(colors);
            myCurve.Bar.Fill.Type = FillType.GradientByZ;

            myCurve.Bar.Fill.RangeMin = 0;
            myCurve.Bar.Fill.RangeMax = 4;

            myPane.Chart.Fill = new Fill(Color.White, Color.FromArgb(220, 220, 255), 45);
            myPane.Fill = new Fill(Color.White, Color.FromArgb(255, 255, 225), 45);
            // Tell ZedGraph to calculate the axis ranges
            z1.AxisChange();
        } 
    }
}

問題はループにあります:

for (int i = 0; i < histogram.Length; i++)
                {
                    double x = (double)i + 1;
                    //double y = (double)i + 1;//rand.NextDouble() * 1000;
                    double z = i / 4.0;
                    list.Add(x, histogram[i], z);
                }

Y以前はランダムでした。ここで、ヒストグラム リストの値を使用したいと思います。たとえば、index[0] には数字があります: 34118 そして index 1 1521 index[2] 522 リストには 256 のインデックスがあります。

グラフを見ると、吟遊詩人の身長が非常に短いことがわかります。

グラフの最初に 1 つの線が非常に高く表示されていますが、次の線はすべて非常に短いです。そして、Y 軸では横に 0 から 40 までの数字が表示され、X 軸には 0 から 300 までの数字が表示されます。

軸 Y i には 0 からヒストグラムの最高値までの数値が表示され、軸 X i には 0 から 256 が表示されます。

ここで大混乱。

どうすれば直せますか?

ありがとう。

ここに画像の説明を入力

4

1 に答える 1

1

コードにバグはありません。グラフは、histogram[]配列内の値を正確に描画しています。

配列には次の値が含まれていると述べています。

histogram[0] = 34118
histogram[1] = 1521
histogram[2] = 522
...

スクリーンショットを調べると、プロットは正しいです。最初に描かれたバーは非常に高く、他の残りの値は (予想通り) 1x10^3 バンドに近くなっています。histogram[]配列が間違ったデータで初期化されているか、 index に誤ったデータが含まれている可能性があります[0]

コードとデータのこちら側からat の値の重要性について推測することしかできhistogram[0]ませんが、 index の残りのすべてのデータの合計を含む配列を受け取っている可能性があります[0]

[1]期待値の簡単なチェックとして、ループをではなくインデックスから開始するように変更する[0]と、使用しているプロット コントロールが 1x10^3 バンドに近いと予想される他のすべての値に対して正しく実行されることがわかります。配列を埋めるデータ ソースをチェックしてhistogram、最初のデータ ポイントが関連しているかどうか、または誤った値に設定されているかどうかを確認する必要があります。

for (int i = 1; i < histogram.Length; i++)
{
    double x = (double)i + 1;
    //double y = (double)i + 1;//rand.NextDouble() * 1000;
    double z = i / 4.0;
    list.Add(x, histogram[i], z);
}
于 2012-11-06T20:50:44.100 に答える