Skip to content Skip to sidebar Skip to footer

Seaborn: Is There A Better Way To Wrap The Text In My Bar Plot?

I am writing a function for bar plots and have encountered another small problem. I have some ytick labels that are too long, causing my y axis label not able to be seen. I'm only

Solution 1:

As @ImportanceOfBeingErnest pointed out, you can use the textwrap module to do this, specifically useful would be textwrap.fill():

textwrap.fill(text[, width[, ...]])

Wraps the single paragraph in text so every line is at most width characters long, and returns a single string containing the wrapped paragraph. fill() is shorthand for

"\n".join(wrap(text, ...))

Although you will need to call this on each label separately with something like

ax.set_yticklabels([textwrap.fill(e, width) for e in data[y].head()])

Edit

Here is a more complete example to show the usage:

import textwrap
import matplotlib.pyplot as plt
import pandas as pd

df = {'Client Name': ['Some Name', 'Some long company name', 'Name',
            'Company', 'Long Comany Name'],
      'Col 1': [51235, 152, 12554, 12464, 12434]}
data = pd.DataFrame(df)

fig, ax = plt.subplots(1)


ax.set_yticklabels(data['Client Name'].head())
plt.show()

This will show the following

enter image description here

whereas

ax.set_yticklabels([textwrap.fill(e, 7) for e in data['Client Name'].head()])
plt.show()

will show something more like

enter image description here


Solution 2:

textwrap seems easy to use, but it splits the sentence at a predetermined number of characters. Here is a function to insert a newline symbol (\n) every n words. You can then use out as labels x- (or y-) axis tick marks. It might also be wise to avoid any unnecessary package dependencies.

Lst = ['You can never understand one language until you understand at least two.',
       'Language is the blood of the soul into which thoughts run and out of which they grow.']
InsertNewlines = lambda lst, n=2: '\n'.join([' '.join(lst[i:i + n]) for i in range(0, len(lst), n)]) # n=words to keep together
out = [InsertNewlines(s.split()) for s in Lst]

Output:

['You can\nnever understand\none language\nuntil you\nunderstand at\nleast two.',
 'Language is\nthe blood\nof the\nsoul into\nwhich thoughts\nrun and\nout of\nwhich they\ngrow.']

Post a Comment for "Seaborn: Is There A Better Way To Wrap The Text In My Bar Plot?"