Как сделать так, чтобы ось 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);
}
Полное соединение двух графиков. Дополнение к предыдущему тексту.