2017-06-29 1 views
0

Je crée une figure avec 3 sous-trames et certains des blocs de l'histogramme semblent être de tailles différentes, bien qu'ils soient tous égaux en largeur. Mon but est de créer un histogramme avec des barres de largeur égale.Largeur variable de l'histogramme de Matplotlib Bin

Je suis en train de tracer des données à partir de trois trames de données différentes df1,df2,df3 et chacune a son propre axe. Les deux premières trames de données (df1,df2) ont 12 valeurs, tandis que la troisième (df3) a 21 valeurs. Un exemple de travail minimal:

import pandas as pd 
import matplotlib.pyplot as plt 
import numpy as np 

#Data 
df1 = pd.DataFrame(data={'Delta_Thick': {0: -0.10257269427388138,1: -0.39092250646203491,2:-0.23459561055233191,3: 0.68753181981137268,4: -0.86443211703287937,5: -0.46963178960649432,6: 0.14070311160589327,7: 0.1885440568340489,8: 0.64210565529921859,9: -0.81346415594104837,10: 0.68175896505459788,11: 0.33673654536030828}}) 
df2 = pd.DataFrame(data={'Delta_Thick':{0: -0.38775619399296002,1: -0.32367407025583783,2: -0.56055783338428344,3: 0.23824247437746471,4: -0.64925233000340721,5: -0.44120245730257612,6: 0.027222094241818928,7: -0.091069018106476163,8: 0.0066066466889458386,9: -0.60477189852646174,10: 0.12878952794346843,11: -0.0077463979905486591}}) 
df3 = pd.DataFrame(data={'Delta_Thick':{0: 0.28518349971907864,1: -0.06724843620619711,2: 0.32596222283195153,3: 0.44928934543390797,4: 0.20911991461399143,5: -0.036989014816141919,6: -0.21517978702947216, 7: -0.028429332303918198,8: 0.037553921139760305,9: 0.98813506475654656,10: 0.51938760439670373,11: 0.11348101736407434,12: 0.79676269452200232,13: 0.27961307494052506,14: -0.55282685608381399,15: 0.63549900861027275,16: -0.20869225741458663,17: 0.55296943711112945,18: 0.34448294335085694,19: 0.18268186220418725,20: 0.36422880308671302}}) 

fig, (ax,ax1,ax2) = plt.subplots(ncols=3) 

bins=[round(x,1)for x in np.linspace(-1,1,21)] 
counts, division = np.histogram(df1.loc[:,'Delta_Thick'],bins=bins) 
df1.loc[:,'Delta_Thick'].hist(ax=ax, bins=division,color='green',label='Thing',hatch='//') 
ax.xaxis.set_ticks(np.arange(-1, 1.5, 0.5)) 
ax.yaxis.set_ticks(np.arange(0, 5, 1)) 
ax.set_title('A. 1990-2016') 
ax.set_ylabel('Number of Sites') 
ax.legend(fontsize='x-small',loc=2) 

#Deficit 
bins=[round(x,1)for x in np.linspace(-1,0.6,16)] 
counts, division = np.histogram(df2.loc[:,'Delta_Thick'],bins=bins) 
df2.loc[:,'Delta_Thick'].hist(ax=ax1, bins=division,color='green',hatch='//') 
ax1.xaxis.set_ticks(np.arange(-1, 0.75, 0.5)) 
ax1.yaxis.set_ticks(np.arange(0, 5, 1)) 
ax1.set_title('B. 1990-2003') 
ax1.set_xlabel('X axis label') 

#Enrich 
bins=[round(x,1)for x in np.linspace(-1,0.6,16)] 
counts, division = np.histogram(df3.loc[:,'Delta_Thick'],bins=bins) 
df3.loc[:,'Delta_Thick'].hist(ax=ax2, bins=division,color='green',hatch='//') 
ax2.xaxis.set_ticks(np.arange(-1, 1.5, 0.5)) 
ax2.yaxis.set_ticks(np.arange(0, 5, 1)) 
ax2.set_title('C. 2003-2016') 
plt.tight_layout() 
plt.show() 

output figure

Dans la parcelle ci-dessus, la troisième intrigue secondaire ax2 a une barre d'histogramme qui semble avoir une largeur de bac de 0,2.

La longueur de la troisième trame de données peut-elle causer ce problème?

La variable division ne dicte-t-elle pas la largeur de la corbeille?

+0

Je pense que les bacs sont tous très bien, il est juste que l'un de la ligne verticale ne se présente pas. J'ai exécuté votre code sur python3, matplotlib 2.0.2 avec backend Qt5Agg et je ne vois pas du tout les lignes verticales séparant les bins. Si je sauve la figure en tant que '' png'', j'obtiens quelque chose de très similaire au backend Qt5Agg. Si je sauvegarde au format PDF, certains bacs ne montrent même pas les hachures. Je ne sais pas si c'est un bug dans matplotlib ou dans tout ce qui affiche les chiffres. –

+0

@FrancescoMontesano merci pour les tests – dubbbdan

+0

Vous êtes les bienvenus. –

Répondre

1

Je ne sais pas pourquoi, mais d'une façon ou d'une autre quand j'ajustais les ticks de x (c'est-à-dire ax2.xaxis.set_ticks) il a changé l'aspect des barres d'histogramme. Donc, la solution de travail est:

import pandas as pd 
import matplotlib.pyplot as plt 
import numpy as np 

#Data 
df1 = pd.DataFrame(data={'Delta_Thick': {0: -0.10257269427388138,1: -0.39092250646203491,2:-0.23459561055233191,3: 0.68753181981137268,4: -0.86443211703287937,5: -0.46963178960649432,6: 0.14070311160589327,7: 0.1885440568340489,8: 0.64210565529921859,9: -0.81346415594104837,10: 0.68175896505459788,11: 0.33673654536030828}}) 
df2 = pd.DataFrame(data={'Delta_Thick':{0: -0.38775619399296002,1: -0.32367407025583783,2: -0.56055783338428344,3: 0.23824247437746471,4: -0.64925233000340721,5: -0.44120245730257612,6: 0.027222094241818928,7: -0.091069018106476163,8: 0.0066066466889458386,9: -0.60477189852646174,10: 0.12878952794346843,11: -0.0077463979905486591}}) 
df3 = pd.DataFrame(data={'Delta_Thick':{0: 0.28518349971907864,1: -0.06724843620619711,2: 0.32596222283195153,3: 0.44928934543390797,4: 0.20911991461399143,5: -0.036989014816141919,6: -0.21517978702947216, 7: -0.028429332303918198,8: 0.037553921139760305,9: 0.98813506475654656,10: 0.51938760439670373,11: 0.11348101736407434,12: 0.79676269452200232,13: 0.27961307494052506,14: -0.55282685608381399,15: 0.63549900861027275,16: -0.20869225741458663,17: 0.55296943711112945,18: 0.34448294335085694,19: 0.18268186220418725,20: 0.36422880308671302}}) 

fig, (ax,ax1,ax2) = plt.subplots(ncols=3) 

bins=[round(x,1)for x in np.linspace(-1,1,21)] 
counts, division = np.histogram(df1.loc[:,'Delta_Thick'],bins=bins) 
df1.loc[:,'Delta_Thick'].hist(ax=ax, bins=division,color='green',hatch='//') 
ax.xaxis.set_ticks(np.arange(-1, 1.5, 0.5)) 
ax.yaxis.set_ticks(np.arange(0, 5, 1)) 
ax.set_title('A. 1990-2016') 
ax.set_ylabel('Number of Sites') 
ax.legend(fontsize='x-small',loc=2) 

#Deficit 
bins=[round(x,1)for x in np.linspace(-1,1,21)] 
counts, division = np.histogram(df2.loc[:,'Delta_Thick'],bins=bins) 
#ax1.hist(df2.loc[:,'Delta_Thick'],bins=counts.size) 
df2.loc[:,'Delta_Thick'].hist(ax=ax1, bins=division,color='green',hatch='//') 
ax1.xaxis.set_ticks(np.arange(-1, 1.5, 0.5)) 
ax1.yaxis.set_ticks(np.arange(0, 5, 1)) 
ax1.set_title('B. 1990-2003') 
ax1.set_xlabel('X axis label') 

#Enrich 

bins=[round(x,1)for x in np.linspace(-1,1,21)] 
counts, division = np.histogram(df3.loc[:,'Delta_Thick'],bins=bins) 
df3.loc[:,'Delta_Thick'].hist(ax=ax2, bins=division,color='green',hatch='//') 
ax2.xaxis.set_ticks(np.arange(-1, 2, 0.5)) 
ax2.yaxis.set_ticks(np.arange(0, 10, 1)) 
ax2.set_title('C. 2003-2016') 


plt.tight_layout() 
plt.show() 

Avis je changé ax2.xaxis.set_ticks(np.arange(-1, 1.5, 0.5)) à ax2.xaxis.set_ticks(np.arange(-1, 2, 0.5)).

enter image description here

+0

Je pense qu'une partie du problème est que, parfois, la bordure d'une barre est derrière celle qui se trouve à proximité. Vous pouvez également essayer d'augmenter la largeur des lignes de bordure: je ne sais pas si cela fonctionne, mais ça vaut le coup d'essayer. –