<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Issue 26
Step1:  Builtin method to highlight clades
Step2:  Or, use toyplot directly
This method is more flexible and you can do just about anything with it.
Step3:  More examples
Things can get a little wonky with respect to the tipnames when you add extra elements on the same set of axes, since it affects the extents of the plot. This makes it difficult to create automated functions like the .draw_clade_box() annotation function above that will work generally for any tip names. This is something that I hope to improve in the future...
<ASSISTANT_TASK:>
Python Code:
import toytree
import toyplot
# generate a random tree
tre = toytree.rtree.unittree(ntips=10, treeheight=100, seed=123)
Explanation: Issue 26: highlight clades
I've created an early form of an Annotator class object that can be used to add highlights to a toytree drawing. 
Possible extensions:  
- apply linear gradient of &gt;1 colors  
- box around tipnames  
- ...
End of explanation
# draw tree on canvas
canvas, axes, mark = tre.draw(ts='c', layout='r', tip_labels=True);
# get annotator tool
anno = toytree.utils.Annotator(tre, axes, mark)
# annotate clade by selecting names
anno.draw_clade_box(
    names=['r0', 'r5'],
    style={
        "fill": 'red',
        "fill-opacity": 0.15,
        "stroke-width": 2, 
        "stroke": 'red',
        "stroke-opacity": 0.3,
    },
);
Explanation: Builtin method to highlight clades
End of explanation
# draw tree on canvas
canvas, axes, mark = tre.draw(ts='o', layout='r', tip_labels=False);
# draw rectangles next to two clades
axes.rectangle(20, 40, -0.45, 3.45, color=toytree.colors[1], opacity=0.5)
axes.rectangle(20, 40,  3.55, 5.45, color=toytree.colors[2], opacity=0.5)
axes.rectangle(20, 40,  5.55, 9.45, color=toytree.colors[3], opacity=0.5)
axes.text(50, 1.5, "clade A", style={"text-anchor": "start", "fill": toytree.colors[1]})
axes.text(50, 4.5, "clade B", style={"text-anchor": "start", "fill": toytree.colors[2]})
axes.text(50, 7.5, "clade C", style={"text-anchor": "start", "fill": toytree.colors[3]});
Explanation: Or, use toyplot directly
This method is more flexible and you can do just about anything with it.
End of explanation
import numpy as np
import string
tre = toytree.rtree.unittree(ntips=10, treeheight=100, seed=123)
tre = tre.set_node_values(
    "name",
    {i: str(i) + string.ascii_letters[:np.random.randint(5, 15)] for i in range(10)}
)
color = toytree.colors[1]
# draw tree on canvas
canvas, axes, mark = tre.draw(ts='c', layout='r', tip_labels=True);
# get annotator tool
anno = toytree.utils.Annotator(tre, axes, mark)
# annotate clade
anno.draw_clade_box(
    tre.get_tip_labels()[:3],
    yspace=tre.treenode.height / 15,
    style={
        "fill": color,
        "fill-opacity": 0.25,
        "stroke-width": 2, 
        "stroke": color,
        "stroke-opacity": 0.5,
    },
);
Explanation: More examples
Things can get a little wonky with respect to the tipnames when you add extra elements on the same set of axes, since it affects the extents of the plot. This makes it difficult to create automated functions like the .draw_clade_box() annotation function above that will work generally for any tip names. This is something that I hope to improve in the future...
End of explanation
<END_TASK>