代码之家  ›  专栏  ›  技术社区  ›  Joel

从图表中的文件生成趋势线

  •  2
  • Joel  · 技术社区  · 6 年前

    我希望能够从文件夹中提取 csv files,并将它们绘制在图表中。

    目前,我只是保存文件并显示一条这样的曲线:

    运行测试函数:

    public list<tuple<double,double>>runtest())
    {
    _ dpg=新根(这个“英语”,错误);
    _ dpg.init();
    var filename=“dpg10export_”+datetime.now.toString(“yyyymmdd_hhmm”)+“.csv”;
    list<tuple<double,double>>results=新列表<tuple<double,double>();
    
    var测量=新测量();
    var resultcode=runmeasurement(60,1000,2200,ref measurement,空/*TODO:ref progressbar?*);
    
    使用(var filestream=new streamwriter(文件名))
    {
    var count=measurement.i_inc_values.count;
    
    对于(var i=0;i<count;i++)
    {
    var item=measurement.i_inc_值[i+1];
    var current=(float)convert.todouble(item);
    
    项目=测量值。li_inc_值[i+1];
    无功电感=(浮动)转换为双(项);
    
    var line=电流.toString()+“;”+电感.toString()+“;”;
    
    filestream.writeline(行);
    currentlist.add(当前);
    电感表。加(电感);
    结果:添加(新的tuple<double,double>(电流,电感));
    如果(i==0(i+1)%32==0)
    {
    console.writeline((i+1)+“:”+line);
    }
    }
    }
    返回结果;
    }
    

    此代码生成一个csv文件,其外观类似于此:

    0,22_0,44

    0,32 0,54

    0,44_0,65

    这些值产生一条曲线,看起来像这样:

    当你点击“获取波形”按钮时,上面的曲线就会生成。但是,我想显示所有已生成的曲线,以及一条趋势线。我怎样才能做到这一点?

    void binddata(list<tuple<double,double>>results)
    {
    chart.series.clear();
    var series1=new system.windows.forms.datavisualization.charting.series
    {
    name=“curr/induc”,
    颜色=system.drawing.color.green,
    isVisibleInLegend=真,
    isxValueIndexed=真,
    chartType=serieChartType.line
    };
    
    foreach(结果中的var i)
    {
    序列1.points.addxy(i.item2,i.item1);
    }
    
    chart.invalidate();
    chart.series.add(序列1);
    }
    
    private void getwaveformbtn_click(对象发送器,事件参数e)
    {
    dpg10客户端.dpg10设置设置=新建dpg10客户端.dpg10设置();
    DPG10仪器HEJ=新的DPG10仪器(设置);
    list<tuple<double,double>>results=hej.runtest();
    双电流、电感;
    
    foreach(结果中的var i)
    {
    电流=I.item1;
    电感=I.项2;
    textbox waveforminput.text+=电流.toString()+电感.toString();
    }
    binddata(结果);
    }
    

    tl;dr

    分析来自csv的信息以生成曲线,并基于这些文件创建趋势线。

    标记为重复:该答案是关于直线的,这些值可以在曲线中波动。

    运行测试功能:

    public List<Tuple<double,double>> runTest()
    {
        _dpg = new Root(this, "english", false);
        _dpg.Init();
        var filename = "Dpg10Export_" + DateTime.Now.ToString("yyyyMMdd_HHmm") + ".csv";
        List<Tuple<double, double>> results = new List<Tuple<double, double>>();
    
        var measurement = new Measurement();
        var resultCode = RunMeasurement(60, 1000, 2200, ref measurement, null /* TODO: ref ProgressBar? */);
    
        using (var fileStream = new StreamWriter(filename))
        {
            var count = measurement.I_inc_Values.Count;
    
            for (var i = 0; i < count; i++)
            {
                var item = measurement.I_inc_Values[i + 1];
                var current = (float)Convert.ToDouble(item);
    
                item = measurement.LI_inc_Values[i + 1];
                var inductance = (float)Convert.ToDouble(item);
    
                var line = current.ToString() + ";" + inductance.ToString() + ";";
    
                fileStream.WriteLine(line); 
                currentList.Add(current);
                inductanceList.Add(inductance);
                results.Add(new Tuple<double, double>(current,inductance));
                if (i == 0 || (i + 1) % 32 == 0)
                {
                    Console.WriteLine((i + 1) + ": " + line);
                }
            }
        }
        return results;
    }
    

    此代码生成类似以下内容的csv文件:

    0,22 | 0,44

    0,32 | 0,54

    0,44 | 0,65

    这些值产生一条曲线,看起来像这样:

    image

    当你点击“获取波形”按钮时,上面的曲线就会生成。但是,我希望显示所有已生成的曲线,以及趋势线也。我怎样才能做到这一点?

    void BindData(List<Tuple<double,double>> results)
    {
        chart.Series.Clear();
        var series1 = new System.Windows.Forms.DataVisualization.Charting.Series
        {
            Name = "curr/induc",
            Color = System.Drawing.Color.Green,
            IsVisibleInLegend = true,
            IsXValueIndexed = true,
            ChartType = SeriesChartType.Line                
        };
    
        foreach (var i in results)
        {
            series1.Points.AddXY(i.Item2,i.Item1);
        }
    
        chart.Invalidate();
        chart.Series.Add(series1);
    }
    
    private void getWaveformBtn_Click(object sender, EventArgs e)
    {
        Dpg10Client.Dpg10Settings settings  = new Dpg10Client.Dpg10Settings();
        Dpg10Instrument hej                 = new Dpg10Instrument(settings);
        List<Tuple<double,double>> results  = hej.runTest();
        double current, inductance;
    
        foreach(var i in results)
        {
            current = i.Item1;
            inductance = i.Item2;
            textBoxWaveformInput.Text += current.ToString() + inductance.ToString();
        }
        BindData(results);         
    }
    

    DR

    从中分析信息CSV文件以生成曲线,并基于这些文件创建趋势线。

    标记为重复:答案是关于一条直线,这些值可以在曲线上波动。

    1 回复  |  直到 6 年前
        1
  •  2
  •   TaW    6 年前

    financial statistical

    var allPoints = new List <DataPoint>();
    for (int s = 0; s < 3; s++)  // I know I have created these three series
    {
        Series ser = chartGraphic.Series["S" + (s+1)];
        allPoints.AddRange(ser.Points);
    }
    

    double xmax = allPoints.Max(x => x.XValue);
    double xmin = allPoints.Min(x => x.XValue);
    int bins = 10;
    double groupSize = (xmax - xmin) / (bins - 1);
    

    var grouped = allPoints
                    .OrderBy(x => x.XValue)
                    .GroupBy(x => groupSize * (int)(x.XValue /groupSize ))
                    .Select(x => new { xval = x.Key, yavg = x.Average(y => y.YValues[0]) })
                    .ToList();
    

     foreach (var kv in grouped) avgSeries.Points.AddXY(kv.xval + groupSize/2f, kv.yavg);
    

    enter image description here

    Markers DataPoints

    avgSeries.MarkerStyle = MarkerStyle.Cross;
    avgSeries.MarkerSize = 7;
    avgSeries.BorderWidth = 2;
    

    StripLine

    StripLine sl = new StripLine();
    sl.BackColor = Color.FromArgb(44,155,155,222);
    sl.StripWidth = groupSize;
    sl.Interval = groupSize * 2;
    sl.IntervalOffset = chartGraphic.ChartAreas[0].AxisX.IntervalOffset;
    chartGraphic.ChartAreas[0].AxisX.StripLines.Add(sl);
    

    -300 ScaleBreakStyle

    chartGraphic.ChartAreas[0].AxisY.ScaleBreakStyle.BreakLineStyle = BreakLineStyle.Wave;
    chartGraphic.ChartAreas[0].AxisY.ScaleBreakStyle.Enabled = true;