43

I've been trying to wrap text for long labels in my code. I tried the textwrap method suggested earlier here, but my code defines yticklabels through an array imported from a csv using the pyplot.setp() method. I'm using tight_layout() for the formatting otherwise.

So the question is - is there a way to wrap the really long y labels to newlines easily?

Here is some sample code that I'd like a fix for:

import numpy as np
import matplotlib.pyplot as plt

labels=('Really really really really really really long label 1', 'Really really really really really really long label 2', 'Really really really really really really long label 3')
values=(30,50,40)

fig = plt.figure()
ax=fig.add_subplot(111)

plt.ylim((0,40))
for i in np.arange(3):
    plt.barh(15*i, values[i])

plt.yticks(15*np.arange(3))
plt.setp(ax.set_yticklabels(labels))

plt.tight_layout()
plt.show()

This plots something like this enter image description here I'd like the labels to go to newlines after a fixed width. Any ideas?

Community
  • 1
  • 1
chinmayn
  • 433
  • 1
  • 4
  • 5

2 Answers2

71

I have tried using textwrap on the labels and it works for me.

from textwrap import wrap
labels=['Really really really really really really long label 1',
        'Really really really really really really long label 2',
        'Really really really really really really long label 3']
labels = [ '\n'.join(wrap(l, 20)) for l in labels ]

Inserting this in your code gives us:

Wrapped labels

daedalus
  • 10,873
  • 5
  • 50
  • 71
8

If you are looking for a fast way to wrap your labels dynamically, you can simply replace ' ' by '\n' like this :

wrapped_labels = [ label.replace(' ', '\n') for label in labels ]
boblatouffe
  • 89
  • 1
  • 1