2010-08-12 5 views
5

Qualcuno sa se è possibile avvolgere le etichette xtick in matplotlib? In questo momento ho il seguente codice di (sorta di disordinato - stato hacking a lui per un po '):È possibile avvolgere il testo di xticks in matplotlib in python?

def plotResults(request, question_id): 
responses = ResponseOption.objects.filter(question__id=question_id).order_by('order').annotate(response_num=Count('response')) 

counts = [] 
labels = [] 

for response in responses: 
    counts.append(response.response_num) 
    labels.append(smart_truncate('$'+response.text+'$')) 

N = len(labels) 
labels = tuple(labels) 
counts = tuple(counts) 
ind = na.array(range(N))+0.5 
width = .35 
fig = Figure(facecolor='white',edgecolor='white') 
ax = fig.add_subplot(1,1,1) 


rects1 = ax.bar(ind, counts,linewidth=0) 

ax.set_ylabel('$Count$') 

ax.set_title('$Response Historgram$') 
ax.set_xticks(ind+width) 
ax.set_xticklabels(labels) 

print mpl.matplotlib_fname() 

canvas = FigureCanvas(fig) 
response = HttpResponse(content_type='image/png') 

canvas.print_png(response) 

return response 

che genera questa trama:

alt text

Come si può vedere la I xtick sono disossati. Qualche idea su come avvolgerli o renderli leggibili? Grazie ancora!

PS: questo fa parte di un progetto Django. Ritorna la trama come immagine png - normalmente li chiamano dai tag img in varie viste.

+1

'rotation = 'vertical'' potrebbe essere la risposta: http://stackoverflow.com/questions/1221108/barchart-with-vertical-labels-in-python-matplotlib – unutbu

+1

@ ~ unutbu:' rotation' può essere qualsiasi angolo, vedi: http://matplotlib.sourceforge.net/api/axes_api.html#matplotlib.axes.Axes.set_xlabel – Amro

+0

@Amro, grazie. 'xticks (rotation = 45)' potrebbe apparire migliore ... – unutbu

risposta

9

magari provare:

ax.set_xticklabels(labels, rotation=45) 

Grazie a Amro per aver ricordato che rotation can be any degree.

+1

o in una chiamata: 'ax.set_xticklabels (labels, rotation = 45)': http://matplotlib.sourceforge.net/api/axes_api.html#matplotlib .axes.Axes.set_xticklabels – Amro

+0

@Amro, grazie ancora. Se desideri pubblicare una risposta sarei felice di cancellare la mia. – unutbu

+0

ok, immagino sia stata una tua idea :) – Amro

0

Se si desidera avvolgere le etichette manualmente, è possibile inserire un '\ n' nel nome dell'etichetta, che interromperà l'etichetta in due righe nel punto in cui è presente il '\ n'. Puoi vedere un esempio di questo here.

Sembra che ci sia anche uno autowrap function che sembra fare bene il trucco. Questo esempio usa plt.text, ma è anche un attributo che puoi specificare con plt.xticks. (ad esempio wrap=True) Ho trovato questo tipo di incasinato allineamento delle etichette, quindi ho dovuto modificare anche gli allineamenti orizzontali e verticali.