Estoy tratando de hacer un gráfico de barras agrupadas en matplotlib, siguiendo el ejemplo en la galería. Yo uso los siguientes:estableciendo el espaciado entre gráficos de barras agrupadas en matplotlib
import matplotlib.pyplot as plt
plt.figure(figsize=(7,7), dpi=300)
xticks = [0.1, 1.1]
groups = [[1.04, 0.96],
[1.69, 4.02]]
group_labels = ["G1", "G2"]
num_items = len(group_labels)
ind = arange(num_items)
width = 0.1
s = plt.subplot(1,1,1)
for num, vals in enumerate(groups):
print "plotting: ", vals
group_len = len(vals)
gene_rects = plt.bar(ind, vals, width,
align="center")
ind = ind + width
num_groups = len(group_labels)
# Make label centered with respect to group of bars
# Is there a less complicated way?
offset = (num_groups/2.) * width
xticks = arange(num_groups) + offset
s.set_xticks(xticks)
print "xticks: ", xticks
plt.xlim([0 - width, max(xticks) + (num_groups * width)])
s.set_xticklabels(group_labels)
Mis preguntas son:
¿Cómo puedo controlar el espacio entre los grupos de barras? En este momento, el espacio es enorme y parece tonto. Tenga en cuenta que no quiero que las barras sean más anchas, quiero que tengan el mismo ancho, pero estén más juntas.
¿Cómo puedo hacer que las etiquetas se centren debajo de los grupos de barras? Traté de hacer algunos cálculos aritméticos para colocar las xlabels en el lugar correcto (ver el código anterior) pero todavía está un poco apagado ... se siente como escribir una biblioteca de trazado en lugar de usar una. ¿Cómo se puede arreglar esto? (¿Hay un envoltorio o construido en la utilidad para matplotlib donde esto es el comportamiento por defecto?)
EDIT: Responder a @mlgill: gracias por su respuesta. Su código es ciertamente mucho más elegante, pero aún tiene el mismo problema, es decir, que el ancho de las barras y el espaciado entre los grupos no se controlan por separado. Su gráfica se ve correcta, pero las barras son demasiado anchas, parece un gráfico de Excel, y quería que la barra se adelgazara.
Ancho y el margen ahora están vinculados, por lo que si trato:
margin = 0.60
width = (1.-2.*margin)/num_items
Esto hace que la barra más delgada, pero trae el grupo muy separados, por lo que la trama de nuevo no se ve bien.
Cómo puedo hacer una función de diagrama de barras agrupadas que toma dos parámetros: el ancho de cada barra y el espacio entre los grupos de barras, y traza correctamente como lo hizo tu código, es decir, con las etiquetas del eje x centradas debajo ¿los grupos?
creo que ya que el usuario tiene que calcular las cantidades específicas de diseño de bajo nivel como el margen y el ancho, todavía estamos escribiendo básicamente una biblioteca de trazado :)
Además, tenga en cuenta el número muy reducido de comandos, una vez que se hayan eliminado mis comentarios. Si bien creo que la función de trazado de barras de Matplotlib podría usar mejoras menores en algunos aspectos, esto ya no es como escribir una biblioteca de trazado. :) –
gracias por tu comentario, te respondí en una edición de mi publicación principal. – user248237dfsf
Según lo que has escrito arriba, parece que quieres que el ancho del gráfico entero sea más pequeño (esto se puede establecer en la línea que crea la figura) o quieres que los márgenes sean más grandes, lo que mantendrá el relación de aspecto igual. También puede ajustar el ancho y los cálculos xdata para que haya un margen entre cada una de las barras. Lograr esto requiere solo álgebra básica. Más allá de estas tres ideas, no tengo idea de lo que estás preguntando. –