I am using the oxyplot lib to create timeseries Charts. I am trying to create a plot which has the same y-axis on both sides, it works fine as long as I am not interacting with the plot to zoom or pan, here is my code
model.Axes.Add(new LinearAxis()
{
MajorStep = 0.1,
Minimum = 0,
Maximum = 1,
Position = AxisPosition.Left,
Title = "Title Axis",
AxisTitleDistance = 10
});
model.Axes.Add(new LinearAxis()
{
Key = "RightYAxis"
MajorStep = 0.1,
Minimum = 0,
Maximum = 1,
Position = AxisPosition.Right
});
DateTimeAxis dta = new DateTimeAxis()
{
Key = "DateTimeAxis",
IntervalType = SetDateTimeIntervalType(minDate, maxDate),
StringFormat = "dd/MM/yyyy",
Position = AxisPosition.Bottom,
Minimum = DateTimeAxis.ToDouble(minDate),
Maximum = DateTimeAxis.ToDouble(maxDate),
Title = "Date",
AxisTitleDistance = 10
};
dta.AxisChanged += new EventHandler<AxisChangedEventArgs>(AxisChanged);
model.Axes.Add(dta);
When I interact with the plot, only the left y axis and the bottom axis are scaling appropriately. When I add the right y axis before the left y axis, the bottom and right side axis are scaling.
What setting do I need to set, to scale both y axis accordingly and not just one?
I don't think that there is a build-in setting for this. I had similar problem in the past and also looked for such a feature but didn't find one. Also there is no such example in the OxyPlot demo browser. The straight forward - yet not very elegant way - is to attach an event handler also to the left axis which sets the minimum and maximum to the right one. Your example would then look like this:
Axis leftAxis = new LinearAxis()
{
MajorStep = 0.1,
Minimum = 0,
Maximum = 1,
Position = AxisPosition.Left,
Title = "Title Axis",
AxisTitleDistance = 10
});
leftAxis.AxisChanged += LeftAxis_AxisChanged;
model.Axes.Add(leftAxis);
model.Axes.Add(new LinearAxis()
{
Key = "RightYAxis"
MajorStep = 0.1,
Minimum = 0,
Maximum = 1,
Position = AxisPosition.Right
});
DateTimeAxis dta = new DateTimeAxis()
{
Key = "DateTimeAxis",
IntervalType = SetDateTimeIntervalType(minDate, maxDate),
StringFormat = "dd/MM/yyyy",
Position = AxisPosition.Bottom,
Minimum = DateTimeAxis.ToDouble(minDate),
Maximum = DateTimeAxis.ToDouble(maxDate),
Title = "Date",
AxisTitleDistance = 10
};
dta.AxisChanged += new EventHandler<AxisChangedEventArgs>(AxisChanged);
model.Axes.Add(dta);
with the event handler looking like
private void LeftAxis_AxisChanged(object sender, AxisChangedEventArgs e)
{
Axis leftAxis = sender as Axis;
Axis rightAxis = leftAxis.PlotModel.Axes.First(a => a.Position == AxisPosition.Right);
rightAxis.Maximum = leftAxis.ActualMaximum;
rightAxis.Minimum = leftAxis.ActualMinimum;
}