Динамическое отображение данных: изменение диапазона оси Y - PullRequest
4 голосов
/ 07 марта 2012

Кто-нибудь знает, есть ли способ изменить пределы оси Y на линейном графике с D3?

Я использую последнюю версию из источника Codeplex ... WPF, а не версию Silverlight.

Я строю показания с датчиков Android, и значения диапазона меняются совсем немного. Иногда это около нуля, и график выглядит так:

Ranging from -0.05 to +0.05

Затем величина значений изменяется, и ось Y масштабируется, чтобы показать все данные, и график теперь выглядит так:

Ranging from -0.8 to + 0.6

Посмотрите, как сильно изменились значения Y с рисунка 1 на 2.

Я хочу сделать ось Y с фиксированными значениями, которые я выберу, скажем, от -10 до +10. Тогда график будет строиться всегда с одинаковым масштабом.

Есть ли способ сделать это?

Код XAML для графика:

    <d3:ChartPlotter
        Name="gyroGraph"
        Margin="21,5,10,0"
        Grid.ColumnSpan="2"
        Background="White"
        Grid.Row="1"
        LegendVisibility="Collapsed"
        NewLegendVisible="False"
        MainHorizontalAxisVisibility="Collapsed"
        MainVerticalAxisVisibility="Collapsed">
        <d3:VerticalAxis
            FontSize="8" />
        <d3:Header
            Content="Angular Velocity"
            FontSize="11" />
    </d3:ChartPlotter>

Спасибо и всего наилучшего, Родриго Басняк

Ответы [ 3 ]

6 голосов
/ 11 июня 2013

Надеюсь, еще не поздно, но я столкнулся с той же проблемой и нашел решение на форуме d3: http://dynamicdatadisplay.codeplex.com/discussions/281164

Код был создан пользователем d3 'fromDKwithlove'.

Вот как вы должны применить ограничение:

ViewportAxesRangeRestriction restr = new ViewportAxesRangeRestriction();
restr.YRange = new DisplayRange(-5, 105);
plotter.Viewport.Restrictions.Add(restr);

И это класс (ы), стоящий за кодом:

public class DisplayRange
{
    public double Start { get; set; }
    public double End { get; set; }

    public DisplayRange(double start, double end)
    {
        Start = start;
        End = end;
    }
}

public class ViewportAxesRangeRestriction : IViewportRestriction
{
    public DisplayRange XRange = null;
    public DisplayRange YRange = null;

    public Rect Apply(Rect oldVisible, Rect newVisible, Viewport2D viewport)
    {
        if (XRange != null)
        {
            newVisible.X = XRange.Start;
            newVisible.Width = XRange.End - XRange.Start;
        }

        if (YRange != null)
        {
            newVisible.Y = YRange.Start;
            newVisible.Height = YRange.End - YRange.Start;
        }

        return newVisible;
    }

    public event EventHandler Changed;
}
2 голосов
/ 08 марта 2012

Я не уверен в том, какое именно поведение вы хотите - возможно, вы сможете уточнить, если это необходимо.
Мне понадобилась фиксированная начальная ось с определенным значением в FitToView, чтобы, когда график вырастал по начальной оси, ось автоматически изменяла размеры сзатем на.
Для достижения этого я использовал FitToViewRestriction с DomainRestriction:

<d3:ChartPlotter.FitToViewRestrictions>
    <d3:DomainRestriction Domain="0,0,10,14000"/>
</d3:ChartPlotter.FitToViewRestrictions>

Здесь прямоугольник домена - это начальный прямоугольник порта вида, который определяет начальные пределы оси.Установка FitToView означает, что ось масштабируется, когда график выходит за пределы этого начального предела.

Обратите внимание, однако, что в используемой нами версии D3 (0.3.4703.0) имплементация DomainRestriction не была реализована. Apply не дал мне нужного мне поведения, поэтому было необходимо изменить исходный код.Соответствующий файл - DynamicDataDisplay \ v0.3.4703 - Nightly src \ src \ DynamicDataDisplay \ ViewportRestrictions \ DomainRestrictions.cs.
Я изменил DomainRestriction. Применяется к:

public override DataRect Apply(DataRect oldDataRect, DataRect newDataRect, Viewport2D viewport) {
    return (domain.IsEmpty) ? newDataRect : DataRect.Union(newDataRect, domain);
}

, что дает описанный мной опыт.Я думаю, что вы хотите что-то подобное, но это относится только к оси х.Т.е. вы хотите, чтобы значение y оставалось фиксированным на его начальном значении, но вы хотите, чтобы значение x масштабировалось по мере поступления данных с FitToView.Просто измените описанный выше метод, и вы сможете получить такое поведение.

0 голосов
/ 24 октября 2013

Если вы хотите сделать то же самое для DateTime, просто измените создание объекта DisplayRange следующим образом:

ViewportAxesRangeRestriction r = new ViewportAxesRangeRestriction
{
  YRange = new DisplayRange(vm.MinTemp, vm.MaxTemp),
  XRange = new DisplayRange(DateTimeAxis.ConvertToDouble(vm.StartTime), DateTimeAxis.ConvertToDouble(vm.EndDate))
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...