Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ All notable changes to this project will be documented in this file.
- Code generation for escape sequences in strings (#1824)
- Axes not always honoring AbsoluteMinimum/AbsoluteMaximum and/or MinimumRange/MaximumRange properties (#1812)
- WindowsForms tracker no longer clipping outside PlotView boundaries (#1863)
- Histogram now rendering properly when using logarithmic Y axis (#740)

## [2.1.0] - 2021-10-02

Expand Down
1 change: 1 addition & 0 deletions CONTRIBUTORS
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ Elia Herzog
Elmar Strittmatter
episage <tilosag@gmail.com>
eric
Fabian Nitsche <ifab@freenet.de>
Federico Coppola <fede@silentman.it>
Francois Botha <igitur@gmail.com>
Frank Tore Sæther <frank.sather@gmail.com>
Expand Down
16 changes: 13 additions & 3 deletions Source/Examples/ExampleLibrary/Series/HistogramSeriesExamples.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@ public static PlotModel ExponentialDistribution()
return CreateExponentialDistribution();
}

[Example("Exponential Distribution (logarithmic)")]
[DocumentationExample("Series/HistogramSeries")]
public static PlotModel ExponentialDistributionLogarithmicAxis()
{
return CreateExponentialDistribution(true);
}

[Example("Label Placement")]
public static PlotModel HistogramLabelPlacement()
{
Expand Down Expand Up @@ -122,10 +129,13 @@ public CustomHistogramItem(double rangeStart, double rangeEnd, double area, int
public string Description { get; }
}

public static PlotModel CreateExponentialDistribution(double mean = 1, int n = 10000)
public static PlotModel CreateExponentialDistribution(bool logarithmicYAxis = false, double mean = 1, int n = 10000)
{
var model = new PlotModel { Title = "Exponential Distribution", Subtitle = "Uniformly distributed bins (" + n + " samples)" };
model.Axes.Add(new LinearAxis { Position = AxisPosition.Left, Title = "Frequency" });
var model = new PlotModel { Title = logarithmicYAxis ? "Exponential Distribution (logarithmic)" : "Exponential Distribution", Subtitle = "Uniformly distributed bins (" + n + " samples)" };
model.Axes.Add(
logarithmicYAxis ?
(Axis)new LogarithmicAxis { Position = AxisPosition.Left, Title = "Frequency"} :
new LinearAxis { Position = AxisPosition.Left, Title = "Frequency" });
model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Title = "x" });

Random rnd = new Random(1);
Expand Down
19 changes: 16 additions & 3 deletions Source/OxyPlot/Series/HistogramSeries.cs
Original file line number Diff line number Diff line change
Expand Up @@ -244,8 +244,16 @@ protected internal void UpdateMaxMinXY()
{
this.MinX = Math.Min(this.ActualItems.Min(r => r.RangeStart), this.ActualItems.Min(r => r.RangeEnd));
this.MaxX = Math.Max(this.ActualItems.Max(r => r.RangeStart), this.ActualItems.Max(r => r.RangeEnd));
this.MinY = Math.Min(this.ActualItems.Min(r => 0), this.ActualItems.Min(r => r.Height));
this.MaxY = Math.Max(this.ActualItems.Max(r => 0), this.ActualItems.Max(r => r.Height));
if (this.YAxis.IsLogarithmic())
{
this.MinY = Math.Max(this.ActualItems.Min(r => r.Height), double.Epsilon);
this.MaxY = Math.Max(this.ActualItems.Max(r => r.Height), double.Epsilon);
}
else
{
this.MinY = Math.Min(this.ActualItems.Min(r => 0), this.ActualItems.Min(r => r.Height));
this.MaxY = Math.Max(this.ActualItems.Max(r => 0), this.ActualItems.Max(r => r.Height));
}
}
}

Expand Down Expand Up @@ -295,10 +303,15 @@ protected void RenderBins(IRenderContext rc, ICollection<HistogramItem> items)
{
foreach (var item in items)
{
if (this.YAxis.IsLogarithmic() && !this.YAxis.IsValidValue(item.Height))
{
continue;
}

var actualFillColor = this.GetItemFillColor(item);

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

var rectrect = new OxyRect(p1, p2);
Expand Down