172

I am trying to plot two separate quantities on the same graph using twiny as follows:

fig = figure()
ax = fig.add_subplot(111)
ax.plot(T, r, 'b-', T, R, 'r-', T, r_geo, 'g-')
ax.set_yscale('log')
ax.annotate('Approx. sea level', xy=(Planet.T_day*1.3,(Planet.R)/1000), xytext=(Planet.T_day*1.3, Planet.R/1000))
ax.annotate('Geostat. orbit', xy=(Planet.T_day*1.3, r_geo[0]), xytext=(Planet.T_day*1.3, r_geo[0]))
ax.set_xlabel('Rotational period (hrs)')
ax.set_ylabel('Orbital radius (km), logarithmic')
ax.set_title('Orbital charts for ' + Planet.N, horizontalalignment='center', verticalalignment='top')


ax2 = ax.twiny()
ax2.plot(v,r,'k-')
ax2.set_xlabel('Linear speed (ms-1)')

show()

and the data is presented fine, but I am having the problem that the figure title is overlapping with the axes labels on the secondary x axis so that it's barely legible (I wanted to post a picture example here, but I don't have a high enough rep yet).

I'd like to know if there's a straightforward way to just shift the title directly up a few tens of pixels, so that the chart looks prettier.

0

9 Answers 9

302

I'm not sure whether it is a new feature in later versions of matplotlib, but at least for 1.3.1, this is simply:

plt.title(figure_title, y=1.08)

This also works for plt.suptitle(), but not (yet) for plt.xlabel(), etc.

Sign up to request clarification or add additional context in comments.

9 Comments

For labels you can set the argument labelpad, see here.
For what it's worth, it's not a new feature. title has taken x and y arguments for a very long time (as long as I can remember, at any rate).
plt.set_title('title string', y = 1.08) works for me.
It would be more helpful if someone explained what units 1.08 is and what are the defaults. My understanding is that default is 1
@JohnCummings It seems that the default value is y=1 and the units is "axes fraction", i.e., y=0.5 means the title is in the middle of the axes, and y=0 means the title is just above the bottom of the axes.
|
37

Forget using plt.title and place the text directly with plt.text. An over-exaggerated example is given below:

import pylab as plt

fig = plt.figure(figsize=(5,10))

figure_title = "Normal title"
ax1  = plt.subplot(1,2,1)

plt.title(figure_title, fontsize = 20)
plt.plot([1,2,3],[1,4,9])

figure_title = "Raised title"
ax2  = plt.subplot(1,2,2)

plt.text(0.5, 1.08, figure_title,
         horizontalalignment='center',
         fontsize=20,
         transform = ax2.transAxes)
plt.plot([1,2,3],[1,4,9])

plt.show()

enter image description here

2 Comments

@user815423426 yes, tight_layout still doesn't seem to play nicely with non-standard placements. Perhaps you could make a bug report?
I found a work around when using tight_layout, at least when you save your plot using figure.savefig(). If title = plt.title(...) then you can specify to frame the plot tightly around the title using the option bbox_extra_artists : figure.savefig(filename, bbox_extra_artists=(title), bbox_inches='tight')
26

I was having an issue with the x-label overlapping a subplot title; this worked for me:

import matplotlib.pyplot as plt
fig, ax = plt.subplots(2, 1)
ax[0].scatter(...)
ax[1].scatter(...)
plt.tight_layout()
.
.
.
plt.show()

before

enter image description here

after

enter image description here

reference:

1 Comment

I also use tight_layout() but unfortunately if title has backgroundcolor set, there is still overlap
13
ax.set_title('My Title\n', fontsize="15", color="red")
plt.imshow(myfile, origin="upper")

If you put '\n' right after your title string, the plot is drawn just below the title. That might be a fast solution too.

Comments

11

You can use pad for this case:

ax.set_title("whatever", pad=20)

Comments

6

Just use plt.tight_layout() before plt.show(). It works well.

Comments

0

A temporary solution if you don't want to get into the x, y position of your title.

Following worked for me.

plt.title('Capital Expenditure\n') # Add a next line after your title

kudos.

Comments

0

Using the plt.tight_layout() before the plt.show() works for me well.

you can even make it better and visible by adding a padding

ax.set_title("title", pad=15)

Comments

0

You can use pad with title

plt.title("My title", pad=20)

If you are using title and subtitle using pad on title helps to push up and reduce the space between the two titles.

plt.suptitle('Main title')
plt.title("This is the second title", pad=20)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.