Si te encuentras con algún detalle que te causa duda puedes dejarlo en los comentarios y trataremos de ayudarte tan rápido como podamos.
Solución:
Para el caso en que la función altura es "Count"
podemos usar la fórmula de la página vinculada en un personalizado ChartElementFunction
con el tamaño de la muestra (Length[data]
) pasado como metadatos:
ceF[d_: .2, nsd_: 3, color_: Automatic][cedf_: "Rectangle"] :=
Module[e = nsd /2 Sqrt[#[[2, 2]] (1 - #[[2, 2]]/ #3[[1]])],
ChartElementData[cedf][##], Thick,
color /. Automatic -> Darker[Charting`ChartStyleInformation["Color"]],
Line[[email protected]#[[1]], #[[2, 2]] - e, [email protected]#[[1]], #[[2, 2]] + e],
Line[#[[1, 1]] + d/2, #[[2, 2]] - e, #[[1, 2]] - d/2, #[[2, 2]] - e],
Line[#[[1, 1]] + d/2, #[[2, 2]] + e, #[[1, 2]] - d/2, #[[2, 2]] + e]]&
Ejemplos:
SeedRandom[1]
data = RandomVariate[NormalDistribution[0, 1], 200];
Histogram[data -> Length[data], ChartStyle -> 43, ChartElementFunction -> ceF[][]]
Histogram[data -> [email protected]
, ChartStyle -> 43,
ChartElementFunction -> ceF[.2, 3, Black]["GlassRectangle"]]
Actualizar: para que funcione con no predeterminado BarOrigin
ajustes:
ClearAll[ceF]
ceF[d_: .2, nsd_: 3, color_: Automatic][cedf_: "Rectangle"] :=
Module[bo = Charting`ChartStyleInformation["BarOrigin"],
col = Darker[Charting`ChartStyleInformation["Color"]], box = #, tf, e,
tf = Switch[bo, Left | Right, Reverse, _, Identity];
box = Switch[bo, Bottom, box, Top, box[[1]], Reverse[box[[2]]], Left,
[email protected], Right, box[[2]], [email protected][[1]]];
e = nsd /2 Sqrt[[email protected][[2, 2]] (1 - [email protected][[2, 2]]/#3[[1]])];
ChartElementData[cedf][##], Thick, color /. Automatic -> col,
Line[tf /@ [email protected][[1]], box[[2, 2]] - e,
[email protected][[1]], box[[2, 2]] + e],
Line[tf /@ box[[1, 1]] + d/2, box[[2, 2]] - e,
box[[1, 2]] - d/2, box[[2, 2]] - e],
Line[tf /@ box[[1, 1]] + d/2, box[[2, 2]] + e,
box[[1, 2]] - d/2, box[[2, 2]] + e]] &
Ejemplo:
Grid[Partition[Histogram[data -> [email protected], ChartStyle -> 43,
ChartElementFunction -> ceF[][], ImageSize -> 300,
BarOrigin -> #] & /@ Bottom, Top, Left, Right, 2],
Dividers -> All]
Esta respuesta a continuación no es directamente lo que preguntó, sino más bien lo que debería considerar hacer. Con más de 50 o más puntos de datos, debe considerar evitar los histogramas por completo. La mayoría de las veces, probablemente visualice alguna función de densidad suave que está tratando de estimar. Además, agregar barras de error genera una figura muy desordenada y tal vez incluso difícil de interpretar.
Y finalmente, tomar el logaritmo o la raíz cuadrada para mostrar el conteo o la densidad no tiene sentido. Eso destruye la característica del área bajo el histograma (o curva de densidad) “sumando” a 1 o sumando al tamaño de la muestra y hace que las comparaciones entre diferentes conjuntos de datos sean riesgosas en el mejor de los casos.
Sacar la raíz cuadrada del conteo puede darte una estimación del error estándar asociado con el conteo, llamado formalmente rootograma. Mi queja es acerca de perder la capacidad de dar sentido a la comparación de diferentes conjuntos de datos.
Transformar los datos (es decir, los datos sin procesar y no los conteos) es un enfoque diferente y perfectamente adecuado.
El uso de una estimación de densidad no paramétrica con bandas de confianza creadas con bootstrap podría mostrar mucho mejor las características de sus datos. Considera lo siguiente:
(* Generate some data *)
SeedRandom[1]
n = 200;
data = RandomVariate[NormalDistribution[0, 1], n];
(* Estimate density function *)
skd = SmoothKernelDistribution[data];
(* Determine some bounds to evaluate the density function *)
sd = StandardDeviation[data];
xmin = Min[data] - sd;
xmax = Max[data] + sd;
(* Generate bootstrap samples and determine density values along a
grid between xmin and xmax *)
nboot = 1000;
ngrid = 100;
densityValues = ConstantArray[0, nboot, ngrid + 1];
Do[bootData = RandomChoice[data, n];
skdboot = SmoothKernelDistribution[bootData];
densityValues[[iboot, All]] =
Table[PDF[skdboot, xmin + (xmax - xmin) i/ngrid], i, 0, ngrid],
iboot, nboot]
(* Choose some level for the confidence bands and calculate percentiles *)
confLevel = 0.95;
xvalues = Table[xmin + (xmax - xmin) i/ngrid, i, 0, ngrid];
lower = Transpose[xvalues, Quantile[densityValues[[All, #]],(1 - confLevel)/2] & /@ Range[ngrid + 1]];
upper = Transpose[xvalues, Quantile[densityValues[[All, #]], 1 - (1 - confLevel)/2] & /@ Range[ngrid + 1]];
(* Plot results *)
Show[ListPlot[upper, lower, Joined -> True,
PlotStyle -> Blue, Dotted],
Plot[PDF[skd, x], x, xmin, xmax, PlotStyle -> Blue]]
Creo que la figura anterior es mucho más limpia e informativa que tener un histograma irregular con barras de error pegadas por todos lados. Ahora todos tenemos computadoras. No hay necesidad de hacer cosas (como histogramas) que eran todo lo que uno podía hacer cuando el poder de cómputo era bajo.
Si estás de acuerdo, puedes dejar una crónica acerca de qué te ha gustado de este tutorial.