Skip to content

Add C# bindings for statistical charts, improve optional argument APIs #316

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Jul 26, 2022

Conversation

kMutagene
Copy link
Collaborator

@kMutagene kMutagene commented Jul 4, 2022

This PR adds C# bindings for the following charts:

  • Histogram
  • Histogram2D
  • BoxPlot
  • Violin
  • Histogram2DContour
  • PointDensity
  • DensityMapbox
  • ContourCarpet

It also improves the optional argument usage to allow both value and reference types as generics where this is possible in the core API

Some GenericChart extension emthods were also added.

In general, the chart support matrix now looks like this:

(https://github.com/plotly/Plotly.NET/blob/329c50dbb8a8716800978b4e9f54a12286897ee6/tests/Plotly.NET.Tests.CSharpConsole/Program.cs)

image

@WhiteBlackGoose

Copy link
Contributor

@WhiteBlackGoose WhiteBlackGoose left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, by C# convention parameter names should be camel case. I don't think it's important, but in case you didn't know this

/// <param name="HoverLabel">Sets the style of the hoverlabels of this trace.</param>
/// <param name="UseDefaults">If set to false, ignore the global default settings set in `Defaults`</param>
public static GenericChart.GenericChart Histogram<XType, YType, TextType>(
[Optional] IEnumerable<XType>? X,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this optional?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can visualize histograms across either x or y dimension, this is implemented the same in the core API

Comment on lines 79 to 80
int? Width,
int? Height
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why removed null?

Comment on lines 121 to 149
string? TitleText,
Font? TitleFont,
int? TitleStandoff,
Title? Title,
Color? Color,
StyleParam.AxisType? AxisType,
Tuple<MinType, MaxType>? MinMax,
StyleParam.Mirror? Mirror,
bool? ShowSpikes,
Color? SpikeColor,
int? SpikeThickness,
bool? ShowLine,
Color? LineColor,
bool? ShowGrid,
Color? GridColor,
bool? ZeroLine,
Color? ZeroLineColor,
StyleParam.LinearAxisId? Anchor,
StyleParam.Side? Side,
StyleParam.LinearAxisId? Overlaying,
Tuple<double, double>? Domain,
double? Position,
StyleParam.CategoryOrder? CategoryOrder,
IEnumerable<CategoryArrayType>? CategoryArray,
RangeSlider? RangeSlider,
RangeSelector? RangeSelector,
Color? BackgroundColor,
bool? ShowBackground,
StyleParam.SubPlotId? Id
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't those be [Optional]?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh absolutely

Comment on lines 225 to 253
string? TitleText,
Font? TitleFont,
int? TitleStandoff,
Title? Title,
Color? Color,
StyleParam.AxisType? AxisType,
Tuple<MinType, MaxType>? MinMax,
StyleParam.Mirror? Mirror,
bool? ShowSpikes,
Color? SpikeColor,
int? SpikeThickness,
bool? ShowLine,
Color? LineColor,
bool? ShowGrid,
Color? GridColor,
bool? ZeroLine,
Color? ZeroLineColor,
StyleParam.LinearAxisId? Anchor,
StyleParam.Side? Side,
StyleParam.LinearAxisId? Overlaying,
Tuple<double, double>? Domain,
double? Position,
StyleParam.CategoryOrder? CategoryOrder,
IEnumerable<CategoryArrayType>? CategoryArray,
RangeSlider? RangeSlider,
RangeSelector? RangeSelector,
Color? BackgroundColor,
bool? ShowBackground,
StyleParam.SubPlotId? Id
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

here too

Comment on lines 18 to 27
static internal Microsoft.FSharp.Core.FSharpOption<T> ToOption<T>(this T? thing) => thing is null ? Microsoft.FSharp.Core.FSharpOption<T>.None : new(thing);
static internal Microsoft.FSharp.Core.FSharpOption<T> ToOption<T>(this T? thing) {
if (EqualityComparer<T>.Default.Equals(thing, default(T)))
{
return FSharpOption<T>.None;
}
else
{
return new(thing);
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this change? T? is not nullable if T is a value type

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i dont remember the exact repro for this, but iirc without this default check i have gotten default values for non-nullable generic types instead of None

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uhhhh I see the problem. But if you do it this way, a valid 0 will still be interpreted as default

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well if i revert this, this line gets me the following wrongly set defaults instead of None:

Chart.Column<int,string,string>(
    values: new int [] { 3,4 },
    Keys: new string [] { "first", "second"}
)
"base":0,"width":0,

which leads to an empty graph (width = 0). This is a problem only when a single value is set, collections do not have this default value problem. So the defaults that get omitted are 0, 0.0, "", and false, and that only when we are talking about generics. I would argue that this is better than charts that are invisible per default.

@kMutagene
Copy link
Collaborator Author

Also, by C# convention parameter names should be camel case. I don't think it's important, but in case you didn't know this

My initial rationale here was to name the arguments exacly the same as in the core API, might change this later though

@JakeRadMSFT
Copy link
Contributor

Awesome! I was just coming here to check the status of Histogram!

@kMutagene
Copy link
Collaborator Author

Waiting on some feedback on #322 before i proceed to adapt the API surface in this PR

@kMutagene
Copy link
Collaborator Author

Ill leave #322 up for now, but decided to just use the custom optional type everywhere for now.

@kMutagene kMutagene merged commit a7b492f into dev Jul 26, 2022
@kMutagene kMutagene mentioned this pull request Jul 28, 2022
93 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants