2010-08-24 12 views
2

J'ai une question sur les barres matplotlib. J'ai déjà fait quelques graphiques à barres mais je ne sais pas pourquoi, celui-ci a laissé un énorme espace vide dans le haut.espace vide dans le haut de l'intrigue matplotlib django

le code est similaire à d'autres graphiques que j'ai faits et ils n'ont pas ce problème.

Si quelqu'un a une idée, j'apprécie l'aide.

x = matplotlib.numpy.arange(0, max(total)) 
ind = matplotlib.numpy.arange(len(age_list)) 

ax.barh(ind, total) 

ax.set_yticks(ind) 
ax.set_yticklabels(age_list) 

Répondre

6

Par «espace vide dans le haut», voulez-vous dire que les limites y sont trop grandes? Par défaut, matplotlib choisira les limites de l'axe x et y afin qu'elles soient arrondies au nombre pair le plus proche (par exemple 1, 2, 12, 5, 50, -0,5 etc ...).

Si vous souhaitez que les limites d'axe soient définies pour qu'elles soient "serrées" sur le tracé (c'est-à-dire min et max des données), utilisez ax.axis('tight') (ou de manière équivalente, plt.axis('tight') qui utilisera l'axe actuel).

Une autre méthode très utile est plt.margins(...)/ax.margins(). Il va agir comme axis('tight'), mais laissera un peu de rembourrage autour des limites.

À titre d'exemple de votre problème:

import numpy as np 
import matplotlib.pyplot as plt 

# Make some data... 
age_list = range(10,31) 
total = np.random.random(len(age_list)) 
ind = np.arange(len(age_list)) 

plt.barh(ind, total) 

# Set the y-ticks centered on each bar 
# The default height (thickness) of each bar is 0.8 
# Therefore, adding 0.4 to the tick positions will 
# center the ticks on the bars... 
plt.yticks(ind + 0.4, age_list) 

plt.show() 

Auto-rounded y-axis limits

Si je voulais les limites d'être plus serré, je pourrais appeler plt.axis('tight') après l'appel à plt.barh, ce qui donnerait:

Cependant, vous ne voudrez peut-être pas que les choses soient trop serrées, donc vous pouvez utiliser plt.margins(0.02) pour ajouter 2% de rembourrage dans toutes les directions. Vous pouvez ensuite définir la limite de gauche à 0 avec plt.xlim(xmin=0):

import numpy as np 
import matplotlib.pyplot as plt 

# Make some data... 
age_list = range(10,31) 
total = np.random.random(len(age_list)) 
ind = np.arange(len(age_list)) 

height = 0.8 
plt.barh(ind, total, height=height) 

plt.yticks(ind + height/2.0, age_list) 

plt.margins(0.05) 
plt.xlim(xmin=0) 

plt.show() 

qui produit un peu plus agréable d'un terrain:

Nicely padded margins

Espérons que vous pointe dans la bonne direction, à n'importe quel taux!

+0

+1 Détaillé avec des explications claires _et_ des captures d'écran. –

+0

Merci beaucoup! J'avais un graphisme comme le premier que tu dessines, après avoir fait les changements, j'ai pu en voir un similaire au tien! Vous avez très bien expliqué et cela a du sens :) – pavid