Вопрос по c#, customization, zedgraph – ZedGraph плавно перемещает ось Y2 с линией графика
Следуя моему вопросу& quot; Пользовательский граф ZedGraph & quot; У меня есть график с каждой второй вставкой данных, теперь у меня есть другие вопросы:
How to smoothly move down Y2Axis (DateTime type) with a chart line and show in chart always only last 30 minutes?
How to format Y2Axis labels "HH:mm" to get 10:05, 10:10, 10:15, ..., 10:30?
Спасибо за помощь!
UPD1:
Thanks kmp! I try your code - its good, but with issue: when I started I see this:
Когда через несколько минут я вижу эту картину:
У меня есть «сжатие» области графика, но я хочу, чтобы статически показывалось всегда последние 30 минут и медленно перемещаться вниз по старым данным, без масштабирования или «упаковки» диаграмма с осью. Надеюсь, ты меня понимаешь.
UPD2:
Yet another issue - labels of Y2Axis haven't fixed values. For example now:
И через несколько секунд:
myPane.Y2Axis.Scale.Format = "HH:mm";
Один из способов сделать это (и это выглядит немного странно, но я позволю вам принять решение) - просто удалить точки из кривой, как только они выйдут за пределы вашего порога (в этом случае более 30 минут). Таким образом, когда диаграмма перерисовывается, ось будет обновляться соответствующим образом.
Я чувствую, что взятие значения шкалы 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;
}