¿Hay alguna manera de crear un gráfico de barras a partir de datos continuos agrupados en intervalos predefinidos? Por ejemplo,
In[1]: df Out[1]: 0 0.729630 1 0.699620 2 0.710526 3 0.000000 4 0.831325 5 0.945312 6 0.665428 7 0.871845 8 0.848148 9 0.262500 10 0.694030 11 0.503759 12 0.985437 13 0.576271 14 0.819742 15 0.957627 16 0.814394 17 0.944649 18 0.911111 19 0.113333 20 0.585821 21 0.930131 22 0.347222 23 0.000000 24 0.987805 25 0.950570 26 0.341317 27 0.192771 28 0.320988 29 0.513834 231 0.342541 232 0.866279 233 0.900000 234 0.615385 235 0.880597 236 0.620690 237 0.984375 238 0.171429 239 0.792683 240 0.344828 241 0.288889 242 0.961686 243 0.094402 244 0.960526 245 1.000000 246 0.166667 247 0.373494 248 0.000000 249 0.839416 250 0.862745 251 0.589873 252 0.983871 253 0.751938 254 0.000000 255 0.594937 256 0.259615 257 0.459916 258 0.935065 259 0.969231 260 0.755814y en lugar de un simple histograma:
df.hist()Necesito crear un gráfico de barras, donde cada barra contará una cantidad de instancias dentro de un rango predefinido. Por ejemplo, la siguiente gráfica debe tener tres barras con el número de puntos que caen en: [0 0.35], [0.35 0.7] [0.7 1.0]
EDITAR
Muchas gracias por tus respuestas. Otra pregunta, ¿cómo pedir contenedores? Por ejemplo, obtengo el siguiente resultado:
In[349]: out.value_counts() Out[349]: [0, 0.001] 104 (0.001, 0.1] 61 (0.1, 0.2] 32 (0.2, 0.3] 20 (0.3, 0.4] 18 (0.7, 0.8] 6 (0.4, 0.5] 6 (0.5, 0.6] 5 (0.6, 0.7] 4 (0.9, 1] 3 (0.8, 0.9] 2 (1, 1.001] 0como puede ver, los últimos tres contenedores no están ordenados. ¿Cómo ordenar el marco de datos según las 'categorías' o mis contenedores?
EDITAR 2
Acabo de encontrar cómo resolverlo, simplemente con 'reindex ()':
In[355]: out.value_counts().reindex(out.cat.categories) Out[355]: [0, 0.001] 104 (0.001, 0.1] 61 (0.1, 0.2] 32 (0.2, 0.3] 20 (0.3, 0.4] 18 (0.4, 0.5] 6 (0.5, 0.6] 5 (0.6, 0.7] 4 (0.7, 0.8] 6 (0.8, 0.9] 2 (0.9, 1] 3 (1, 1.001] 0Puede utilizar pd.cut para dividir los valores en contenedores correspondientes a cada intervalo y luego tomar los recuentos totales de cada intervalo mediante pd.value_counts . Trace un gráfico de barras más tarde, además, reemplace las etiquetas de marca del eje X con el nombre de la categoría a la que pertenece esa marca en particular.
out = pd.cut(s, bins=[0, 0.35, 0.7, 1], include_lowest=True) ax = out.value_counts(sort=False).plot.bar(rot=0, color="b", figsize=(6,4)) ax.set_xticklabels([c[1:-1].replace(","," to") for c in out.cat.categories]) plt.show()Si desea que el eje Y se muestre como porcentajes relativos, normalice los recuentos de frecuencia y multiplique ese resultado por 100.
out = pd.cut(s, bins=[0, 0.35, 0.7, 1], include_lowest=True) out_norm = out.value_counts(sort=False, normalize=True).mul(100) ax = out_norm.plot.bar(rot=0, color="b", figsize=(6,4)) ax.set_xticklabels([c[1:-1].replace(","," to") for c in out.cat.categories]) plt.ylabel("pct") plt.show()Puede considerar usar matplotlib para trazar el histograma. A diferencia de la función hist de pandas, matplotlib.pyplot.hist acepta una matriz como entrada para los contenedores.
import numpy as np; np.random.seed(0) import matplotlib.pyplot as plt import pandas as pd x = np.random.rand(120) df = pd.DataFrame({"x":x}) bins= [0,0.35,0.7,1] plt.hist(df.values, bins=bins, edgecolor="k") plt.xticks(bins) plt.show()Puedes usar pd.cut
bins = [0,0.35,0.7,1] df = df.groupby(pd.cut(df['val'], bins=bins)).val.count() df.plot(kind='bar')