oakca
oakca

Reputation: 1568

dividing long xticks in 2 lines matplotlib

I have the following matplotlib

I would like to divide x-ticks into 2 lines instead of 1 because sometimes they are so long that is why they come over another and then it is impossible to read x-ticks.

KEEP IN MIND X-ticks are not hard coded and they are changing. So not always same x-ticks.

So for following example it would be good if I have instead of to Schleswig-Holstein I could have:

to Schleswig-
  Holstein

How would I put the string after - in newline for the x ticks? or simply after lets say 10 letters I wanna go to a new line

Btw it would be also good if I could center all the text like the example above

So following is also okay but not the best.

to Schleswig-
Holstein

plot

PS: Here is the code I use:

# create figure
fig = plt.figure()

# x-Axis (sites)
i = np.array(i)
i_pos = np.arange(len(i))

# y-Axis (values)
u = urbs_values
o = oemof_values

plt.bar(i_pos-0.15, list(u.values()), label='urbs', align='center', alpha=0.75, width=0.2)
plt.ticklabel_format(axis='y', style='sci', scilimits=(0, 0))
plt.bar(i_pos+0.15, list(o.values()), label='oemof', align='center', alpha=0.75, width=0.2)
plt.ticklabel_format(axis='y', style='sci', scilimits=(0, 0))

# tick names
plt.xticks(i_pos, list(map((' to ').__add__, list(u.keys()))))

# plot specs
plt.xlabel('Lines')
plt.ylabel('Capacity [MW]')
plt.title(site+' '+name)
plt.grid(True)
plt.legend()
plt.ticklabel_format(style='sci', axis='y')
# plt.show()

# save plot
fig.savefig(os.path.join(result_dir, 'comp_'+name+'_'+site+'.png'), dpi=300)
plt.close(fig)

Upvotes: 2

Views: 8690

Answers (1)

Sheldore
Sheldore

Reputation: 39072

You can use re as suggested on this answer and create a list of new labels with a new line character after every 10th character.

import re
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

xlabels = ["to Schleswig-Holstein", "to Mecklenburg-Vorpommern", r"to Lower Saxony"]

xlabels_new = [re.sub("(.{10})", "\\1\n", label, 0, re.DOTALL) for label in xlabels]

plt.plot(range(3))
plt.xticks(range(3), xlabels_new)
plt.show()

enter image description here

Alternative

xlabels_new = [label.replace('-', '-\n') for label in xlabels]

enter image description here

Upvotes: 7

Related Questions