Skip to content

Commit 71bc6fc

Browse files
Add demo for logarithmic histogram plotting and fix rendering (oxyplot#740) (oxyplot#1886)
* Add demo for logarithmic histogram plotting and fix rendering (oxyplot#740) * Fix UpdateMinMax for logarithmic scale in HistogramSeries. * Omit invalid values in HistogramSeries when using logarithmic scale. * Fix typo in UpdateMaxMinXY for HistogramSeries.
1 parent f361345 commit 71bc6fc

4 files changed

Lines changed: 31 additions & 6 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ All notable changes to this project will be documented in this file.
2525
- Code generation for escape sequences in strings (#1824)
2626
- Axes not always honoring AbsoluteMinimum/AbsoluteMaximum and/or MinimumRange/MaximumRange properties (#1812)
2727
- WindowsForms tracker no longer clipping outside PlotView boundaries (#1863)
28+
- Histogram now rendering properly when using logarithmic Y axis (#740)
2829

2930
## [2.1.0] - 2021-10-02
3031

CONTRIBUTORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ Elia Herzog
5050
Elmar Strittmatter
5151
episage <tilosag@gmail.com>
5252
eric
53+
Fabian Nitsche <ifab@freenet.de>
5354
Federico Coppola <fede@silentman.it>
5455
Francois Botha <igitur@gmail.com>
5556
Frank Tore Sæther <frank.sather@gmail.com>

Source/Examples/ExampleLibrary/Series/HistogramSeriesExamples.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ public static PlotModel ExponentialDistribution()
2929
return CreateExponentialDistribution();
3030
}
3131

32+
[Example("Exponential Distribution (logarithmic)")]
33+
[DocumentationExample("Series/HistogramSeries")]
34+
public static PlotModel ExponentialDistributionLogarithmicAxis()
35+
{
36+
return CreateExponentialDistribution(true);
37+
}
38+
3239
[Example("Label Placement")]
3340
public static PlotModel HistogramLabelPlacement()
3441
{
@@ -122,10 +129,13 @@ public CustomHistogramItem(double rangeStart, double rangeEnd, double area, int
122129
public string Description { get; }
123130
}
124131

125-
public static PlotModel CreateExponentialDistribution(double mean = 1, int n = 10000)
132+
public static PlotModel CreateExponentialDistribution(bool logarithmicYAxis = false, double mean = 1, int n = 10000)
126133
{
127-
var model = new PlotModel { Title = "Exponential Distribution", Subtitle = "Uniformly distributed bins (" + n + " samples)" };
128-
model.Axes.Add(new LinearAxis { Position = AxisPosition.Left, Title = "Frequency" });
134+
var model = new PlotModel { Title = logarithmicYAxis ? "Exponential Distribution (logarithmic)" : "Exponential Distribution", Subtitle = "Uniformly distributed bins (" + n + " samples)" };
135+
model.Axes.Add(
136+
logarithmicYAxis ?
137+
(Axis)new LogarithmicAxis { Position = AxisPosition.Left, Title = "Frequency"} :
138+
new LinearAxis { Position = AxisPosition.Left, Title = "Frequency" });
129139
model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Title = "x" });
130140

131141
Random rnd = new Random(1);

Source/OxyPlot/Series/HistogramSeries.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,8 +244,16 @@ protected internal void UpdateMaxMinXY()
244244
{
245245
this.MinX = Math.Min(this.ActualItems.Min(r => r.RangeStart), this.ActualItems.Min(r => r.RangeEnd));
246246
this.MaxX = Math.Max(this.ActualItems.Max(r => r.RangeStart), this.ActualItems.Max(r => r.RangeEnd));
247-
this.MinY = Math.Min(this.ActualItems.Min(r => 0), this.ActualItems.Min(r => r.Height));
248-
this.MaxY = Math.Max(this.ActualItems.Max(r => 0), this.ActualItems.Max(r => r.Height));
247+
if (this.YAxis.IsLogarithmic())
248+
{
249+
this.MinY = Math.Max(this.ActualItems.Min(r => r.Height), double.Epsilon);
250+
this.MaxY = Math.Max(this.ActualItems.Max(r => r.Height), double.Epsilon);
251+
}
252+
else
253+
{
254+
this.MinY = Math.Min(this.ActualItems.Min(r => 0), this.ActualItems.Min(r => r.Height));
255+
this.MaxY = Math.Max(this.ActualItems.Max(r => 0), this.ActualItems.Max(r => r.Height));
256+
}
249257
}
250258
}
251259

@@ -295,10 +303,15 @@ protected void RenderBins(IRenderContext rc, ICollection<HistogramItem> items)
295303
{
296304
foreach (var item in items)
297305
{
306+
if (this.YAxis.IsLogarithmic() && !this.YAxis.IsValidValue(item.Height))
307+
{
308+
continue;
309+
}
310+
298311
var actualFillColor = this.GetItemFillColor(item);
299312

300313
// transform the data points to screen points
301-
var p1 = this.Transform(item.RangeStart, 0);
314+
var p1 = this.Transform(item.RangeStart, this.YAxis.IsLogarithmic() ? double.Epsilon : 0);
302315
var p2 = this.Transform(item.RangeEnd, item.Height);
303316

304317
var rectrect = new OxyRect(p1, p2);

0 commit comments

Comments
 (0)