Estoy tratando de obtener un histograma con datos ya agrupados. He intentado usar bar()
para esto, pero parece que no puedo entender cómo hacer que sea un histograma escalonado like this one from the examples, en lugar de un histograma relleno.Matplotlib - Histograma escalonado con datos ya agrupados
Respuesta
Se puede engañar, mediante la compensación de sus datos y el uso de plot
lugar:
from matplotlib import pyplot
import numpy as np
#sample data:
x = np.arange(30)
y = np.cumsum(np.arange(30))
#offset the x for horizontal, repeat the y for vertical:
x = np.ravel(zip(x,x+1))
y = np.ravel(zip(y,y))
pyplot.plot(x,y)
pyplot.savefig('plt.png')
el terreno:
Desde la fuente adjunto al http://matplotlib.sourceforge.net/examples/pylab_examples/histogram_demo_extended.html
aquí es la forma en que sacaron ese gráfico:
[snip]
y el bit que desea parece ser
pylab.hist(x, bins=bins, histtype='step')
^
right here
Editar: si quieres saber cómo hist() funciona, un vistazo a la fuente - se define en matplotlib/axes.py a partir de la línea 7407.
En cuanto a la línea 7724,
x = np.zeros(2*len(bins), np.float)
y = np.zeros(2*len(bins), np.float)
de N bars, bins es una numpy.ndarray de valores N + 1, siendo los bordes de cada barra. Ellos twin los valores para cada barra (esto es lo que está haciendo con Fraxel np.ravel abajo) y el desplazamiento de los puntos de datos media barra izquierda a ellos se centran
x[0::2], x[1::2] = bins, bins
x -= 0.5*(bins[1]-bins[0])
ajustar la altura de cada barra, hermanada pero compensado por una (en relación con los valores de x) para producir el efecto paso
# n is an array of arrays containing the number of items per bar
patches = [] # from line 7676
for m, c in zip(n, color):
y[1:-1:2], y[2::2] = m, m
patches.append(self.fill(x, y, closed=False, edgecolor=c, fill=False))
y el bit self.fill
es lo que realmente dibuja las líneas.
Por lo que entiendo el ejemplo la tampoco datos ya binned. Ya he agrupado los datos, por lo que 'hist()' no ayuda – madtowneast
-1, no se aplica a la pregunta –
@Jonas Wielicki: el código dado resultados en la imagen que preguntó. ¿Cómo es esto no aplicable? –
La solución más sencilla es la de convertir el conjunto de datos agrupada a un no-agrupada , conjunto de datos ponderado (con número de elementos == número de contenedores). El conjunto de datos no compuesto consistiría en valores de datos iguales a los centros de contenedores y pesos iguales a los valores en cada contenedor. Por ejemplo, digamos que sus datos agrupada es,
binedges = [0.0, 1.0, 2.0, 3.0]
ybinned = [11., 22., 33.]
El conjunto de datos ponderada correspondiente sería,
y = [0.5, 1.5, 2.5]
weights = [11., 22., 33.]
Tenga en cuenta que la opción de utilizar el centro bin es arbitraria, se puede utilizar cualquier punto dentro de una compartimiento. Una vez que haya generado el conjunto de datos sin bin entonces puede usar el trazado del histograma de matplotlib normal (es decir, Axes.hist).
Un ejemplo de implementación en Python de la siguiente manera:
def plot_binned_data(axes, binedges, data,
*args, **kwargs):
#The dataset values are the bin centres
x = (binedges[1:] + binedges[:-1])/2.0
#The weights are the y-values of the input binned data
weights = data
return axes.hist(x, bins=binedges, weights=weights,
*args, **kwargs)
Ahora puede tener acceso completo a todos los ejes.Opciones de trazado del histograma, incluido histtype="step"
para crear el histograma escalonado que usted quería.
Un ejemplo de utilizar esta función sería,
import numpy
import matplotlib.pyplot as plt
#Create a dataset
dataset = numpy.random.normal(size=100)
#Bin the dataset
binedges = numpy.linspace(-5.0, 5.0, num=10)
y, binedges = numpy.histogram(dataset, binedges)
#Plot the dataset
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
plot_binned_data(ax, binedges, y, histtype="step")
plt.show()
Espero que ayude!
Por alguna razón, el último contenedor no se cierra correctamente cuando lo intento. No es visible desde las respuestas anteriores si se mostró la última línea, así que decidí hacer mi propia función, que hace lo que quiero.
def make_bar_contour_plot(ax,x_input,y_input):
x = list(np.ravel(zip(x_input[:-1],x_input[:-1]+1)))[1:]
x += [x[-1]+20] + [300]
y = list(np.ravel(zip(y_input,y_input))) +[0]
ax.plot(x,y,ls='steps')
return ax
El 20
y 300
que se agregan son mi binsize y el valor final, respectivamente, y necesitan ser ajustados si alguien quiere utilizar esto. x_input
y y_input
son los valores de devolución de np.histogram
. Mi parcela resultante (en azul el contorno, trazada con función anterior en rojo, la barplot de los mismos datos.):
- 1. Histograma Matplotlib
- 2. diagrama de python histograma simple dado datos agrupados
- 3. Histograma en Matplotlib con el archivo de entrada
- 4. Tamaño del contenedor en Matplotlib (Histograma)
- 5. matplotlib scatter_hist con histtype stepfilled en el histograma
- 6. ¿Histograma usando gnuplot?
- 7. base de datos: clave primaria, agrupados o no agrupados
- 8. trazado de histograma 3d/gráfico de barras en python matplotlib
- 9. histograma de la trama de datetime.time python/matplotlib
- 10. cambiando el rango por defecto x en el histograma matplotlib
- 11. ¿Cómo visualizar datos 2D escalares con Matplotlib?
- 12. Aproximación del histograma para transmitir datos
- 13. agrupados y apilados multiBarChart con NVD3
- 14. cómo obtener datos de histograma en Matlab
- 15. Grafique dos histogramas al mismo tiempo con matplotlib
- 16. Cómo trazar un histograma preintervenido En R
- 17. Python: Histograma con área normalizada a algo distinto de 1
- 18. Índices agrupados SQL Server
- 19. FindFit con BinCounts o histograma en Mathematica
- 20. Histograma con escala logarítmica y saltos personalizados
- 21. Histograma de superposición con curva de densidad
- 22. Python con matplotlib - reutilizando funciones de dibujo
- 23. Cálculo de un histograma en una transmisión de datos - Cálculo del histograma en línea
- 24. Diagrama de caja de datos preagregados/agrupados en R
- 25. ggplot2: línea que conecta los medios de datos agrupados
- 26. matplotlib histogramas normalizados
- 27. histograma en jfreechart
- 28. Histograma de imagen OpenCL
- 29. Configuración de puntos sin datos en blanco con Matplotlib imshow
- 30. Boxplot con datos de longitud variable en matplotlib
Descubrí una segunda forma. Simplemente configure 'ls =" steps "' para 'plot()'. ¡Gracias por la respuesta! – madtowneast
@madtowneast, usted merece más votos favorables para ese comentario. Esa es una característica oculta. http://matplotlib.org/api/artist_api.html#matplotlib.lines.Line2D.set_linestyle – kratsg