<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 .. _markers
Step1:  Markers can also be added to regular plots to highlight the datums (they are turned-off by default)
Step2:  You can use the size argument to control the size of the markers (note that the size argument is treated as an approximation of the area of the marker)
Step3:  By default, the markers are small circles, but there are many alternatives
Step4:  Note the use of the mstyle argument to override the appearance of the marker in the second example.  For line plots, this allows you to style the lines and the markers separately
Step5:  So far, we've been using string codes to specify different marker shapes.  Here is every builtin marker shape in Toyplot, with their string codes
Step6:  There are several items worth noting - first, you can pass a sequence of marker codes to the marker argument, to specify markers on a per-series or per-datum basis.  Second, you can pass an empty string or None to produce an invisible marker, if you need to hide a datum or declutter the display.  Third, note that several of the marker shapes contain internal details that require a contrasting stroke and fill to be visible.
So far, we've been using the marker shape code to specify our markers, but this is actually a shortcut.  A full marker specification takes the form of a Python dictionary
Step7:  Using the full marker specification allows you to control additional parameters such as the marker angle and label.  Also note the mlstyle argument which controls the style of the marker label, independently of the marker itself.
You can also use custom marker shapes, specifying the shape as an SVG path
Step8:  Note that the SVG path must contain only relative coordinates, or the marker will not render correctly.  In this example the marker was exported as SVG from a drawing application, the path was run through an online conversion process to convert absolute coordinates to relative coordinates, and the initial "move" (m) command was adjusted to center the graphic.  For custom markers, the size argument currently acts as a simple scaling factor on the marker (this may change in the future).  Here is an (admittedly silly) example of a custom marker at work
<ASSISTANT_TASK:>
Python Code:
import numpy
import toyplot
y = numpy.linspace(0, 1, 20) ** 2
toyplot.scatterplot(y, width=300);
Explanation: .. _markers:
Markers
In Toyplot, markers are used to show the individual datums in scatterplots:
End of explanation
canvas = toyplot.Canvas(600, 300)
canvas.axes(grid=(1, 2, 0)).plot(y)
canvas.axes(grid=(1, 2, 1)).plot(y, marker="o");
Explanation: Markers can also be added to regular plots to highlight the datums (they are turned-off by default):
End of explanation
canvas = toyplot.Canvas(600, 300)
canvas.axes(grid=(1, 2, 0)).plot(y, marker="o", size=40)
canvas.axes(grid=(1, 2, 1)).plot(y, marker="o", size=100);
Explanation: You can use the size argument to control the size of the markers (note that the size argument is treated as an approximation of the area of the marker):
End of explanation
canvas = toyplot.Canvas(600, 300)
canvas.axes(grid=(1, 2, 0)).scatterplot(y, marker="x", size=100)
canvas.axes(grid=(1, 2, 1)).scatterplot(y, marker="^", size=100, mstyle={"stroke":toyplot.color.near_black});
Explanation: By default, the markers are small circles, but there are many alternatives:
End of explanation
canvas = toyplot.Canvas(600, 300)
canvas.axes(grid=(1, 2, 0)).plot(y, marker="o", size=50, style={"stroke":"darkgreen"})
canvas.axes(grid=(1, 2, 1)).plot(y, marker="o", size=50, mstyle={"stroke":"darkgreen"});
Explanation: Note the use of the mstyle argument to override the appearance of the marker in the second example.  For line plots, this allows you to style the lines and the markers separately:
End of explanation
markers = [None, "","|","-","+","x","*","^",">","v","<","s","d","o","oo","o|","o-","o+","ox","o*"]
labels = [repr(marker) for marker in markers]
mstyle = {"stroke":toyplot.color.near_black, "fill":"#feb"}
canvas = toyplot.Canvas(800, 150)
axes = canvas.axes(xmin=-1, show=False)
axes.scatterplot(numpy.repeat(0, len(markers)), marker=markers, mstyle=mstyle, size=200)
axes.text(numpy.arange(len(markers)), numpy.repeat(-0.5, len(markers)), text=labels, fill=toyplot.color.near_black, style={"font-size":"16px"});
Explanation: So far, we've been using string codes to specify different marker shapes.  Here is every builtin marker shape in Toyplot, with their string codes:
End of explanation
canvas = toyplot.Canvas(600, 300)
canvas.axes(grid=(1, 2, 0)).scatterplot(y, marker={"shape":"|", "angle":45}, size=100)
canvas.axes(grid=(1, 2, 1)).scatterplot(y, marker={"shape":"o", "label":"A"}, size=200, mlstyle={"fill":"white"});
Explanation: There are several items worth noting - first, you can pass a sequence of marker codes to the marker argument, to specify markers on a per-series or per-datum basis.  Second, you can pass an empty string or None to produce an invisible marker, if you need to hide a datum or declutter the display.  Third, note that several of the marker shapes contain internal details that require a contrasting stroke and fill to be visible.
So far, we've been using the marker shape code to specify our markers, but this is actually a shortcut.  A full marker specification takes the form of a Python dictionary:
End of explanation
custom_marker = {"shape":"path", "path":"m -165 45 c 8.483 6.576 17.276 11.581 26.38 15.013 c 9.101 3.431 18.562 5.146 28.381 5.146 c 9.723 0 17.801 -1.595 24.235 -4.789 c 6.434 -3.192 11.271 -7.887 14.513 -14.084 c 3.239 -6.194 4.861 -13.868 4.861 -23.02 h 6.72 c 0.19 2.384 0.286 5.054 0.286 8.007 c 0 15.92 -6.244 27.405 -18.73 34.458 c 12.01 -2.002 22.852 -4.74 32.528 -8.222 c 9.673 -3.478 20.231 -8.458 31.669 -14.94 l 4.003 7.148 c -13.346 8.389 -28.359 15.109 -45.038 20.16 c -16.682 5.054 -32.123 7.578 -46.325 7.578 c -13.44 0 -26.451 -2.12 -39.033 -6.363 c -12.583 -4.24 -22.877 -9.937 -30.884 -17.086 c -2.766 -2.667 -4.146 -5.098 -4.146 -7.291 c 0 -1.238 0.476 -2.335 1.43 -3.289 c 0.952 -0.951 2.048 -1.43 3.289 -1.43 c 1.236 0.000995874 3.191 1.002 5.861 3.004 Z m 140.262 -81.355 c 8.579 0 12.868 4.195 12.868 12.582 c 0 7.055 -2.288 13.654 -6.863 19.802 c -4.575 6.148 -10.701 11.059 -18.373 14.727 c -7.674 3.671 -15.942 5.505 -24.807 5.505 c -9.343 0 -17.943 -1.881 -25.808 -5.647 c -7.864 -3.765 -14.083 -8.815 -18.659 -15.156 c -4.575 -6.338 -6.863 -13.176 -6.863 -20.517 c 0 -3.908 1.048 -6.767 3.146 -8.579 c 2.096 -1.81 5.48 -2.716 10.151 -2.716 h 75.208 Z m -30.741 -8.00601 c -2.766 0 -4.839 -0.451 -6.219 -1.358 c -1.383 -0.905 -2.359 -2.549 -2.931 -4.933 c -0.572 -2.381 -0.858 -5.623 -0.858 -9.723 c 0 -6.863 1.477 -14.963 4.432 -24.306 c 0.19 -1.238 0.286 -2.049 0.286 -2.431 c 0 -0.952 -0.382 -1.43 -1.144 -1.43 c -0.857 0 -1.955 0.954 -3.288 2.859 c -5.815 8.579 -9.629 19.351 -11.438 32.313 c -0.478 3.528 -1.383 5.911 -2.717 7.149 c -1.336 1.24 -3.624 1.859 -6.863 1.859 h -11.724 c -4.29 0 -7.27 -0.69 -8.936 -2.073 c -1.669 -1.381 -2.502 -3.979 -2.502 -7.792 c 0 -5.147 1.573 -9.959 4.718 -14.441 c 2.096 -3.239 4.455 -6.005 7.078 -8.292 c 2.621 -2.288 7.696 -5.956 15.227 -11.009 c 4.669 -3.146 8.172 -5.885 10.509 -8.221 c 2.335 -2.335 4.169 -5.076 5.505 -8.221 c 0.858 -2.288 2.145 -3.432 3.86 -3.432 c 1.43 0 2.764 1.336 4.003 4.003 c 1.62 3.242 3.192 5.647 4.718 7.22 c 1.524 1.573 4.669 4.075 9.437 7.506 c 18.301 12.393 27.452 23.402 27.452 33.028 c 0 7.817 -4.576 11.724 -13.726 11.724 h -24.879 Z m 156.705 -2.57399 c 5.812 -8.007 12.152 -12.01 19.016 -12.01 c 2.953 0 5.719 0.764 8.293 2.288 c 2.574 1.526 4.598 3.503 6.076 5.934 c 1.477 2.431 2.217 4.933 2.217 7.506 c 0 4.576 1.381 6.863 4.146 6.863 c 1.43 0 3.479 -0.809 6.146 -2.431 c 3.336 -1.716 6.482 -2.574 9.438 -2.574 c 4.766 0 8.625 1.669 11.582 5.004 c 2.953 3.337 4.432 7.435 4.432 12.296 c 0 5.147 -1.383 8.985 -4.146 11.51 c -2.766 2.527 -7.148 4.028 -13.154 4.504 c -2.859 0.192 -4.695 0.525 -5.504 1.001 c -0.811 0.478 -1.215 1.526 -1.215 3.146 c 0 0.286 0.547 2.194 1.643 5.719 c 1.096 3.527 1.645 6.387 1.645 8.578 c 0 4.004 -1.5 7.245 -4.504 9.723 c -3.002 2.48 -6.887 3.718 -11.652 3.718 c -3.051 0 -8.006 -1.048 -14.869 -3.146 c -2.289 -0.762 -3.861 -1.144 -4.719 -1.144 c -1.43 0 -2.574 0.429 -3.432 1.286 c -0.857 0.858 -1.287 2.051 -1.287 3.575 c 0 1.336 0.715 3.527 2.145 6.576 c 1.145 2.288 1.717 4.433 1.717 6.435 c 0 3.623 -1.525 6.673 -4.576 9.15 c -3.051 2.479 -6.816 3.718 -11.295 3.718 c -3.051 0 -6.959 -1.001 -11.725 -3.003 c -3.812 -1.523 -6.244 -2.287 -7.291 -2.287 c -3.719 0 -5.576 2.812 -5.576 8.436 c 0 14.107 -9.057 21.16 -27.166 21.16 c -10.105 0 -19.588 -2.381 -28.453 -7.148 c -8.865 -4.766 -16.062 -11.39 -21.589 -19.874 c 10.867 -4.955 25.783 -13.916 44.751 -26.88 c 13.248 -8.673 24.043 -15.084 32.385 -19.23 c 8.34 -4.146 17.562 -7.601 27.666 -10.366 c 8.102 -2.381 19.396 -4.526 33.887 -6.434 c 1.047 0 1.572 -0.286 1.572 -0.858 c 0 -1.144 -3.527 -1.716 -10.58 -1.716 c -12.393 0 -25.164 1.908 -38.318 5.719 c -14.68 4.481 -30.883 12.203 -48.613 23.163 c -14.488 8.579 -24.258 14.347 -29.311 17.301 c -5.053 2.955 -8.244 4.789 -9.578 5.504 c -1.335 0.715 -4.099 2.026 -8.293 3.933 c -3.146 -7.625 -4.718 -15.632 -4.718 -24.021 c 0 -6.099 0.809 -11.914 2.431 -17.443 c 1.62 -5.527 3.812 -10.317 6.577 -14.37 c 2.763 -4.05 5.955 -7.196 9.58 -9.437 c 3.621 -2.238 7.48 -3.36 11.58 -3.36 c 4.098 0 8.008 1.669 11.725 5.004 c 2.953 2.766 5.193 4.146 6.721 4.146 c 3.621 0 5.67 -2.953 6.146 -8.864 c 1.811 -16.394 8.959 -24.592 21.447 -24.592 c 3.812 0 7.006 0.979 9.58 2.931 c 2.574 1.955 5.004 5.219 7.291 9.794 c 2.002 3.431 4.291 5.147 6.863 5.147 c 3.61802 -0.00100613 7.909 -3.19301 12.866 -9.58 Z"}
canvas, axes, mark = toyplot.scatterplot(0, 0, size=0.1, marker=custom_marker, color="#004712", width=400);
axes.hlines(0, style={"stroke-width":0.1})
axes.vlines(0, style={"stroke-width":0.1});
Explanation: Using the full marker specification allows you to control additional parameters such as the marker angle and label.  Also note the mlstyle argument which controls the style of the marker label, independently of the marker itself.
You can also use custom marker shapes, specifying the shape as an SVG path:
End of explanation
x = numpy.linspace(0, 100, 10)
y = (0.1 * x) ** 2
canvas, axes, mark = toyplot.scatterplot(x, y, size=.015, color="#004712", marker=custom_marker, xlabel="Years", ylabel="Oak Tree Population", padding=25, width=600);
Explanation: Note that the SVG path must contain only relative coordinates, or the marker will not render correctly.  In this example the marker was exported as SVG from a drawing application, the path was run through an online conversion process to convert absolute coordinates to relative coordinates, and the initial "move" (m) command was adjusted to center the graphic.  For custom markers, the size argument currently acts as a simple scaling factor on the marker (this may change in the future).  Here is an (admittedly silly) example of a custom marker at work:
End of explanation
<END_TASK>