设置轴高度 - 将轴高度拉伸到图例高度

时间:2017-10-25 08:10:38

标签: python-2.7 matplotlib legend axes

我有一个带有图例的图表,其高度大于轴的高度(就像下面代码的结果一样)。现在,我想以这样的方式拉伸轴高度,使其在图例的末端结束。

import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0., 10.5, 0.5)

fig, ax = plt.subplots()
for c in range(0, 20):
    ax.plot(t, t*c/2, label='func {}'.format(c))
ax.legend(bbox_to_anchor=(1.01, 1), loc=2, borderaxespad=0.)

enter image description here

我想拥有的是这样的(如果网格的底部或刻度的底部以图例结尾,则无关紧要)

enter image description here

我试图通过添加以下代码达到我的目标,但没有任何效果(legend_h总是= 1.0):

legend_h = ax.get_legend().get_window_extent().height
ax_height = ax.get_window_extent().height

if ax_height < legend_h:
    fig.set_figheight(legend_h/ax_height * fig.get_figheight())

此外,如果我只能改变轴本身的属性而不是整个图形的属性,那将是很好的。

修改 我的主要目的是从脚本运行图形生成,但我也在Ipython笔记本中尝试过它。一次尝试也是在获得高度并设置新的身高之前临时存储数字。但这也没有产生正确的结果。

2 个答案:

答案 0 :(得分:0)

我认为只需将plt.draw()添加到您已有的内容即可达到您想要的效果,例如

fig, ax = plt.subplots()
for c in range(0, 20):
    ax.plot(t, t*c/2, label='func {}'.format(c))
ax.legend(bbox_to_anchor=(1.01, 1), loc=2, borderaxespad=0.)

plt.draw()

legend_h = ax.get_legend().get_window_extent().height
ax_height = ax.get_window_extent().height

if ax_height < legend_h:
    fig.set_figheight(legend_h/ax_height * fig.get_figheight())

更新:此外,您可以尝试(应该从脚本开始,并基于this answer):

import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0., 10.5, 0.5)

fig, ax = plt.subplots()
for c in range(0, 20):
    ax.plot(t, t*c/2, label='func {}'.format(c))
lgd = ax.legend(bbox_to_anchor=(1.01, 1), loc=2, borderaxespad=0.)

fig.tight_layout()
fig.savefig('script.png', bbox_extra_artists=(lgd,), bbox_inches='tight')

答案 1 :(得分:0)

原则上,@ Matt Pitkin的答案显示了正确的方法。但是,不是set_figheight,而是使用set_size_inches。计算还需要包括图形边距,可以从fig.subplotpars获得。

除了高度,我们还可以设置图形的宽度,以便包含图例。

import matplotlib.pyplot as plt
import numpy as np

t = np.linspace(0,10); c=20

fig, ax = plt.subplots()
for c in range(0, 20):
    ax.plot(t, t*c/2, label='func {}'.format(c))
bbox = (1.01,1)    
ax.legend(bbox_to_anchor=bbox, loc=2, borderaxespad=0.)

fig.canvas.draw()

legend_h = ax.get_legend().get_window_extent().height
ax_height = ax.get_window_extent().height
if ax_height < legend_h:
    w,h = fig.get_size_inches()
    h =legend_h/fig.dpi/(fig.subplotpars.top-fig.subplotpars.bottom)
    fig.set_size_inches(w,h)

# set width as well
w,h = fig.get_size_inches()
r = ax.get_legend().get_window_extent().width/fig.dpi/w
fig.subplots_adjust(right=1-1.1*r)
plt.show()

下图是将其作为脚本运行时。

enter image description here

在Ipython或jupyter中,图形将自动裁剪或展开,因为显示的png会使用bbox_inches='tight'选项自动保存。因此,jupyter笔记本不需要宽度调整。