我有一个带有图例的图表,其高度大于轴的高度(就像下面代码的结果一样)。现在,我想以这样的方式拉伸轴高度,使其在图例的末端结束。
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.)
我想拥有的是这样的(如果网格的底部或刻度的底部以图例结尾,则无关紧要)
我试图通过添加以下代码达到我的目标,但没有任何效果(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笔记本中尝试过它。一次尝试也是在获得高度并设置新的身高之前临时存储数字。但这也没有产生正确的结果。
答案 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()
下图是将其作为脚本运行时。
在Ipython或jupyter中,图形将自动裁剪或展开,因为显示的png会使用bbox_inches='tight'
选项自动保存。因此,jupyter笔记本不需要宽度调整。