Using DistributionChart
, you can choose among several styles aka ChartElementFunction
:
ChartElementData["DistributionChart"]
{"Density", "DensityQuantile", "FadingQuantile",
"GlassQuantile", "HistogramDensity", "LineDensity", "PointDensity",
"Quantile", "SmoothDensity"}
Is there a way to control their parameters? The documentation does not seem to say.
The problem is that the defaults are less than optimal for my data. Consider these:
Using SmoothDensity
:
Using HistogramDensity
:
Using LineDensity
:
Clearly, SmoothDensity
grossly misrepresents the data (just compare with the LineDensity
version); the violins should all look like the ones for 2 and 9. HistogramDensity
does a better job but its resolution is horrible; there are 100 data points per size, about 70 of which fall into the upper class -- that should be plenty of points to draw more bars.
I would like to tell HistogramDensity
to use more/smaller bins, and/or SmoothDensity
to smooth less. How is this possible?
Answer
To get the options available for various ChartElementDataFunction
s you can use:
{#, Column[ChartElementData[#, "Options"]]} & /@
ChartElementData["DistributionChart"] // Grid[#, Frame -> All] &
For "HistogramDensity"
, any bin specification accepted by Histogram > MoreInformation
can be used as the setting for the suboption "Bins"
:
data = Table[RandomVariate[NormalDistribution[RandomInteger[5], 1], 100], {3}];
Partition[Table[DistributionChart[data, ChartStyle -> "SolarColors",
ChartElementFunction -> (ChartElementDataFunction["HistogramDensity", "Bins" -> i]),
PlotLabel -> Row[{"\"Bins\"", "->", ToString@i}], ImageSize -> 200],
{i, {10, 5, {.3}, {0, 8, .5}, {{0, 1, 2, 5, 6, 8}},
Automatic, "Sturges", "Scott", "FreedmanDiaconis", "Knuth",
"Wand", "Log",
{"Log", "Sturges"}, {"Log", "Scott"}, {"Log",
"FreedmanDiaconis"}, {"Log", "Knuth"}}}], 4] //
Grid[#, Frame -> All, Spacings -> 5] &
... including custom bin specifications like
binFunc1 = Union[IntegerPart[#]] &;
binFunc2 = Quantile[#, {0, .05, .1, .25, .5, .75, .9, .95, 1.}] &;
binFunc3 = First[HistogramList[#, "FreedmanDiaconis"]] &;
binFunc4 = Sort@#[[RandomSample[Range@Length@#, 10]]] &;
Partition[Table[DistributionChart[data, ChartStyle -> "Rainbow",
ChartElementFunction -> (ChartElementDataFunction[
"HistogramDensity", "Bins" -> i]),
PlotLabel -> Row[{"\"Bins\"", "->\n", ToString@i}],
ImageSize -> 300],
{i, {binFunc1, binFunc2, binFunc3, binFunc4}}], 2] //
Grid[#, Frame -> All, Spacings -> 5] &
For "Quantile"
, "FadingQuantile"
, "GlassQuantile"
and "DensityQuantile"
, the settings for suboption "Quantile"
can be either an integer n
(short for the n-1
quantiles 100 i/n (i = 1, ... , n-1)
or an explicit list of integers between 0
and 100
. Furthermore, each of the explicitly specified quantiles can be styled individually using the suboption "QuantileStyle"
.
Partition[Table[DistributionChart[data,
ChartElementFunction -> (ChartElementDataFunction["GlassQuantile",
"Quantile" -> i,
"QuantileStyle" -> (Directive[Thick, Hue[#/100]] & /@ i),
"QuantileShading" -> True]),
PlotLabel -> Row[{"Quantiles: ", ToString@i}], ImageSize -> 300],
{i, {4, {25, 50, 75}, {10, 90}, {5, 10, 25, 50, 75, 90, 95}}}], 2] //
Grid[#, Frame -> All, Spacings -> 5] &
The option setting for "Threshold"
seems to control symmetric trimming at the two tails as the following examples suggest. (Perhaps, further fishing may reveal that it accepts additional values to control the bandwidths)
Row@Table[DistributionChart[data,
ChartElementFunction -> (ChartElementDataFunction["SmoothDensity",
"ColorScheme" -> "DeepSeaColors", "Threshold" -> i]),
ImageSize -> 300], {i, {.05, .1, .5}}]
Row@Table[DistributionChart[data, ChartStyle -> "SolarColors",
ChartElementFunction -> (ChartElementDataFunction["Density", "Threshold" -> i]),
ImageSize -> 300], {i, {.05, .1, .5}}]
Comments
Post a Comment