Как сделать так, чтобы ось X разделялась на 2 диаграммы в WPF в D3?

Я хочу разместить 2 графика один под другим. И я хочу, чтобы они имели общую ось X. Поэтому, когда я перемещаю верхнюю диаграмму, перемещается и нижняя, то же самое для увеличения. Я обнаружил, что это реализовано в библиотеке динамического отображения данных для Silverlight. И реализовано очень хорошо. Здесь вы можете увидеть реализацию. "Синхронизированные цифры". Я хочу того же. Как мне это сделать?

2 ответа

Решение

Хорошо. Я нашел решение. Это работает немного не так, но это нормально. Если вы хотите иметь общую ось X, вам нужно сделать следующее:

// Add handler
        SpeedChart.Viewport.PropertyChanged += new EventHandler<ExtendedPropertyChangedEventArgs>(Viewport_PropertyChanged);


// Respond to changes
        void Viewport_PropertyChanged(object sender, ExtendedPropertyChangedEventArgs e)
        {
            if (e.PropertyName == "Visible")
            {
                StrokeChart.Viewport.Visible = new DataRect(SpeedChart.Viewport.Visible.XMin, StrokeChart.Viewport.Visible.YMin, SpeedChart.Viewport.Visible.Width, StrokeChart.Viewport.Visible.Height);
            }
        }

Затем вы должны удалить MouseNavigation и HorizontalAxisNavigation из StrokeChart. Проблема в том, что точки на StrokeChart сначала не видны, потому что диапазон по оси Y неверен. Но вы можете масштабировать и перетаскивать ось Y только для получения правильных значений. Если вы знаете, как решить проблему с диапазонами, пожалуйста, дайте мне знать. Спасибо

void Viewport_PropertyChanged(object sender, ExtendedPropertyChangedEventArgs e)
{
    if (e.PropertyName == "Visible")
    {
        if((sender as Viewport2D).Plotter==plotter)
            plotter2.Viewport.Visible = new DataRect(plotter.Viewport.Visible.XMin, plotter2.Viewport.Visible.YMin, plotter.Viewport.Visible.Width, plotter2.Viewport.Visible.Height);
        else if ((sender as Viewport2D).Plotter == plotter2)
                plotter.Viewport.Visible = new DataRect(plotter2.Viewport.Visible.XMin, plotter.Viewport.Visible.YMin, plotter2.Viewport.Visible.Width, plotter.Viewport.Visible.Height);
    }
}


private void Window1_Loaded(object sender, RoutedEventArgs e)
{
    // Add handler
    plotter.Viewport.PropertyChanged += new EventHandler<ExtendedPropertyChangedEventArgs>(Viewport_PropertyChanged);
    plotter2.Viewport.PropertyChanged += new EventHandler<ExtendedPropertyChangedEventArgs>(Viewport_PropertyChanged);
}

Полное соединение двух графиков. Дополнение к предыдущему тексту.

Другие вопросы по тегам