在下面我的问题“ZedGraph自定义图表”我有DATAS的每一秒插入图表,现在我有其他问题:
如何顺利与图表线向下移动Y2Axis(DateTime类型),并以图表显示永远只有最后30分钟?
如何格式化Y2Axis标签 “HH:MM” 得到10:05,10:10,10:15,......,10:30?
感谢帮助!
UPD1:谢谢KMP! 我尝试你的代码 - 它的好,但问题:当我开始我看到这一点: 当几分钟后,我看到这样的画面:
我有一个图表区域的“压缩”,但我想总是静态过去30分钟,慢慢地显示下移老DATAS,无需缩放或“包装”的图表与轴的。 我希望你能理解我。
UPD2:还有一个问题- Y2Axis的标签都没有固定的值。 比如现在:
而几秒钟后:
从最简单的开始 - 格式化标签可以像这样做:
myPane.Y2Axis.Scale.Format = "HH:mm";
一种方法可以做到这一点(和感觉有点片状,但我会让你决定)是简单地从曲线上删除点,一旦他们超越你的阈值(在这种情况下超过30分钟)。 当图表重绘轴将相应地更新的方式。
我觉得像走规模最小的值可能比这更好的办法,但做不到这一点,你可以简单地保持队列为你加分,像这样,然后删除他们,当他们超越你的门槛:
private Queue<DateTime> axisTimes;
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";
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;
axisTimes = new Queue<DateTime>();
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;
int x = rnd.Next(500, 600);
var y = new XDate(DateTime.Now);
var myCurve = zg1.GraphPane.CurveList[0];
if (axisTimes.Any())
{
// Remove any points that go beyond our time threshold
while ((((DateTime)y) - axisTimes.Peek()).TotalMinutes > 30)
{
myCurve.RemovePoint(0);
axisTimes.Dequeue();
if (!axisTimes.Any())
{
break;
}
}
}
// Add the new point and store the datetime that it was added in
// our own queue
axisTimes.Enqueue(y);
myCurve.AddPoint(x, y);
zg1.AxisChange();
zg1.Invalidate();
t.Enabled = true;
}