I am trying to build multiple time series data. I based my code on the accepted answer here:
A chart that creates dynamically. in.net, C #
However, I draw data for several temporary data that may come from different sources, which I designated as "tags."
After two calls to AddXY from different sources, I get a big red X, but I can not determine why this is so. My code is below, as well as the image of the big red X, if that is ambiguous, what I'm talking about.
It may be worth noting that I enter the console application and dynamically create WinForm.
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization;
using System.Windows.Forms.DataVisualization.Charting;
namespace MyApplication
{
public class ChartForm : Form
{
private System.ComponentModel.IContainer components = null;
System.Windows.Forms.DataVisualization.Charting.Chart chart1;
System.Windows.Forms.DataVisualization.Charting.Series series1;
ConcurrentDictionary<string, System.Windows.Forms.DataVisualization.Charting.Series> tagToSeriesDict;
Random r = new Random();
public ChartForm()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.tagToSeriesDict = new ConcurrentDictionary<string, System.Windows.Forms.DataVisualization.Charting.Series>();
chart1.Series.Clear();
}
[MethodImpl(MethodImplOptions.Synchronized)]
public void addPoint(string tag, double x, double y)
{
if (!tagToSeriesDict.ContainsKey(tag))
{
tagToSeriesDict[tag] = new System.Windows.Forms.DataVisualization.Charting.Series
{
Name = tag,
Color = System.Drawing.Color.FromArgb((int)(r.NextDouble() * 255), (int)(r.NextDouble() * 255), (int)(r.NextDouble() * 255)),
IsVisibleInLegend = false,
IsXValueIndexed = true,
ChartType = SeriesChartType.Line
};
this.chart1.Series.Add(tagToSeriesDict[tag]);
}
tagToSeriesDict[tag].Points.AddXY(x, y);
}
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart();
((System.ComponentModel.ISupportInitialize)(this.chart1)).BeginInit();
this.SuspendLayout();
chartArea1.Name = "ChartArea1";
this.chart1.ChartAreas.Add(chartArea1);
this.chart1.Dock = System.Windows.Forms.DockStyle.Fill;
legend1.Name = "Legend1";
this.chart1.Legends.Add(legend1);
this.chart1.Location = new System.Drawing.Point(0, 50);
this.chart1.Name = "chart1";
this.chart1.TabIndex = 0;
this.chart1.Text = "chart1";
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 600);
this.Controls.Add(this.chart1);
this.Name = "Form1";
this.Text = "Chart";
this.Load += new System.EventHandler(this.Form1_Load);
((System.ComponentModel.ISupportInitialize)(this.chart1)).EndInit();
this.ResumeLayout(false);
}
}
}
EDIT: upon request, I added code in which the form is created and in which addPoint is called:
static ChartForm plot = new ChartForm();
Application.EnableVisualStyles();
Application.Run(plot);
[MethodImpl(MethodImplOptions.Synchronized)]
public void onVisibilityChanged(object obj, System.Collections.Specialized.NotifyCollectionChangedEventArgs args)
{
KeyValuePair<string, IDistribution> tagAndState = (KeyValuePair<string, IDistribution>)args.NewItems[0];
string tag = tagAndState.Key;
double value = (double)tagAndState.Value;
double now = DateTime.UtcNow.Ticks;
TicTacToeInteraction.plot.addPoint(tag, now, value);
