如何使用 mode='expand' 并在仅给定一个标签条目的情况下将图例标签居中?
How to use mode='expand' and center a figure-legend label given only one label entry?
我想为子图生成居中图例,其中有一个标签。对于我的实际用例,子图的数量大于或等于一个;可以有一个 2x2 的子图网格,我想使用图形图例而不是使用 ax.legend(...)
,因为相同的单个标签条目将应用于 each/every 子图。
作为一个简短的简化示例,请考虑下面的代码:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(10)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y, color='orange', label='$f(x) = sin(x)$')
fig.subplots_adjust(bottom=0.15)
fig.legend(mode='expand', loc='lower center')
plt.show()
plt.close(fig)
此代码将生成下图:
我想使用 mode='expand'
kwarg 使图例跨越子图的整个宽度;但是,这样做会阻止标签居中。例如,从代码中删除这个 kwarg 会输出下图。
有没有办法既使用 mode='expand'
又让标签居中(因为只有一个标签)?
编辑:
我试过使用 bbox_to_anchor
kwargs(如 docs 中所建议)作为 mode='expand'
的替代方法,但这也不起作用。可以将 fig.legend(...)
行切换为下面的行以供自己测试。
fig.legend(loc='lower center', bbox_to_anchor=(0, 0, 1, 0.5))
手柄和标签与图例的左侧齐平。没有允许对齐它们的机制。
一种解决方法是使用 3 列图例句柄并用透明句柄填充第一列和第三列。
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(10)
y = np.sin(x)
fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.15)
line, = ax.plot(x, y, color='orange', label='$f(x) = sin(x)$')
proxy = plt.Rectangle((0,0),1,1, alpha=0)
fig.legend(handles=[proxy, line, proxy], mode='expand', loc='lower center', ncol=3)
plt.show()
我想为子图生成居中图例,其中有一个标签。对于我的实际用例,子图的数量大于或等于一个;可以有一个 2x2 的子图网格,我想使用图形图例而不是使用 ax.legend(...)
,因为相同的单个标签条目将应用于 each/every 子图。
作为一个简短的简化示例,请考虑下面的代码:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(10)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y, color='orange', label='$f(x) = sin(x)$')
fig.subplots_adjust(bottom=0.15)
fig.legend(mode='expand', loc='lower center')
plt.show()
plt.close(fig)
此代码将生成下图:
我想使用 mode='expand'
kwarg 使图例跨越子图的整个宽度;但是,这样做会阻止标签居中。例如,从代码中删除这个 kwarg 会输出下图。
有没有办法既使用 mode='expand'
又让标签居中(因为只有一个标签)?
编辑:
我试过使用 bbox_to_anchor
kwargs(如 docs 中所建议)作为 mode='expand'
的替代方法,但这也不起作用。可以将 fig.legend(...)
行切换为下面的行以供自己测试。
fig.legend(loc='lower center', bbox_to_anchor=(0, 0, 1, 0.5))
手柄和标签与图例的左侧齐平。没有允许对齐它们的机制。
一种解决方法是使用 3 列图例句柄并用透明句柄填充第一列和第三列。
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(10)
y = np.sin(x)
fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.15)
line, = ax.plot(x, y, color='orange', label='$f(x) = sin(x)$')
proxy = plt.Rectangle((0,0),1,1, alpha=0)
fig.legend(handles=[proxy, line, proxy], mode='expand', loc='lower center', ncol=3)
plt.show()