Matplotlib: Adjust legend location/position

后端 未结 2 1629
青春惊慌失措
青春惊慌失措 2021-02-07 14:28

I\'m creating a figure with multiple subplots. One of these subplots is giving me some trouble, as none of the axes corners or centers are free (or can be freed up) for placing

2条回答
  •  被撕碎了的回忆
    2021-02-07 14:35

    After spending way too much time on this, I've come up with the following satisfactory solution (the Transformations Tutorial definitely helped):

    bapad = plt.rcParams['legend.borderaxespad']
    fontsize = plt.rcParams['font.size']
    axline = plt.rcParams['axes.linewidth']  #need this, otherwise the result will be off by a few pixels
    pad_points = bapad*fontsize + axline  #padding is defined in relative to font size
    pad_inches = pad_points/72.0  #convert from points to inches
    pad_pixels = pad_inches*fig.dpi  #convert from inches to pixels using the figure's dpi
    

    Then, I found that both of the following work and give the same value for the padding:

    # Define inverse transform, transforms display coordinates (pixels) to axes coordinates
    inv = ax[1].transAxes.inverted()
    # Inverse transform two points on the display and find the relative distance
    pad_axes = inv.transform((pad_pixels, 0)) - inv.transform((0,0))  
    pad_xaxis = pad_axes[0]
    

    or

    # Find how may pixels there are on the x-axis
    x_pixels = ax[1].transAxes.transform((1,0)) - ax[1].transAxes.transform((0,0))
    # Compute the ratio between the pixel offset and the total amount of pixels 
    pad_xaxis = pad_pixels/x_pixels[0]
    

    And then set the legend with:

    ax[1].legend(loc=(pad_xaxis,0.6))
    

    Plot:

提交回复
热议问题