Cómo trazar gráficos de barras con las mismas coordenadas X lado a lado (‘esquivado’)

import matplotlib.pyplot as plt gridnumber = range(1,4) b1 = plt.bar(gridnumber, [0.2, 0.3, 0.1], width=0.4, label="Bar 1", align="center") b2 = plt.bar(gridnumber, [0.3, 0.2, 0.2], color="red", width=0.4, label="Bar 2", align="center") plt.ylim([0,0.5]) plt.xlim([0,4]) plt.xticks(gridnumber) plt.legend() plt.show() 

Actualmente b1 y b2 se superponen entre sí. ¿Cómo los grafico por separado de esta manera?

introduzca la descripción de la imagen aquí

Hay un ejemplo en el sitio matplotlib. Básicamente, solo cambia los valores de x por el width . Aquí está el bit relevante:

 import numpy as np import matplotlib.pyplot as plt N = 5 menMeans = (20, 35, 30, 35, 27) menStd = (2, 3, 4, 1, 2) ind = np.arange(N) # the x locations for the groups width = 0.35 # the width of the bars fig = plt.figure() ax = fig.add_subplot(111) rects1 = ax.bar(ind, menMeans, width, color='royalblue', yerr=menStd) womenMeans = (25, 32, 34, 20, 25) womenStd = (3, 5, 2, 3, 3) rects2 = ax.bar(ind+width, womenMeans, width, color='seagreen', yerr=womenStd) # add some ax.set_ylabel('Scores') ax.set_title('Scores by group and gender') ax.set_xticks(ind + width / 2) ax.set_xticklabels( ('G1', 'G2', 'G3', 'G4', 'G5') ) ax.legend( (rects1[0], rects2[0]), ('Men', 'Women') ) plt.show() 

A veces puede ser difícil encontrar el ancho correcto de la barra. Usualmente uso este np.diff para encontrar la dimensión correcta.

 import numpy as np import matplotlib.pyplot as plt #The data womenMeans = (25, 32, 34, 20, 25) menMeans = (20, 35, 30, 35, 27) indices = [5.5,6,7,8.5,8.9] #Calculate optimal width width = np.min(np.diff(indices))/3 fig = plt.figure() ax = fig.add_subplot(111) ax.bar(indices-width,womenMeans,width,color='b',label='-Ymin') ax.bar(indices,menMeans,width,color='r',label='Ymax') ax.set_xlabel('Test histogram') plt.show() 

Este es el resultado:

introduzca la descripción de la imagen aquí

¿Qué pasa si mis índices en mi eje x son valores nominales como nombres:

 # import numpy as np import matplotlib.pyplot as plt # The data womenMeans = (25, 32, 34, 20, 25) menMeans = (20, 35, 30, 35, 27) indices = range(len(womenMeans)) names = ['Asian','European','North Amercian','African','Austrailian','Martian'] # Calculate optimal width width = np.min(np.diff(indices))/3. fig = plt.figure() ax = fig.add_subplot(111) ax.bar(indices-width/2.,womenMeans,width,color='b',label='-Ymin') ax.bar(indices+width/2.,menMeans,width,color='r',label='Ymax') #tiks = ax.get_xticks().tolist() ax.axes.set_xticklabels(names) ax.set_xlabel('Test histogram') plt.show()