ama*_*nth 6 c# charts customization zedgraph
我想用动态图表制作ZedGraph:
如何使ZedGraph轴反转和时间轴?谢谢
UPD 1:我必须尝试使用以下代码:
GraphPane myPane = zg1.GraphPane;
myPane.YAxis.Type = AxisType.Date;
myPane.YAxis.Scale.MajorUnit = DateUnit.Minute;
myPane.YAxis.Scale.MinorUnit = DateUnit.Second;
myPane.XAxis.IsVisible = false;
myPane.X2Axis.IsVisible = true;
myPane.X2Axis.MajorGrid.IsVisible = true;
myPane.X2Axis.Scale.Min = 0;
myPane.X2Axis.Scale.Max = 600;
myPane.YAxis.Scale.Format = "HH:mm:ss";
PointPairList list = new PointPairList();
PointPairList list2 = new PointPairList();
for (int i = 0; i < 36; i++)
{
double x = (double)i * 5.0;
double y = (double)new XDate(DateTime.Now.AddSeconds(i));
list.Add(y, x);
//list2.Add(y2, x);
listBox1.Items.Add("x = " + x + " y = " + y);
}
// Generate a red curve with diamond symbols, and "Alpha" in the legend
LineItem myCurve = myPane.AddCurve("Alpha",
list, Color.Red, SymbolType.None);
// Fill the symbols with white
myCurve.Symbol.Fill = new Fill(Color.White);
myPane.Y2Axis.MajorGrid.IsVisible = true;
// Align the Y2 axis labels so they are flush to the axis
myPane.Y2Axis.Scale.Align = AlignP.Inside;
// Fill the axis background with a gradient
myPane.Chart.Fill = new Fill(Color.White, Color.LightGray, 45.0f);
zg1.IsShowPointValues = true;
zg1.AxisChange();
// Make sure the Graph gets redrawn
zg1.Invalidate();
Run Code Online (Sandbox Code Playgroud)
但是我错了:

UPD2:
我有多线程的代码:
private TimerCallback ReadTimerCallback;
private LineItem myCurve;
private Random rnd = new Random(500);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
GraphPane myPane = zg1.GraphPane;
myPane.XAxis.IsVisible = false;
myPane.X2Axis.IsVisible = true;
myPane.X2Axis.MajorGrid.IsVisible = true;
myPane.X2Axis.Scale.Min = 0;
myPane.X2Axis.Scale.Max = 600;
myPane.YAxis.IsVisible = false;
myPane.Y2Axis.IsVisible = true;
myPane.Y2Axis.Scale.MajorUnit = DateUnit.Minute;
myPane.Y2Axis.Scale.MinorUnit = DateUnit.Second;
myPane.Y2Axis.Scale.Format = "HH:mm:ss";
myPane.Y2Axis.Type = AxisType.DateAsOrdinal;
// As we get more data we want to add it on to the end of the curve
// and we also want to get the scale so that we can shift it along
double? oringinalLastDate;
XDate firstDate;
if (myPane.CurveList.Count == 0)
{
myCurve = myPane.AddCurve("Alpha",
new PointPairList(),
Color.Red,
SymbolType.None);
firstDate = new XDate(DateTime.Now);
oringinalLastDate = null;
}
else
{
myCurve = (LineItem)myPane.CurveList[0];
firstDate = myCurve.Points[myCurve.Points.Count - 1].Y;
oringinalLastDate = myPane.Y2Axis.Scale.Max;
}
/*for (int i = 0; i < 36; i++)
{
double x = i * 5.0;
firstDate.AddSeconds(i);
myCurve.AddPoint(x, firstDate);
//listBox1.Items.Add("x = " + x + " y = " + firstDate);
}*/
myCurve.Symbol.Fill = new Fill(Color.White);
myCurve.IsX2Axis = true;
myCurve.IsY2Axis = true;
//myPane.Y2Axis.Scale.IsReverse = true;
myPane.Chart.Fill = new Fill(Color.White, Color.LightGray, 45.0f);
zg1.IsShowPointValues = true;
// Now make the minimum of the scale, the maximum that it was so
// the graph shifts
if (oringinalLastDate.HasValue)
myPane.Y2Axis.Scale.Min = oringinalLastDate.Value;
zg1.AxisChange();
zg1.Invalidate();
AutoResetEvent ReadautoEvent = new AutoResetEvent(false);
ReadTimerCallback = new TimerCallback(this.ShowData);
System.Threading.Timer timer = new System.Threading.Timer(ReadTimerCallback, ReadautoEvent, 100, 1000);
}
private void ShowData (object Object )
{
this.myCurve.AddPoint(rnd.Next(500, 600), new XDate(DateTime.Now));
}
Run Code Online (Sandbox Code Playgroud)
UPD3:我想向下移动Y轴,而不是缩放此轴.我只更新了图表1分钟:

我认为您想要 DateAsOrdinal (而不是 Date)来为您提供更好的日期表示(尽管如果您对此感到满意,则可能不会),并且您需要将曲线上的 IsX2Axis 和 IsY2Axis 属性设置为 true。
这是您的代码的更新版本,它显示了我的意思 - 这是您需要的吗?(它不会像您在给定数据值的情况下绘制的那样是一条波浪线,并且 x 轴刻度从 0 开始,而不是您绘图中的 100,但这是因为您的代码已将其显式设置为 0,所以我假设这就是您的想)。
每次调用时,它总是会附加更多数据(我假设您从按钮1调用它),并且它将移动轴的最小值,以便您仅显示最新的数据位 - 如果您不这样做设置最小值,您将看到一条摆动线,因为它显示了所有数据。
GraphPane myPane = zg1.GraphPane;
myPane.XAxis.IsVisible = false;
myPane.X2Axis.IsVisible = true;
myPane.X2Axis.MajorGrid.IsVisible = true;
myPane.X2Axis.Scale.Min = 0;
myPane.X2Axis.Scale.Max = 600;
myPane.YAxis.IsVisible = false;
myPane.Y2Axis.IsVisible = true;
myPane.Y2Axis.Scale.MajorUnit = DateUnit.Minute;
myPane.Y2Axis.Scale.MinorUnit = DateUnit.Second;
myPane.Y2Axis.Scale.Format = "HH:mm:ss";
myPane.Y2Axis.Type = AxisType.DateAsOrdinal;
// As we get more data we want to add it on to the end of the curve
// and we also want to get the scale so that we can shift it along
double? oringinalLastDate;
XDate firstDate;
LineItem myCurve;
if(myPane.CurveList.Count == 0)
{
myCurve = myPane.AddCurve("Alpha",
new PointPairList(),
Color.Red,
SymbolType.None);
firstDate = new XDate(DateTime.Now);
oringinalLastDate = null;
}
else
{
myCurve = (LineItem)myPane.CurveList[0];
firstDate = myCurve.Points[myCurve.Points.Count - 1].Y;
oringinalLastDate = myPane.Y2Axis.Scale.Max;
}
for (int i = 0; i < 36; i++)
{
double x = i * 5.0;
firstDate.AddSeconds(i);
myCurve.AddPoint(x, firstDate);
listBox1.Items.Add("x = " + x + " y = " + firstDate);
}
myCurve.Symbol.Fill = new Fill(Color.White);
myCurve.IsX2Axis = true;
myCurve.IsY2Axis = true;
myPane.Chart.Fill = new Fill(Color.White, Color.LightGray, 45.0f);
zg1.IsShowPointValues = true;
// Now make the minimum of the scale, the maximum that it was so
// the graph shifts
if (oringinalLastDate.HasValue)
myPane.Y2Axis.Scale.Min = oringinalLastDate.Value;
zg1.AxisChange();
zg1.Invalidate();
Run Code Online (Sandbox Code Playgroud)
更新
如果您想使用 500 到 600 之间的随机数每秒更新一次图表,则应该这样做(每添加 3 个点后,y 轴上的刻度就会随之移动):
private int pointCount;
private double? scaleMin = null;
private static readonly Random rnd = new Random();
private void button1_Click(object sender, EventArgs e)
{
GraphPane myPane = zg1.GraphPane;
myPane.XAxis.IsVisible = false;
myPane.X2Axis.IsVisible = true;
myPane.X2Axis.MajorGrid.IsVisible = true;
myPane.X2Axis.Scale.Min = 0;
myPane.X2Axis.Scale.Max = 600;
myPane.YAxis.IsVisible = false;
myPane.Y2Axis.IsVisible = true;
myPane.Y2Axis.Scale.MajorUnit = DateUnit.Minute;
myPane.Y2Axis.Scale.MinorUnit = DateUnit.Second;
myPane.Y2Axis.Scale.Format = "HH:mm:ss";
myPane.Y2Axis.Type = AxisType.DateAsOrdinal;
LineItem myCurve = myPane.AddCurve("Alpha",
new PointPairList(),
Color.Red,
SymbolType.None);
myCurve.Symbol.Fill = new Fill(Color.White);
myCurve.IsX2Axis = true;
myCurve.IsY2Axis = true;
myPane.Chart.Fill = new Fill(Color.White, Color.LightGray, 45.0f);
zg1.IsShowPointValues = true;
pointCount = 0;
var t = new System.Windows.Forms.Timer();
t.Interval = 1000;
t.Tick += ShowData;
Thread.Sleep(100);
t.Start();
}
private void ShowData(object sender, EventArgs e)
{
var t = (System.Windows.Forms.Timer) sender;
t.Enabled = false;
pointCount++;
int x = rnd.Next(500, 600);
var y = new XDate(DateTime.Now);
GraphPane myPane = zg1.GraphPane;
if (scaleMin == null) scaleMin = myPane.Y2Axis.Scale.Max;
LineItem myCurve = (LineItem)myPane.CurveList[0];
myCurve.AddPoint(x, y);
// After 3 points are added move the scale along
if (pointCount > 3)
{
myPane.Y2Axis.Scale.Min = scaleMin.Value;
scaleMin = myPane.Y2Axis.Scale.Max;
}
zg1.AxisChange();
zg1.Invalidate();
t.Enabled = true;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5810 次 |
| 最近记录: |