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 List 中有 256 个索引。

当我看到图表时,发现吟游诗人的身高非常非常短。

在图表的开头,我看到一条线非常高,但接下来的所有线都很短。在 Y 轴上,我看到边数从 0 到 40,在 x 轴上,我看到从 0 到 300 的数字。

在 Y 轴上,我应该看到直方图中从 0 到最大值的数字,而在 X 轴上,我应该看到从 0 到 256 的数字。

这里大乱。

我应该如何解决?

谢谢。

在此处输入图像描述

4

1 回答 1

1

您的代码中没有错误。您的图表准确地绘制了histogram[]数组中的值。

您提到您的数组包含以下值:

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

如果您检查屏幕截图,则图表是正确的。绘制的第一个条非常高,其他剩余值(符合您的预期)接近 1x10^3 波段。您的histogram[]数组很可能正在使用错误的数据或 index 处的错误数据进行初始化[0]

我只能histogram[0]从您的代码和数据的这一侧提供关于 at 值的重要性的推测,但也许您正在接收一个数组,其中包含 index 中所有剩余数据的总和[0]

作为对预期的快速检查,如果您将循环更改为从 index 开始[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 回答