Source From Here
QuestionI have a series of 20 plots (not subplots) to be made in a single figure. I want the legend to be outside of the box. At the same time, I do not want to change the axes, as the size of the figure gets reduced. Kindly help me for the following queries:
How-To
You can make the legend text smaller by creating font properties:
- from matplotlib.font_manager import FontProperties
- fontP = FontProperties()
- fontP.set_size('small')
- legend([plot1], "title", prop=fontP)
- # or add prop=fontP to whatever legend() call you already have
- import matplotlib.pyplot as plt
- import numpy as np
- x = np.arange(10)
- fig = plt.figure()
- ax = plt.subplot(111)
- for i in xrange(5):
- ax.plot(x, i * x, label='$y = %ix$' % i)
- ax.legend()
- plt.show()
If we do the same thing, but use the bbox_to_anchor keyword argument we can shift the legend slightly outside the axes boundaries:
- import matplotlib.pyplot as plt
- import numpy as np
- x = np.arange(10)
- fig = plt.figure()
- ax = plt.subplot(111)
- for i in xrange(5):
- ax.plot(x, i * x, label='$y = %ix$' % i)
- ax.legend(bbox_to_anchor=(1.1, 1.05))
- plt.show()
Similarly, you can make the legend more horizontal and/or put it at the top of the figure (I'm also turning on rounded corners and a simple drop shadow):
- import matplotlib.pyplot as plt
- import numpy as np
- x = np.arange(10)
- fig = plt.figure()
- ax = plt.subplot(111)
- for i in xrange(5):
- line, = ax.plot(x, i * x, label='$y = %ix$'%i)
- ax.legend(loc='upper center', bbox_to_anchor=(0.5, 1.05),
- ncol=3, fancybox=True, shadow=True)
- plt.show()
Alternatively, you can shrink the current plot's width, and put the legend entirely outside the axis of the figure (note: if you use tight_layout(), then leave out ax.set_position():
- import matplotlib.pyplot as plt
- import numpy as np
- x = np.arange(10)
- fig = plt.figure()
- ax = plt.subplot(111)
- for i in xrange(5):
- ax.plot(x, i * x, label='$y = %ix$'%i)
- # Shrink current axis by 20%
- box = ax.get_position()
- ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
- # Put a legend to the right of the current axis
- ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
- plt.show()
And in a similar manner, you can shrink the plot vertically, and put the a horizontal legend at the bottom:
- import matplotlib.pyplot as plt
- import numpy as np
- x = np.arange(10)
- fig = plt.figure()
- ax = plt.subplot(111)
- for i in xrange(5):
- line, = ax.plot(x, i * x, label='$y = %ix$'%i)
- # Shrink current axis's height by 10% on the bottom
- box = ax.get_position()
- ax.set_position([box.x0, box.y0 + box.height * 0.1,
- box.width, box.height * 0.9])
- # Put a legend below current axis
- ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
- fancybox=True, shadow=True, ncol=5)
- plt.show()
Have a look at the matplotlib legend guide. You might also take a look at plt.figlegend().
沒有留言:
張貼留言