无法找到关于如何将matplotlib中的checkbuttons框格式化为行与列格式的任何操作。我发现我可以移动实际的复选框和标签(在文字对象上使用get_position
,在矩形对象上使用set_xy
),但这看起来并不像我单独移动它们时的最佳方式,而且它们看起来不像使用相同的坐标系。Matplotlib连续检查按钮
有没有更简单的方法来将我的检查按钮从一列变成一行?
无法找到关于如何将matplotlib中的checkbuttons框格式化为行与列格式的任何操作。我发现我可以移动实际的复选框和标签(在文字对象上使用get_position
,在矩形对象上使用set_xy
),但这看起来并不像我单独移动它们时的最佳方式,而且它们看起来不像使用相同的坐标系。Matplotlib连续检查按钮
有没有更简单的方法来将我的检查按钮从一列变成一行?
没有简单的方法使复选框出现在一行而不是列中。原因是它们是根据坐标轴进行硬编码的。当然你可以移动这些零碎的东西,但这听起来很麻烦。
一个不同的选项是子类CheckButtons
类和实现您自己的布局。现在当这样做的时候,需要考虑很多事情,比如标签和复选框之间有多少空间等。
另一方面,实际上有一个很好的matplotlib项目,它可以让所有的旋钮关于可用的标签间距,填充等,并与行和列一起工作:传说。
现在我在想为什么不把复选框产生为可点击的图例。这是下面的代码所做的。它的子类CheckButtons
并在其轴上创建一个图例。该图例具有作为手柄的框和作为图例标签的标签。 好在现在您可以使用所有工具usual legend allows for:fontsize, markerfirst, frameon, fancybox, shadow, framealpha, facecolor, edgecolor, mode, bbox_transform, title, borderpad, labelspacing, handlelength, handletextpad, borderaxespad, columnspacing
来按照自己的喜好布置检查按钮。
这里最重要的是n_col
,你可以设置你想要的列数。
我从matplotlib页面取了CheckButtons
example,并在其上使用了这个定制的Checkbuttons类。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import CheckButtons,AxesWidget
class PremiumCheckButtons(CheckButtons,AxesWidget):
def __init__(self, ax, labels, actives, linecolor="k", showedge=True, **kw):
AxesWidget.__init__(self, ax)
ax.set_xticks([])
ax.set_yticks([])
ax.set_navigate(False)
if not showedge:
ax.axis("off")
linekw = {'solid_capstyle': 'butt', "color" : linecolor}
class Handler(object):
def legend_artist(self, legend, orig_handle, fontsize, handlebox):
x0, y0 = handlebox.xdescent, handlebox.ydescent
height = handlebox.height
self.line1 = plt.Line2D([x0,x0+height],[y0,y0+height], **linekw)
self.line2 = plt.Line2D([x0,x0+height],[y0+height,y0], **linekw)
self.rect = plt.Rectangle((x0,y0),height, height,
edgecolor="k", fill=False)
handlebox.add_artist(self.rect)
handlebox.add_artist(self.line1)
handlebox.add_artist(self.line2)
return [self.line1, self.line2, self.rect]
self.box = ax.legend(handles = [object() for i in labels ],
labels = labels,
handler_map={object: Handler()}, **kw)
self.lines = [(h[0],h[1]) for h in self.box.legendHandles]
self.rectangles = [h[2] for h in self.box.legendHandles]
self.labels = self.box.texts
for i,(l1,l2) in enumerate(self.lines):
l1.set_visible(actives[i])
l2.set_visible(actives[i])
self.connect_event('button_press_event', self._clicked)
self.cnt = 0
self.observers = {}
t = np.arange(0.0, 2.0, 0.01)
s0 = np.sin(2*np.pi*t)
s1 = np.sin(4*np.pi*t)
s2 = np.sin(6*np.pi*t)
fig, (rax,ax) = plt.subplots(nrows=2, gridspec_kw=dict(height_ratios = [0.1,1]))
l0, = ax.plot(t, s0, visible=False, lw=2)
l1, = ax.plot(t, s1, lw=2)
l2, = ax.plot(t, s2, lw=2)
plt.subplots_adjust(left=0.2)
check = PremiumCheckButtons(rax, ('2 Hz', '4 Hz', '6 Hz'), (False, True, True),
showedge = False, ncol=3)
def func(label):
if label == '2 Hz':
l0.set_visible(not l0.get_visible())
elif label == '4 Hz':
l1.set_visible(not l1.get_visible())
elif label == '6 Hz':
l2.set_visible(not l2.get_visible())
fig.canvas.draw_idle()
check.on_clicked(func)
plt.show()
除了所有legend
参数,上述PremiumCheckButtons
类需要的参数linecolor
设置复选框的x
(默认为黑色)和showedge
的颜色。 showedge
可用于显示“图例”所在的轴的框架,并且可以打开以查看此轴用于调试目的。例如。您需要确保完整的图例实际位于轴的内部,以使按钮可点击。
这是一个WOW!非常酷的扩展。 –