C# ZedGraph使用图表线平滑移动Y轴
在下面的问题中,我有一张每秒钟插入一次数据的图表,现在我还有其他问题:C# ZedGraph使用图表线平滑移动Y轴,c#,customization,zedgraph,C#,Customization,Zedgraph,在下面的问题中,我有一张每秒钟插入一次数据的图表,现在我还有其他问题: 如何使用图表线沿Y轴(日期时间类型)平滑移动,并在图表中始终仅显示30分钟 如何格式化Y2Axis标签“HH:mm”以获得10:05、10:10、10:15、…、10:30 谢谢你的帮助 UPD1: 谢谢kmp!我尝试了你的代码-它很好,但有一个问题:当我开始时,我看到: 几分钟后,我看到这张照片: 我有一个“压缩”的图表区域,但我想静态显示始终持续30分钟,并缓慢向下移动旧数据,而不缩放或“打包”图表与轴。我希望你能理解
从最简单的开始-可以这样设置标签的格式:
myPane.Y2Axis.Scale.Format = "HH:mm";
有一种方法可以做到这一点(感觉有点不稳定,但我会让你决定),就是一旦超过阈值(在本例中超过30分钟),就从曲线上删除点。这样,图表重绘时,轴将相应更新
我觉得采用scale min值可能是一种更好的方法,但如果失败,您可以在添加点时简单地维护队列,然后在超过阈值时将其删除:
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;
}
私有队列时间;
私有静态只读随机rnd=new Random();
私有无效按钮1\u单击(对象发送者,事件参数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”,
新的PointPairList(),
颜色,红色,
SymbolType.None);
myCurve.Symbol.Fill=新填充(颜色为白色);
myCurve.IsX2Axis=真;
myCurve.IsY2Axis=真;
myPane.Chart.Fill=新填充(Color.White,Color.LightGray,45.0f);
zg1.IsShowPointValues=真;
AxistTimes=新队列();
var t=new System.Windows.Forms.Timer();
t、 间隔=1000;
t、 勾号+=显示数据;
睡眠(100);
t、 Start();
}
私有void ShowData(对象发送方、事件参数)
{
var t=(System.Windows.Forms.Timer)发送方;
t、 启用=错误;
INTX=下一个rnd(500600);
var y=新的XDate(DateTime.Now);
var myCurve=zg1.GraphPane.CurveList[0];
if(axisTimes.Any())
{
//删除任何超出时间阈值的点
而(((DateTime)y)-axisTimes.Peek()).TotalMinutes>30)
{
myCurve.RemovePoint(0);
axisTimes.Dequeue();
如果(!axisTimes.Any())
{
打破
}
}
}
//添加新点并存储添加该点的日期时间
//我们自己的队伍
排队(y);
myCurve.AddPoint(x,y);
zg1.AxisChange();
zg1.Invalidate();
t、 启用=真;
}
该轴仅显示约5分钟的数据-在显示30分钟之前它不会“移动”-将代码中的TotalMinutes值调整为2,以了解我的意思。如果我理解您的意思,此代码会将图表(轴和线)压缩到30分钟,30分钟后将“滚动”图表?是,这是正确的-它将只显示最后30分钟的数据,并放弃任何其他内容。但我希望最初显示30分钟,而不显示compess图表,直到30分钟发生。我有更新问题。如何在Y轴上创建固定标签值?现在,当每1秒插入一次新数据时,轴标签总是会更改,但我希望15:45:00、15:50:00、15:55:00。。。很抱歉,这超出了我使用ZedGraph的能力-希望其他人能帮助你。