Interactive Plotting Library for .NET

API Reference

Cookbook Recipes

Concepts: Quickstart, Axis and Ticks, Advanced Axis Features, Multi-Axis, Statistics, Misc, Style

Plottables: Annotation, Arrow, Axis Line and Span, Bar Graph, Bubble, Colorbar, Fill, Finance, Function, Heatmap, Image, Pie, Point, Polygon, Population, Radar, Scale Bar, Scatter Plot, Signal Plot, SignalConst, SignalXY, SignalXYConst, Text, Tooltip, Vector Field

Quickstart

Scatter plots have paired X/Y points.

Signal plots have evenly spaced Y points. Signal plots are very fast and can interactively display millions of data points. There are many different types of plottable objects, each serving a different purpose.

Axis labels and limits can be customized

You can create a plot manually, then add it to the plot with Add(). This allows you to create custom plot types and add them to the plot.

Call Clear() to remove all plottables from the plot. Overloads of Clear() allow you to remote one type of plottable, or a specific plottable.

Axis and Ticks

Axes can be customized different ways. Axis labels and colors are the most common types of customizations.

Visibility of primary X and Y grids can be set using a single method.

Grid line visibility can be controlled for each axis individually. Use this to selectively enable grid lines only for the axes of interest. Keep in mind that vertical grid lines are controlled by horizontal axes.

Common grid line configurations are available.

Ticks can be hidden on a single axis.

Horizontal tick labels can be rotated as desired.

Vertical tick labels can be rotated as desired.

This example shows how to display DateTime data on the horizontal axis. Use DateTime.ToOADate() to convert DateTime[] to double[], plot the data, then tell the axis to format tick labels as dates.

Advanced Axis Features

Grid lines can be extensively customized using various configuration methods.

Tick labels can be converted to text using a custom format string.

Tick positions and labels can be defined manually.

Plot data on regular cartesian space then manually control axis labels to give the appearance of non-linear spacing between points.

ScottPlot will always display data where X values ascend from left to right. To simulate an inverted axis (where numbers decrease from left to right) plot data in the negative space, then invert the sign of tick labels.

The space between tick marks can be manually defined by setting the grid spacing.

Large numbers and dates are formatted differently for different cultures. Hungarian uses spaces to separate large numbers and periods to separate fields in dates.

SetCulture() as arguments to let the user manually define formatting strings which will be used globally to change how numbers and dates are formatted.

Multiplier notation keeps tick labels small when plotting large data values.

Offset notation keeps tick labels small when plotting large data values that are close together.

This example shows how to use a fixed inter-tick distance for a DateTime axis

ScottPlot will only display data on a linear 2D plane, however you can log-transform data before plotting it to give the appearance of log scales. Customizing tick options for log-spaced minor ticks further improves appearance of these graphs.

Ruler mode is an alternative way to display axis ticks. It draws long ticks and offsets the tick labels to give the appearance of a ruler.

A helper function converts radius and theta arrays into Cartesian coordinates suitable for plotting with traditioanl plot types.

Images can be used as axis labels to allow for things like LaTeX axis labels.

Transparency in PNGs is respected, but JPEG files do not support transparency.

Axis tick density can be adjusted by the user. The largest the density is, the more ticks are displayed. Setting this value too high will result in overlapping tick labels.

Minimum tick spacing can be defined such that zooming in does not produce more grid lines, ticks, and tick labels beyond the defined limit.

Multi-Axis

Plots always have 4 fundamental axes available to work with. Primary axes (XAxis and YAxis) are axis index 0. Secondary axes (XAxis2 and YAxis2) are axis index 1.By default primary axes are totally visible, and secondary axes have ticks hidden and no label. Sometimes the top axis (XAxis2) is given a label to simulate a plot title.

Additional axes can be added on any edge. Additional axes stack away from the plot area.

This example demonstrates how to display a Y axis on the right side of the figure. The vertical axis to the right of the figure is index 1, so plots must be updated to indicate they are to use a nonstandard axis index.

This example demonstrates how to display an X axis above the figure. The horizontal axis above the figure is index 1, so plots must be updated to indicate they are to use a nonstandard axis index.

Visibility of axes can be toggled. In this example an additional Y axis is added but the primary Y axis is hidden. The result is a plot that appears to only have one Y axis.

Statistics

The Histogram class makes it easy to get binned population information.

Binned probability can be displayed instead of raw counts. The probability density is also available for every bin.

This example demonstrates two histograms on the same plot. Note the use of fractional units on the vertical axis, allowing easy comparison of datasets with different numbers of points. Unlike the previous example, this one does not use multiple axes.

This example demonstrates how to plot a cumulative probability histogram (CPH) to compare the distribution of two datasets.

A regression module is available to simplify the act of creating a linear regression line fitted to the data.

The Nth order statistic of a set is the Nth smallest value of the set (indexed from 1).

Percentiles are a good tool to analyze the distribution of your data and filter out extreme values.

A q-Quantile is a generalization of quartiles and percentiles to any number of buckets.

Plottable: Annotation

Annotations are labels placed at a X/Y location on the figure (not coordinates of the data area). Unlike the Text plottable, annotations do not move as the axes are adjusted.

Plottable: Arrow

Arrows point to specific locations on the plot. Arrows are actually just scatter plots with two points and an arrowhead.

Plottable: Axis Line and Span

An axis line marks a position on an axis. Axis lines extend to positive and negative infinity on the other axis.

In GUI environments, axis lines can be draggable and moved with the mouse. Drag limits define the boundaries the lines can be dragged.

Axis spans shade a portion of one axis. Axis spans extend to negative and positive infinity on the other axis.

Axis spans can be dragged using the mouse. Drag limits are boundaries over which the edges of spans cannot cross.

Plottable: Bar Graph

A simple bar graph can be created from a series of values. By default values are palced at X positions 0, 1, 2, etc.

Horizontal positions for each bar can be defined manually. If you define bar positions, you will probably want to define the bar width as well.

Bars placed at specific positions can be labeled by setting tick labels for those positions.

Errorbars can be added to any bar graph.

Bars can be overlapped to give the appearance of stacking.

The value of each bar can be displayed above it.

Bar graph fill pattern can be customized.

Bar graphs are typically displayed as columns, but it's possible to show bars as rows.

By customizing positions of multiple bar plots you can achieve the appearance of grouped bar graphs. The AddBarGroups() method is designed to simplify this process. More advanced grouping and bar plot styling is possible using the Population plot type.

By default bar graphs start at 0, but this does not have to be the case. Y offsets can be defined for each bar. When Y offsets are used, values represent the height of the bars (relative to their offsets).

Bars with negative values can be colored differently than positive ones.

Waterfall bar graphs use bars to represent changes in value from the previous level. This style graph can be created by offseting each bar by the sum of all bars preceeding it. This effect is similar to financial plots (OHLC and Candlestick) which are described in another section.

Lollipop plots convey the same information as Bar plots but have a different appearance.

Lollipop plots can be extensively customized.

Cleveland Dot Plots allow comparing two categories in situations where a Bar Plot may be crowded.

Bars have a default width of 1.0, but when using DateTime axis this means bars are one day wide. To plot DateTime data you may need to manually set the width of a bar to a desired size (in fractions of a day).

Plottable: Bubble

Bubble plots display circles at specific X/Y locations. Each circle can be individually customized. Save the object that is returned when the bubble plot is created and call its Add() method to add bubbles.

Bubble plots can be combined with other plot types to create more advanced charts. In this example each bubble is accompanied by a text object. Bubbles are also colored according to their size such that smaller bubbles are bluer.

Plottable: Colorbar

A colorbar displays a colormap beside the data area. Colorbars are typically added to plots containing heatmaps.

By default colorbars use the Viridis colormap, but this behavior can be customized and many colormaps are available.

Tick marks can be added to colorbars. Each tick is described by a position (a fraction of the distance from the bottom to the top) and a string (the tick label).

Plottable: Fill

Fill methods help to create semitransparent polygons to fill the area under a curve. This can be used to give the appearance of shading under a scatter plot, even though the plottable created here is a polygon with optional edge color and fill color.

Sometimes you want to share the area under a curve, but change its color depending on which side of the baseline value it is. There's a helper method to make this easier.

Given two curves, a polygon can be created to give the appearance of shading between them. Here we will display two scatter plots, then create a polygon to fill the region between them.

Plottable: Finance

ScottPlot can draw some financial indicators on plots in X/Y space, but users looking to develop robust financial charts should probably look at other libraries designed specifically for financial charting. The biggest limitations are (1) lack of mouse interaction and (2) the horizontal axis is strictly numeric Cartesian space and is not ideal for plotting dates. That said, some financial charting is possible with ScottPlot, and this cookbook demonstrates common use cases.

OHLC charts are an alternative to candlestick charts. They show high and low prices as a vertical line, and indicate open and close prices with little ticks to the left and to the right.

You probably never want to do this... but OHLCs have an X value you can customize to be a DateTime (converted to a double using DateTime.ToOATime()). The advantage is that you can use the native DateTime axis support on the horizontal axis. The disadvantage is that gaps in time appear as gaps in the candlesticks. Weekends without trading will appear as gaps. The alternative to this method is to plot a series of OHLCs using sequential numbers, then manually define the axis tick labels.

A better way to represent time on the horizontal axis is to use traditional Cartesian coordinates so each candlestick is placed at X positions (0, 1, 2, etc.), then manually define the locations and label text of important positions on the plot. This is clunky, but possible. This inelegance is why financial charting is probably best done with real financial charting libraries, not a scientific charting library like ScottPlot...

A simple moving average (SMA) technical indicator can be calculated and drawn as a scatter plot.

Bollinger bands are a common technical indicator that show the average +/- two times the standard deviation of a given time range preceeding it.

Newer data appears on the ride side of the chart so financial charts are often displayed with the vertical axis label on the right side as well. This is possible by disabling the left vertical axis (YAxis) and enabling the right one (YAxis2). The left and right Y axes are index 0 and 1 (respectively), and the plottable has to be update to indicate which axis index it should render on.

By default candle wicks are the same color as their bodies, but this can be customized.

Candles that close below their open price are colored differently from candles which close at or above it. These colors can be customized. Combine this styling with a custom wick color (which also controls the candle border) to create a different visual style.

A dark mode finance plot can be realized by customizing color options of the candles and figure. Colors in this example were chosen to mimic TC2000.

Plottable: Function

Function plots are defined by a function (not X/Y data points) so the curve is continuous and can be zoomed in and out infinitely

Plottable: Heatmap

Heatmaps display a 2D array using a colormap.

Colorbars are often added when heatmaps are used.

Image data can be plotted using the heatmap plot type.

This example demonstrates a heatmap with 1000 tiles

Viridis is the default colormap, but several alternatives are available.

Heatmap colormap scale can use a defined min/max value.

Heatmaps can be created from random 2D data points using the count within a square of fixed size.

Heatmaps can be created from 2D data points using bilinear interpolation with Gaussian weighting. This option results in a heatmap with a standard deviation of 4.

CoordinatedHeatmap is type of Heatmap stretched to fit user-defined boundaries in coordinate space. This plot type displays two-dimensional intensities on a rectangular surface according to a colormap.

You can use a 2D array of nullable doubles to indicate some squares do not contain data. This allows the user to display heatmaps with transparency and implement non-rectangular heatmaps.

Plottable: Image

The Image plottable places a Bitmap at a location in X/Y space.The image's position will move in space as the axes move, but the size of the bitmap will always be the same (matched to the display resolution).

By default the X/Y coordinates define the upper left position of the image, but alignment can be customized.

Images can be rotated, but rotation is always relative to the upper left corner.

The borders of images can be customized.

Plottable: Pie

A pie chart illustrates numerical proportions as slices of a circle.

Exploded pie charts have a bit of space between their slices.

Donut plots are pie charts with a hollow center.

Custom text can be displayed in the center of a donut chart. Notice too how the colors of each slice are customized in this example.

The value of each slice can be displayed at its center.

The percentage of each slice can be displayed at its center.

Colors for pie slices and labels can be customized.

Slices can be labeled in the legend.

Slices can labeled with values, percentages, and lables, with a legend.

Custom slice labels can be used to display values using custom formats

Plottable: Point

You can add a single point to the plot. A point is really a scatter plot with a single X/Y coordinate.

Plottable: Polygon

Polygons are 2D shapes made from pairs of X/Y points. The last point connects back to the first point, forming a closed shape. Polygons can be optionally outlined and optionally filled. Colors with semitransparency are especially useful for polygons.

Polygons can be used to create 2D shapes resembling filled line plots. When mixed with semitransprent fills, these can be useful for displaying data.

A stacked filled line plot effect can be achieved by overlapping polygons.

Special rendering optimizations are available to display a large number of polygons.

Plottable: Population

The population plot makes it easy to display populations as bar graphs, box-and-whisker plots, scattered values, or box plots and data points side-by-side. The population plot is different than using a box plot with an error bar in that you pass your original data into the population plot and it determines the standard deviation, standard error, quartiles, mean, median, outliers, etc., and you get to determine how to display these values.

Multiple populations can be assembled into an array and plotted as a single group.

Multiple series of population groups can be plotted Here each group is clustered on the horizontal axis, and each series is given a different color and appears in the legend.

Populations can be displayed many different ways. Scatter values can be displayed on either side of the bar or bar. Populations can be shown as bar graphs instead of box plots. Public fields allow many additional customizations.

Plottable: Radar

A radar chart concisely displays multiple values. Radar plots are also called a spider charts or star charts.

Change the axis type to polygon to display radar charts with straight lines.

A radar chart can have no drawn axis as well.

Category labels can be displayed on the radar chart.

Labels can be displayed on the arms of the radar chart.

Axis scaling can be independent, allowing values for each category to be displayed using a different scale. When independent axis mode is enabled, axis limits are automatically adjusted to fit the range of the data.

Radar charts with independent axis limits use scales fitted to the data by default, but scaling can be controlled by defining the maximum value for each axis.

Plottable: Scale Bar

An L-shaped scalebar can be added in the corner of any plot. Set the vertical or horizontal sizer to zero and the scale bar will only span one dimension.

Set the vertical or horizontal sizer to zero and the scale bar will only span one dimension.

Plottable: Scatter Plot

Scatter plots are best for small numbers of paired X/Y data points. For evenly-spaced data points Signal is much faster.

Markers can be customized using optional arguments and public fields.

Legend indicates names of all available marker shapes

Line color, size, and style can be customized. Setting markerSize to 0 prevents markers from being rendered.

X data for scatter plots does not have to be evenly spaced, making scatter plots are ideal for displaying random data like this.

An array of values can be supplied for error bars and redering options can be customized as desired

A shortcut method makes it easy to create a scatter plot with just lines (no markers)

A shortcut method makes it easy to create a scatter plot where markers are displayed at every point (without any connecting lines)

A step plot is a special type of scatter plot where points are connected by right angles instead of straight lines.

Plottable: Signal Plot

Signal plots are ideal for evenly-spaced data with thousands or millions of points.

Signal plots can have X and Y offsets that shift all data by a defined amount.

Compare the speed to the same data plotted as a scatter plot.

Signal plots can be styled using public fields. Signal plots can also be offset by a defined X or Y amount.

Signal plots with millions of points can be interacted with in real time.

When plotting extremely high density data, you can't always see the trends underneath all those overlapping data points. If you send an array of colors to PlotSignal(), it will use those colors to display density.

When plotting live data it is useful to allocate a large array in memory then fill it with values as they come in. By setting the maxRenderIndex property of a scatter plot to can prevent rendering the end of the array (which is probably filled with zeros).

It is sometimes useful to only display values within a range of the source data array.

Signal plots can be filled below with a solid color.

Signal plots can be filled below using a color gradient.

Signal plots can be filled above using a color gradient.

Signal plots can be filled above and below

Gradients can be used to fill above and below.

Plottable: SignalConst

SignalConst plots pre-processes data to render much faster than Signal plots. Pre-processing takes a little time up-front and requires 4x the memory of Signal.

Plottable: SignalXY

SignalXY is a speed-optimized plot for displaying vaues (Ys) with unevenly-spaced positions (Xs) that are in ascending order. If your data is evenly-spaced, Signal and SignalConst is faster.

SignalXY plots can have X and Y offsets that shift all data by a defined amount.

Signal with defined Xs that contain gaps

Signal with mised low and high density data

Plottable: SignalXYConst

SignalXYConst is a speed-optimized plot for displaying vaues (Ys) with unevenly-spaced positions (Xs) that are in ascending order. If your data is evenly-spaced, Signal and SignalConst is faster.

SignalXYConst with (int)Xs and (float)Ys arrays

Plottable: Text

The Text plottable displays a string at an X/Y coordinate in unit space. Unlike the Annotation plottable, text moves when the axes are adjusted.

Advanced options are available to customize rotation and alignment. Note that if rotation is used, alignment is ignored.

You can pass in a Font to further customize font options

Plottable: Tooltip

Tooltips are annotations that point to an X/Y coordinate on the plot

Tooltips fonts can be customized

Tooltips border and fill styles can be customized

Plottable: Vector Field

A vector field can be useful to show data explained by differential equations

This example demonstrates how to define vectors according to a given angle and magnitude.

A colormap can be supplied to color arrows according to their magnitude

A custom scale factor can adjust the length of the arrows.

Misc

Interpolated splines create curves with many X/Y points to smoothly connect a limited number of input points.

The raw trace (voltage) and first derivative (voltage change / time) of a mammalian action potential.

Style

Customize many plot features using style presets

Customize many plot features using style presets

Customize many plot features using style presets

Customize many plot features using style presets

Customize many plot features using style presets

Customize many plot features using style presets

Customize many plot features using style presets

Customize many plot features using style presets

Customize many plot features using style presets

Customize many plot features using style presets

Customize many plot features using style presets

The Plot Module

The Plot module is the primary way to interct with ScottPlot. It has helper methods to make it easy to create and add Plottable objects. Use the Render() method to render the plot as an image.

Properties

XAxis - Axis on the bottom edge of the plot

XAxis2 - Axis on the top edge of the plot

YAxis - Axis on the left edge of the plot

YAxis2 - Axis on the right edge of the plot

Version - ScottPlot version in the format "1.2.3" (or "1.2.3-beta" for pre-releases)

Methods

AxisAuto() - Automatically adjust axis limits to fit the data

AxisAutoX() - Automatically adjust axis limits to fit the data

AxisAutoY() - Automatically adjust axis limits to fit the data (with a little extra margin)

AxisPan() - Pan the primary X and Y axis without affecting zoom

AxisScale() - Adjust axis limits to achieve a certain pixel scale (units per pixel)

AxisScaleLock() - Lock X and Y axis scales (units per pixel) together to protect symmetry of circles and squares

AxisZoom() - Zoom in or out. The amount of zoom is defined as a fraction of the current axis span.

Benchmark() - If enabled, the benchmark displays render information in the corner of the plot.

Clear() - Clear all plottables

Clear() - Remove all plottables of the given type

Copy() - Return a new Plot with all the same Plottables (and some of the styles) of this one.

Equals() - Returns true if the given plot is the exact same plot as this one

Frame() - Configure color and visibility of the frame that outlines the data area. Note that the axis lines of all 4 primary axes touch each other, giving the appearance of a rectangle framing the data area. This method allows the user to customize these lines as a group or individually.

Frameless() - Give the plot a frameless appearance by setting the size of all axes to zero. This causes the data area to go right up to the edge of the plot.

GetAxisLimits() - Returns the current limits for a given pair of axes.

GetCoordinate() - Return the coordinate (in coordinate space) for the given pixel

GetCoordinateX() - Return the X position (in coordinate space) for the given pixel column

GetCoordinateY() - Return the Y position (in coordinate space) for the given pixel row

GetGuid() - Every plot has a globally unique ID (GUID) that can help differentiate it from other plots

GetHashCode() - Returns an integer unique to this instance (based on the GUID)

GetNextColor() - Return a new color from the Pallette based on the number of plottables already in the plot. Use this to ensure every plottable gets a unique color.

GetPixel() - Return the pixel for the given point in coordinate space

GetPixelX() - Return the horizontal pixel location given position in coordinate space

GetPixelY() - Return the vertical pixel location given position in coordinate space

GetPlottables() - Return a copy of the list of plottables

GetSettings() - The Settings module stores manages plot state and advanced configuration. Its class structure changes frequently, and users are highly advised not to interact with it directly. This method returns the settings module for advanced users and developers to interact with.

Grid() - Customize basic options for the primary X and Y axes. Call XAxis.Grid() and YAxis.Grid() to further customize grid settings.

Layout() - Set padding around the data area by defining the minimum size and padding for all axes

Legend() - Configure legend visibility and location. Optionally you can further customize the legend by interacting with the object it returns.

MatchLayout() - Adjust this axis layout based on the layout of a source plot

Palette() - The palette defines the default colors given to plottables when they are added

Remove() - Remove a specific plottable

Render() - Render the plot onto an existing bitmap

Render() - Render the plot onto a new Bitmap (using the size given when the plot was created or resized)

Render() - Render the plot onto a new Bitmap of the given dimensions

RenderLegend() - Return a new Bitmap containing only the legend

RenderLock() - Wait for the current render to finish, then prevent future renders until RenderUnlock() is called. Locking rendering is required if you intend to modify plottables while rendering is occurring in another thread.

RenderUnlock() - Release the render lock, allowing renders to proceed.

Resize() - Update the default size for new renders

SaveFig() - Save the plot as an image

SetAxisLimits() - Set limits for the a given pair of axes

SetAxisLimits() - Set limits for a pair of axes

SetAxisLimitsX() - Set limits for the primary X axis

SetAxisLimitsY() - Set limits for the primary Y axis

SetCulture() - Set the culture to use for number-to-string converstion for tick labels of all axes.

SetCulture() - Set the culture to use for number-to-string converstion for tick labels of all axes. This overload allows you to manually define every format string, allowing extensive customization of number and date formatting.

SetViewLimits() - Set limits of the view for the primary axes. View limits define the boundaries of axis limits. You cannot zoom, pan, or set axis limits beyond view limits.

Style() - Set colors of all plot components using pre-defined styles

Style() - Set the color of specific plot components

Title() - Set the label for the horizontal axis above the plot (XAxis2)

Validate() - Throw an exception if any plottable contains an invalid state.

XLabel() - Set the label for the vertical axis to the right of the plot (XAxis)

XTicks() - Manually define X axis tick labels using consecutive integer positions (0, 1, 2, etc.)

XTicks() - Manually define X axis tick positions and labels

YLabel() - Set the label for the vertical axis to the right of the plot (YAxis2)

YTicks() - Manually define Y axis tick labels using consecutive integer positions (0, 1, 2, etc.)

YTicks() - Manually define Y axis tick positions and labels

Methods for Creating Plottables

Add() - Add a plottable to the plot

AddAnnotation() - Display text in the data area at a pixel location (not a X/Y coordinates)

AddArrow() - Display an arrow pointing to a spot in coordinate space

AddAxis() - Create and return an additional axis

AddBar() - Add a bar plot for the given values. Bars will be placed at X positions 0, 1, 2, etc.

AddBar() - Add a bar plot for the given values using defined bar positions

AddBar() - Add a bar plot (values +/- errors) using defined positions

AddBarGroups() - Create a series of bar plots and customize the ticks and legend

AddBubblePlot() - Add an empty bubble plot. Call it's Add() method to add bubbles with custom position and styling.

AddBubblePlot() - Add a bubble plot with multiple bubbles at the given positions all styled the same. Call the Add() method to add bubbles manually, allowing further customization of size and style.

AddCandlesticks() - Add candlesticks to the chart from OHLC (open, high, low, close) data

AddClevelandDot() - Add a Cleveland Dot plot for the given values. Cleveland Dots will be placed at X positions 0, 1, 2, etc.

AddClevelandDot() - Add a Cleveland Dot plot for the given values using defined dot positions.

AddColorbar() - Add a colorbar to display a colormap beside the data area

AddColorbar() - Add a colorbar initialized with settings from a heatmap

AddFill() - Create a polygon to fill the area between Y values and a baseline.

AddFill() - Create a polygon to fill the area between Y values of two curves.

AddFillAboveAndBelow() - Create a polygon to fill the area between Y values and a baseline that uses two different colors for area above and area below the baseline.

AddFunction() - Add a line plot that uses a function (rather than X/Y points) to place the curve

AddHeatmap() - Add a heatmap to the plot automatically-sized so each cell is 1x1.

AddHeatmap() - Add a heatmap to the plot automatically-sized so each cell is 1x1.

AddHeatmapCoordinated() - Add heatmap to the plot stretched to fit the given dimensions. Unlike the regular heatmap which gives each cell a size of 1x1 and starts at the axis origin, this heatmap stretches the array so that it covers the defined X and Y spans.

AddHeatmapCoordinated() - Add heatmap to the plot stretched to fit the given dimensions. Unlike the regular heatmap which gives each cell a size of 1x1 and starts at the axis origin, this heatmap stretches the array so that it covers the defined X and Y spans.

AddHorizontalLine() - Add a horizontal axis line at a specific Y position

AddHorizontalSpan() - Add a horizontal span (shades the region between two X positions)

AddImage() - Display an image at a specific coordinate

AddLine() - Add a line (a scatter plot with two points) to the plot

AddLine() - Add a line (a scatter plot with two points) to the plot

AddLollipop() - Add a Lollipop plot for the given values. Lollipops will be placed at X positions 0, 1, 2, etc.

AddLollipop() - Add a lollipop plot for the given values using defined lollipop positions

AddOHLCs() - Add OHLC (open, high, low, close) data to the plot

AddPie() - Add a pie chart to the plot

AddPoint() - Add a point (a scatter plot with a single marker)

AddPolygon() - Add a polygon to the plot

AddPolygons() - Add many polygons using an optimized rendering method

AddPopulation() - Add a population to the plot

AddPopulations() - Add multiple populations to the plot as a single series

AddPopulations() - Add multiple populations to the plot as a single series

AddRadar() - Add a radar plot

AddScaleBar() - Add an L-shaped scalebar to the corner of the plot

AddScatter() - Add a scatter plot from X/Y pairs. Lines and markers are shown by default. Scatter plots are slower than Signal plots.

AddScatterLines() - Add a scatter plot from X/Y pairs connected by lines (no markers). Scatter plots are slower than Signal plots.

AddScatterList() - Scatter plot with Add() and Clear() methods for updating data

AddScatterPoints() - Add a scatter plot from X/Y pairs using markers at points (no lines). Scatter plots are slower than Signal plots.

AddScatterStep() - Add a step plot is a type of line plot where points are connected with right angles instead of straight lines.

AddSignal() - Signal plots have evenly-spaced X points and render very fast.

AddSignalConst() - SignalConts plots have evenly-spaced X points and render faster than Signal plots but data in source arrays cannot be changed after it is loaded. Methods can be used to update all or portions of the data.

AddSignalXY() - Speed-optimized plot for Ys with unevenly-spaced ascending Xs

AddSignalXYConst() - Speed-optimized plot for Ys with unevenly-spaced ascending Xs. Faster than SignalXY but values cannot be modified after loading.

AddText() - Display text at specific X/Y coordinates

AddText() - Display text at specific X/Y coordinates

AddTooltip() - Display a text bubble that points to an X/Y location on the plot

AddVectorField() - Add a 2D vector field to the plot

AddVerticalLine() - Add a vertical axis line at a specific Y position

AddVerticalSpan() - Add a horizontal span (shades the region between two X positions)

Plottable Types

Annotation - Text placed at a location relative to the data area that does not move when the axis limits change

HLine - Horizontal line at a Y position

VLine - Vertical line at an X position

HSpan - Shaded horizontal region between two X values

VSpan - Shade the region between two Y values

BarPlot - Bar plots display a series of bars. Positions are defined by Xs. Heights are defined by Ys (relative to BaseValue and YOffsets).

BubblePlot - Display circles of user-defined sizes and colors at specific X/Y positions

ClevelandDotPlot - Cleveland Dot plots display a series of paired p[oints. Positions are defined by Xs. Heights are defined by Ys1 and Ys2 (internally done with Ys and YOffsets).

Colorbar - A colorbar translates numeric intensity values to colors. The Colorbar plot type displays a Colorbar along an edge of the plot.

CoordinatedHeatmap - This variation of the Heatmap renders intensity data as a rectangle sized to fit user-defined axis limits

FinancePlot - Finance plots display open/high/low/close (OHLC) data

FunctionPlot - A function plot displays a curve using a function (Y as a function of X)

Heatmap - A heatmap displays a 2D array of intensities as small rectangles on the plot colored according to their intensity value according to a colormap.

Image - Display a Bitmap at X/Y coordinates in unit space

LollipopPlot - Lollipop plots display a series of "Lollipops" in place of bars. Positions are defined by Xs. Heights are defined by Ys (relative to BaseValue and YOffsets).

PiePlot - A pie plot displays a collection of values as a circle. Pie plots with a hollow center are donut plots.

Polygon - A polygon is a collection of X/Y points that are all connected to form a closed shape. Polygons can be optionally filled with a color or a gradient.

Polygons - Polygons are multiple Polygon objects. This plot type is faster alternative for rendering a large number of polygons compared to adding a bunch of individual Polygon objects to the plot.

PopulationPlot - Population plots are designed to show collections of data. A Population is a 1D array of values, and statistics are calculated automatically. Populations can be displayed as bar plots, box plots, or scatter plots. Public methods, fields, and properties allow extensive customization. This plottable supports higher-order grouping (groups of groups).

RadarPlot - A radar chart is a graphical method of displaying multivariate data in the form of a two-dimensional chart of three or more quantitative variables represented on axes starting from the same point.

ScaleBar - An L-shaped scalebar rendered in the corner of the data area

ScatterPlot - The scatter plot renders X/Y pairs as points and/or connected lines. Scatter plots can be extremely slow for large datasets, so use Signal plots in these situations.

ScatterPlotList - A collection of X/Y coordinates that can be displayed as markers and/or connected lines. Unlike the regular ScatterPlot, this plot type has Add() methods to easily add data.

SignalPlot - A signal plot displays evenly-spaced data. Instead of X/Y pairs, signal plots take Y values and a sample rate. Optional X and Y offsets can further customize the data.

SignalPlotConst - This plot type is a potentially faster version of the SignalPlot. It pre-calculates min/max values for various segments of data, greatly speeding-up rendering for extremely large datasets (10s of millions of points). Note that these pre-calculations require more memory and an up-front calculation delay. If the underlying data is updated, you must call Update() methods to recalculate the min/max values.

SignalPlotXY - A variation of the SignalPlot optimized for unevenly-spaced ascending X values.

SignalPlotXYConst - A variation of the SignalPlotConst optimized for unevenly-spaced ascending X values.

SignalPlotXYGeneric - A variation of the SignalPlotConst optimized for unevenly-spaced ascending X values.

Text - Display a text label at an X/Y position in coordinate space

Tooltip - A tooltip displays a text bubble pointing to a specific location in X/Y space. The position of the bubble moves according to the axis limits to best display the text in the data area.

VectorField - The VectorField displays arrows representing a 2D array of 2D vectors

Source code last modified on May 2nd, 2021 (edit on GitHub)
---
title: ScottPlot 4.1.13-beta Cookbook
description: Code examples and API documentation for ScottPlot 4.1.13-beta
date: 2021-05-02 16:14:22Z
---

<div class='display-5 my-3'><a href='./' style='color: black;'>ScottPlot 4.1.13-beta Cookbook</a></div>

<div class='alert bg-light border my-4' role='alert'><strong>⚠️ This cookbook page is specific to ScottPlot version 4.1.13-beta</strong>. The API of different versions may vary, and newer versions of ScottPlot may be available. Refer to the <a href='https://swharden.com/scottplot/cookbook'><strong>ScottPlot Cookbook Home Page</strong></a> for the latest documentation. </div>

## API Reference

* [Plot API](#the-plot-module)

* [Methods for Creating Plottables](#methods-for-creating-plottables)

* [Plottable Types](#plottable-types)

## Cookbook Recipes

<strong>Concepts:</strong> <a href='#quickstart'>Quickstart</a>, <a href='#axis-and-ticks'>Axis and Ticks</a>, <a href='#advanced-axis-features'>Advanced Axis Features</a>, <a href='#multi-axis'>Multi-Axis</a>, <a href='#statistics'>Statistics</a>, <a href='#misc'>Misc</a>, <a href='#style'>Style</a>

<strong>Plottables:</strong> <a href='#plottable-annotation'> Annotation</a>, <a href='#plottable-arrow'> Arrow</a>, <a href='#plottable-axis-line-and-span'> Axis Line and Span</a>, <a href='#plottable-bar-graph'> Bar Graph</a>, <a href='#plottable-bubble'> Bubble</a>, <a href='#plottable-colorbar'> Colorbar</a>, <a href='#plottable-fill'> Fill</a>, <a href='#plottable-finance'> Finance</a>, <a href='#plottable-function'> Function</a>, <a href='#plottable-heatmap'> Heatmap</a>, <a href='#plottable-image'> Image</a>, <a href='#plottable-pie'> Pie</a>, <a href='#plottable-point'> Point</a>, <a href='#plottable-polygon'> Polygon</a>, <a href='#plottable-population'> Population</a>, <a href='#plottable-radar'> Radar</a>, <a href='#plottable-scale-bar'> Scale Bar</a>, <a href='#plottable-scatter-plot'> Scatter Plot</a>, <a href='#plottable-signal-plot'> Signal Plot</a>, <a href='#plottable-signalconst'> SignalConst</a>, <a href='#plottable-signalxy'> SignalXY</a>, <a href='#plottable-signalxyconst'> SignalXYConst</a>, <a href='#plottable-text'> Text</a>, <a href='#plottable-tooltip'> Tooltip</a>, <a href='#plottable-vector-field'> Vector Field</a>

<hr class='my-4 invisible'>

## Quickstart

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/quickstart/#scatter-plot'>Scatter Plot</a></strong></div><div class='card-body'><p class='card-text'>Scatter plots have paired X/Y points.</p><div class='text-center'><a href='category/quickstart/#scatter-plot'><img src='images/quickstart_scatter_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/quickstart/#signal-plot'>Signal Plot</a></strong></div><div class='card-body'><p class='card-text'>Signal plots have evenly spaced Y points. Signal plots are very fast and can interactively display millions of data points. There are many different types of plottable objects, each serving a different purpose.</p><div class='text-center'><a href='category/quickstart/#signal-plot'><img src='images/quickstart_signal_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/quickstart/#axis-labels-and-limits'>Axis Labels and Limits</a></strong></div><div class='card-body'><p class='card-text'>Axis labels and limits can be customized</p><div class='text-center'><a href='category/quickstart/#axis-labels-and-limits'><img src='images/quickstart_axis_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/quickstart/#manually-add-a-plottable'>Manually Add a Plottable</a></strong></div><div class='card-body'><p class='card-text'>You can create a plot manually, then add it to the plot with Add(). This allows you to create custom plot types and add them to the plot.</p><div class='text-center'><a href='category/quickstart/#manually-add-a-plottable'><img src='images/quickstart_add_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/quickstart/#clear-plottables'>Clear plottables</a></strong></div><div class='card-body'><p class='card-text'>Call Clear() to remove all plottables from the plot. Overloads of Clear() allow you to remote one type of plottable, or a specific plottable.</p><div class='text-center'><a href='category/quickstart/#clear-plottables'><img src='images/quickstart_clear_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Axis and Ticks

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/axis-and-ticks/#axis-customizations'>Axis Customizations</a></strong></div><div class='card-body'><p class='card-text'>Axes can be customized different ways. Axis labels and colors are the most common types of customizations.</p><div class='text-center'><a href='category/axis-and-ticks/#axis-customizations'><img src='images/axis_label_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/axis-and-ticks/#disable-grid'>Disable Grid</a></strong></div><div class='card-body'><p class='card-text'>Visibility of primary X and Y grids can be set using a single method.</p><div class='text-center'><a href='category/axis-and-ticks/#disable-grid'><img src='images/axis_griddisableall_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/axis-and-ticks/#disable-vertical-grid'>Disable Vertical Grid</a></strong></div><div class='card-body'><p class='card-text'>Grid line visibility can be controlled for each axis individually. Use this to selectively enable grid lines only for the axes of interest. Keep in mind that vertical grid lines are controlled by horizontal axes.</p><div class='text-center'><a href='category/axis-and-ticks/#disable-vertical-grid'><img src='images/axis_griddisableone_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/axis-and-ticks/#grid-style'>Grid Style</a></strong></div><div class='card-body'><p class='card-text'>Common grid line configurations are available.</p><div class='text-center'><a href='category/axis-and-ticks/#grid-style'><img src='images/asis_gridconfigure_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/axis-and-ticks/#disable-x-ticks'>Disable X Ticks</a></strong></div><div class='card-body'><p class='card-text'>Ticks can be hidden on a single axis.</p><div class='text-center'><a href='category/axis-and-ticks/#disable-x-ticks'><img src='images/ticks_hidex_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/axis-and-ticks/#rotated-x-ticks'>Rotated X Ticks</a></strong></div><div class='card-body'><p class='card-text'>Horizontal tick labels can be rotated as desired.</p><div class='text-center'><a href='category/axis-and-ticks/#rotated-x-ticks'><img src='images/ticks_rotated_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/axis-and-ticks/#rotated-y-ticks'>Rotated Y Ticks</a></strong></div><div class='card-body'><p class='card-text'>Vertical tick labels can be rotated as desired.</p><div class='text-center'><a href='category/axis-and-ticks/#rotated-y-ticks'><img src='images/ticks_rotatedy_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/axis-and-ticks/#plotting-datetime-data'>Plotting DateTime Data</a></strong></div><div class='card-body'><p class='card-text'>This example shows how to display DateTime data on the horizontal axis. Use DateTime.ToOADate() to convert DateTime[] to double[], plot the data,  then tell the axis to format tick labels as dates.</p><div class='text-center'><a href='category/axis-and-ticks/#plotting-datetime-data'><img src='images/ticks_datetime_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Advanced Axis Features

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#advanced-grid-customization'>Advanced Grid Customization</a></strong></div><div class='card-body'><p class='card-text'>Grid lines can be extensively customized using various configuration methods.</p><div class='text-center'><a href='category/advanced-axis-features/#advanced-grid-customization'><img src='images/asis_gridadvanced_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#numeric-format-string'>Numeric Format String</a></strong></div><div class='card-body'><p class='card-text'>Tick labels can be converted to text using a custom format string.</p><div class='text-center'><a href='category/advanced-axis-features/#numeric-format-string'><img src='images/ticks_numericformatstring_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#manual-tick-labels'>Manual Tick Labels</a></strong></div><div class='card-body'><p class='card-text'>Tick positions and labels can be defined manually.</p><div class='text-center'><a href='category/advanced-axis-features/#manual-tick-labels'><img src='images/ticks_defined_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#nonlinear-tick-spacing'>NonLinear Tick Spacing</a></strong></div><div class='card-body'><p class='card-text'>Plot data on regular cartesian space then manually control axis labels to give the appearance of non-linear spacing between points.</p><div class='text-center'><a href='category/advanced-axis-features/#nonlinear-tick-spacing'><img src='images/ticks_nonlinearx_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#descending-ticks'>Descending Ticks</a></strong></div><div class='card-body'><p class='card-text'>ScottPlot will always display data where X values ascend from left to right. To simulate an inverted axis (where numbers decrease from left to right) plot data in the negative space, then invert the sign of tick labels.</p><div class='text-center'><a href='category/advanced-axis-features/#descending-ticks'><img src='images/ticks_descending_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#defined-tick-spacing'>Defined Tick Spacing</a></strong></div><div class='card-body'><p class='card-text'>The space between tick marks can be manually defined by setting the grid spacing.</p><div class='text-center'><a href='category/advanced-axis-features/#defined-tick-spacing'><img src='images/ticks_definedspacing_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#tick-label-culture'>Tick Label Culture</a></strong></div><div class='card-body'><p class='card-text'>Large numbers and dates are formatted differently for different cultures. Hungarian uses spaces to separate large numbers and periods to separate fields in dates.</p><div class='text-center'><a href='category/advanced-axis-features/#tick-label-culture'><img src='images/ticks_culture_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#custom-tick-label-culture'>Custom Tick Label Culture</a></strong></div><div class='card-body'><p class='card-text'>SetCulture() as arguments to let the user manually define formatting strings which will be used globally to change how numbers and dates are formatted.</p><div class='text-center'><a href='category/advanced-axis-features/#custom-tick-label-culture'><img src='images/ticks_culturecustom_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#multiplier-notation'>Multiplier Notation</a></strong></div><div class='card-body'><p class='card-text'>Multiplier notation keeps tick labels small when plotting large data values.</p><div class='text-center'><a href='category/advanced-axis-features/#multiplier-notation'><img src='images/ticks_multiplier_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#offset-notation'>Offset Notation</a></strong></div><div class='card-body'><p class='card-text'>Offset notation keeps tick labels small when plotting large data values that are close together.</p><div class='text-center'><a href='category/advanced-axis-features/#offset-notation'><img src='images/ticks_offset_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#defined-datetime-spacing'>Defined DateTime Spacing</a></strong></div><div class='card-body'><p class='card-text'>This example shows how to use a fixed inter-tick distance for a DateTime axis</p><div class='text-center'><a href='category/advanced-axis-features/#defined-datetime-spacing'><img src='images/ticks_defineddatetimespace_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#log-scale'>Log Scale</a></strong></div><div class='card-body'><p class='card-text'>ScottPlot will only display data on a linear 2D plane, however you can log-transform data before plotting it to give the appearance of log scales. Customizing tick options for log-spaced minor ticks further improves appearance of these graphs.</p><div class='text-center'><a href='category/advanced-axis-features/#log-scale'><img src='images/asis_log_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#ruler-mode'>Ruler mode</a></strong></div><div class='card-body'><p class='card-text'>Ruler mode is an alternative way to display axis ticks. It draws long ticks and offsets the tick labels to give the appearance of a ruler.</p><div class='text-center'><a href='category/advanced-axis-features/#ruler-mode'><img src='images/asis_ruler_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#polar-coordinates'>Polar Coordinates</a></strong></div><div class='card-body'><p class='card-text'>A helper function converts radius and theta arrays into Cartesian coordinates suitable for plotting with traditioanl plot types.</p><div class='text-center'><a href='category/advanced-axis-features/#polar-coordinates'><img src='images/asis_polar_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#images-as-axis-labels'>Images as Axis Labels</a></strong></div><div class='card-body'><p class='card-text'>Images can be used as axis labels to allow for things like LaTeX axis labels.</p><div class='text-center'><a href='category/advanced-axis-features/#images-as-axis-labels'><img src='images/asis_image_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#transparent-images-axis-labels'>Transparent Images Axis Labels</a></strong></div><div class='card-body'><p class='card-text'>Transparency in PNGs is respected, but JPEG files do not support transparency.</p><div class='text-center'><a href='category/advanced-axis-features/#transparent-images-axis-labels'><img src='images/asis_imagetransparent_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#tick-density'>Tick Density</a></strong></div><div class='card-body'><p class='card-text'>Axis tick density can be adjusted by the user. The largest the density is, the more ticks are displayed. Setting this value too high will result in overlapping tick labels.</p><div class='text-center'><a href='category/advanced-axis-features/#tick-density'><img src='images/asis_tickdensity_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/advanced-axis-features/#minimum-tick-spacing'>Minimum Tick Spacing</a></strong></div><div class='card-body'><p class='card-text'>Minimum tick spacing can be defined such that zooming in does not produce more grid lines, ticks, and tick labels beyond the defined limit.</p><div class='text-center'><a href='category/advanced-axis-features/#minimum-tick-spacing'><img src='images/asis_minimumtickspacing_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Multi-Axis

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/multi-axis/#primary-axes'>Primary Axes</a></strong></div><div class='card-body'><p class='card-text'>Plots always have 4 fundamental axes available to work with. Primary axes (XAxis and YAxis) are axis index 0. Secondary axes (XAxis2 and YAxis2) are axis index 1.By default primary axes are totally visible, and secondary axes have ticks hidden and no label. Sometimes the top axis (XAxis2) is given a label to simulate a plot title.</p><div class='text-center'><a href='category/multi-axis/#primary-axes'><img src='images/multiaxis_primary_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/multi-axis/#additional-y-axis'>Additional Y Axis</a></strong></div><div class='card-body'><p class='card-text'>Additional axes can be added on any edge. Additional axes stack away from the plot area.</p><div class='text-center'><a href='category/multi-axis/#additional-y-axis'><img src='images/multiaxis_additional_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/multi-axis/#right-y-axis'>Right Y Axis</a></strong></div><div class='card-body'><p class='card-text'>This example demonstrates how to display a Y axis on the right side of the figure. The vertical axis to the right of the figure is index 1, so plots must be updated to indicate they are to use a nonstandard axis index.</p><div class='text-center'><a href='category/multi-axis/#right-y-axis'><img src='images/multiaxis_right_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/multi-axis/#top-y-axis'>Top Y Axis</a></strong></div><div class='card-body'><p class='card-text'>This example demonstrates how to display an X axis above the figure. The horizontal axis above the figure is index 1, so plots must be updated to indicate they are to use a nonstandard axis index.</p><div class='text-center'><a href='category/multi-axis/#top-y-axis'><img src='images/multiaxis_top_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/multi-axis/#axis-visibility'>Axis Visibility</a></strong></div><div class='card-body'><p class='card-text'>Visibility of axes can be toggled. In this example an additional Y axis is added but the primary Y axis is hidden. The result is a plot that appears to only have one Y axis.</p><div class='text-center'><a href='category/multi-axis/#axis-visibility'><img src='images/multiaxis_invisible_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Statistics

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/statistics/#histogram'>Histogram</a></strong></div><div class='card-body'><p class='card-text'>The Histogram class makes it easy to get binned population information.</p><div class='text-center'><a href='category/statistics/#histogram'><img src='images/stats_histogram_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/statistics/#histogram-probability'>Histogram Probability</a></strong></div><div class='card-body'><p class='card-text'>Binned probability can be displayed instead of raw counts. The probability density is also available for every bin.</p><div class='text-center'><a href='category/statistics/#histogram-probability'><img src='images/stats_histogramprobability_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/statistics/#multiple-histograms'>Multiple Histograms</a></strong></div><div class='card-body'><p class='card-text'>This example demonstrates two histograms on the same plot. Note the use of fractional units on the vertical axis, allowing easy comparison of datasets with different numbers of points. Unlike the previous example, this one does not use multiple axes.</p><div class='text-center'><a href='category/statistics/#multiple-histograms'><img src='images/stats_histogram2_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/statistics/#cph'>CPH</a></strong></div><div class='card-body'><p class='card-text'>This example demonstrates how to plot a cumulative probability histogram (CPH) to compare the distribution of two datasets.</p><div class='text-center'><a href='category/statistics/#cph'><img src='images/stats_cph_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/statistics/#linear-regression'>Linear Regression</a></strong></div><div class='card-body'><p class='card-text'>A regression module is available to simplify the act of creating a linear regression line fitted to the data.</p><div class='text-center'><a href='category/statistics/#linear-regression'><img src='images/stats_linearregression_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/statistics/#nth-order-statistics'>Nth Order Statistics</a></strong></div><div class='card-body'><p class='card-text'>The Nth order statistic of a set is the Nth smallest value of the set (indexed from 1).</p><div class='text-center'><a href='category/statistics/#nth-order-statistics'><img src='images/stats_orderstatistics_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/statistics/#percentiles'>Percentiles</a></strong></div><div class='card-body'><p class='card-text'>Percentiles are a good tool to analyze the distribution of your data and filter out extreme values.</p><div class='text-center'><a href='category/statistics/#percentiles'><img src='images/stats_percentiles_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/statistics/#quantiles'>Quantiles</a></strong></div><div class='card-body'><p class='card-text'>A q-Quantile is a generalization of quartiles and percentiles to any number of buckets.</p><div class='text-center'><a href='category/statistics/#quantiles'><img src='images/stats_quantiles_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Annotation

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-annotation/#figure-annotations'>Figure Annotations</a></strong></div><div class='card-body'><p class='card-text'>Annotations are labels placed at a X/Y location on the figure (not coordinates of the data area). Unlike the Text plottable, annotations do not move as the axes are adjusted.</p><div class='text-center'><a href='category/plottable-annotation/#figure-annotations'><img src='images/annotation_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Arrow

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-arrow/#arrows'>Arrows</a></strong></div><div class='card-body'><p class='card-text'>Arrows point to specific locations on the plot. Arrows are actually just scatter plots with two points and an arrowhead.</p><div class='text-center'><a href='category/plottable-arrow/#arrows'><img src='images/plottable_arrow_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Axis Line and Span

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-axis-line-and-span/#axis-line'>Axis Line</a></strong></div><div class='card-body'><p class='card-text'>An axis line marks a position on an axis. Axis lines extend to positive and negative infinity on the other axis.</p><div class='text-center'><a href='category/plottable-axis-line-and-span/#axis-line'><img src='images/axisline_basics_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-axis-line-and-span/#draggable-axis-lines'>Draggable Axis Lines</a></strong></div><div class='card-body'><p class='card-text'>In GUI environments, axis lines can be draggable and moved with the mouse. Drag limits define the boundaries the lines can be dragged.</p><div class='text-center'><a href='category/plottable-axis-line-and-span/#draggable-axis-lines'><img src='images/axisline_draggable_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-axis-line-and-span/#axis-span'>Axis Span</a></strong></div><div class='card-body'><p class='card-text'>Axis spans shade a portion of one axis. Axis spans extend to negative and positive infinity on the other axis.</p><div class='text-center'><a href='category/plottable-axis-line-and-span/#axis-span'><img src='images/axisspan_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-axis-line-and-span/#draggable-axis-span'>Draggable Axis Span</a></strong></div><div class='card-body'><p class='card-text'>Axis spans can be dragged using the mouse. Drag limits are boundaries over which the edges of spans cannot cross.</p><div class='text-center'><a href='category/plottable-axis-line-and-span/#draggable-axis-span'><img src='images/axisspan_draggable_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Bar Graph

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#bar-graph'>Bar Graph</a></strong></div><div class='card-body'><p class='card-text'>A simple bar graph can be created from a series of values. By default values are palced at X positions 0, 1, 2, etc.</p><div class='text-center'><a href='category/plottable-bar-graph/#bar-graph'><img src='images/bar_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#bar-graph-with-defined-positions'>Bar Graph with Defined Positions</a></strong></div><div class='card-body'><p class='card-text'>Horizontal positions for each bar can be defined manually. If you define bar positions, you will probably want to define the bar width as well.</p><div class='text-center'><a href='category/plottable-bar-graph/#bar-graph-with-defined-positions'><img src='images/bar_positions_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#bar-labels'>Bar Labels</a></strong></div><div class='card-body'><p class='card-text'>Bars placed at specific positions can be labeled by setting tick labels for those positions.</p><div class='text-center'><a href='category/plottable-bar-graph/#bar-labels'><img src='images/bar_labels_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#bar-graph-with-error-bars'>Bar Graph with Error Bars</a></strong></div><div class='card-body'><p class='card-text'>Errorbars can be added to any bar graph.</p><div class='text-center'><a href='category/plottable-bar-graph/#bar-graph-with-error-bars'><img src='images/bar_error_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#stacked-bar-graphs'>Stacked Bar Graphs</a></strong></div><div class='card-body'><p class='card-text'>Bars can be overlapped to give the appearance of stacking.</p><div class='text-center'><a href='category/plottable-bar-graph/#stacked-bar-graphs'><img src='images/bar_stacked_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#values-above-bars'>Values Above Bars</a></strong></div><div class='card-body'><p class='card-text'>The value of each bar can be displayed above it.</p><div class='text-center'><a href='category/plottable-bar-graph/#values-above-bars'><img src='images/bar_values_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#bar-fill-pattern'>Bar Fill Pattern</a></strong></div><div class='card-body'><p class='card-text'>Bar graph fill pattern can be customized.</p><div class='text-center'><a href='category/plottable-bar-graph/#bar-fill-pattern'><img src='images/bar_pattern_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#horizontal-bar-graph'>Horizontal Bar Graph</a></strong></div><div class='card-body'><p class='card-text'>Bar graphs are typically displayed as columns, but it's possible to show bars as rows.</p><div class='text-center'><a href='category/plottable-bar-graph/#horizontal-bar-graph'><img src='images/bar_horizontal_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#grouped-bar-graphs'>Grouped Bar Graphs</a></strong></div><div class='card-body'><p class='card-text'>By customizing positions of multiple bar plots you can achieve the appearance of grouped bar graphs. The AddBarGroups() method is designed to simplify this process. More advanced grouping and bar plot styling is possible using the Population plot type.</p><div class='text-center'><a href='category/plottable-bar-graph/#grouped-bar-graphs'><img src='images/bar_group_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#bars-with-y-offsets'>Bars with Y Offsets</a></strong></div><div class='card-body'><p class='card-text'>By default bar graphs start at 0, but this does not have to be the case. Y offsets can be defined for each bar. When Y offsets are used, values represent the height of the bars (relative to their offsets).</p><div class='text-center'><a href='category/plottable-bar-graph/#bars-with-y-offsets'><img src='images/bar_yoffset_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#negative-bar-colors'>Negative Bar Colors</a></strong></div><div class='card-body'><p class='card-text'>Bars with negative values can be colored differently than positive ones.</p><div class='text-center'><a href='category/plottable-bar-graph/#negative-bar-colors'><img src='images/bar_ynegcolor_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#waterfall-bar-graph'>Waterfall Bar Graph</a></strong></div><div class='card-body'><p class='card-text'>Waterfall bar graphs use bars to represent changes in value from the previous level. This style graph can be created by offseting each bar by the sum of all bars preceeding it. This effect is similar to financial plots (OHLC and Candlestick) which are described in another section.</p><div class='text-center'><a href='category/plottable-bar-graph/#waterfall-bar-graph'><img src='images/bar_waterfall_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#lollipop-plot-quickstart'>Lollipop Plot Quickstart</a></strong></div><div class='card-body'><p class='card-text'>Lollipop plots convey the same information as Bar plots but have a different appearance.</p><div class='text-center'><a href='category/plottable-bar-graph/#lollipop-plot-quickstart'><img src='images/bar_lollipop_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#lollipop-plot-customizations'>Lollipop Plot Customizations</a></strong></div><div class='card-body'><p class='card-text'>Lollipop plots can be extensively customized.</p><div class='text-center'><a href='category/plottable-bar-graph/#lollipop-plot-customizations'><img src='images/bar_lollipop_custom_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#cleveland-dot-plot'>Cleveland Dot Plot</a></strong></div><div class='card-body'><p class='card-text'>Cleveland Dot Plots allow comparing two categories in situations where a Bar Plot may be crowded.</p><div class='text-center'><a href='category/plottable-bar-graph/#cleveland-dot-plot'><img src='images/bar_cleveland_dot_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bar-graph/#datetime-bar-plot'>DateTime Bar Plot</a></strong></div><div class='card-body'><p class='card-text'>Bars have a default width of 1.0, but when using DateTime axis this means bars are one day wide. To plot DateTime data you may need to manually set the width of a bar to a desired size (in fractions of a day).</p><div class='text-center'><a href='category/plottable-bar-graph/#datetime-bar-plot'><img src='images/bar_datetime_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Bubble

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bubble/#bubble-plot'>Bubble Plot</a></strong></div><div class='card-body'><p class='card-text'>Bubble plots display circles at specific X/Y locations. Each circle can be individually customized. Save the object that is returned when the bubble plot is created and call its Add() method to add bubbles.</p><div class='text-center'><a href='category/plottable-bubble/#bubble-plot'><img src='images/bubble_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-bubble/#bubbles-with-labels'>Bubbles with Labels</a></strong></div><div class='card-body'><p class='card-text'>Bubble plots can be combined with other plot types to create more advanced charts. In this example each bubble is accompanied by a text object. Bubbles are also colored according to their size such that smaller bubbles are bluer.</p><div class='text-center'><a href='category/plottable-bubble/#bubbles-with-labels'><img src='images/bubble_withtext_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Colorbar

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-colorbar/#colorbar'>Colorbar</a></strong></div><div class='card-body'><p class='card-text'>A colorbar displays a colormap beside the data area. Colorbars are typically added to plots containing heatmaps.</p><div class='text-center'><a href='category/plottable-colorbar/#colorbar'><img src='images/colorbar_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-colorbar/#colorbar-for-colormap'>Colorbar for Colormap</a></strong></div><div class='card-body'><p class='card-text'>By default colorbars use the Viridis colormap, but this behavior can be customized and many colormaps are available.</p><div class='text-center'><a href='category/plottable-colorbar/#colorbar-for-colormap'><img src='images/colorbar_colormap_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-colorbar/#colorbar-ticks'>Colorbar Ticks</a></strong></div><div class='card-body'><p class='card-text'>Tick marks can be added to colorbars. Each tick is described by a position (a fraction of the distance from the bottom to the top) and a string (the tick label).</p><div class='text-center'><a href='category/plottable-colorbar/#colorbar-ticks'><img src='images/colorbar_ticks_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Fill

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-fill/#fill-under-curve'>Fill Under Curve</a></strong></div><div class='card-body'><p class='card-text'>Fill methods help to create semitransparent polygons to fill the area under a curve. This can be used to give the appearance of shading under a scatter plot, even though the plottable created here is a polygon with optional edge color and fill color.</p><div class='text-center'><a href='category/plottable-fill/#fill-under-curve'><img src='images/fill_curve_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-fill/#fill-above-and-below'>Fill Above and Below</a></strong></div><div class='card-body'><p class='card-text'>Sometimes you want to share the area under a curve, but change its color depending on which side of the baseline value it is. There's a helper method to make this easier.</p><div class='text-center'><a href='category/plottable-fill/#fill-above-and-below'><img src='images/fill_abovebelow_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-fill/#fill-between-curves'>Fill Between Curves</a></strong></div><div class='card-body'><p class='card-text'>Given two curves, a polygon can be created to give the appearance of shading between them. Here we will display two scatter plots, then create a polygon to fill the region between them.</p><div class='text-center'><a href='category/plottable-fill/#fill-between-curves'><img src='images/fill_between_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Finance

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-finance/#candlestick-chart'>Candlestick Chart</a></strong></div><div class='card-body'><p class='card-text'>ScottPlot can draw some financial indicators on plots in X/Y space, but users looking to develop robust financial charts should probably look at other libraries designed specifically for financial charting. The biggest limitations are (1) lack of mouse interaction and (2) the horizontal axis is strictly numeric Cartesian space and is not ideal for plotting dates. That said, some financial charting is possible with ScottPlot, and this cookbook demonstrates common use cases.</p><div class='text-center'><a href='category/plottable-finance/#candlestick-chart'><img src='images/finance_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-finance/#ohlc-chart'>OHLC Chart</a></strong></div><div class='card-body'><p class='card-text'>OHLC charts are an alternative to candlestick charts. They show high and low prices as a vertical line, and indicate open and close prices with little ticks to the left and to the right.</p><div class='text-center'><a href='category/plottable-finance/#ohlc-chart'><img src='images/finance_ohlc_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-finance/#using-a-datetime-axis'>Using a DateTime Axis</a></strong></div><div class='card-body'><p class='card-text'>You probably never want to do this... but OHLCs have an X value you can customize to be a DateTime (converted to a double using DateTime.ToOATime()). The advantage is that you can use the native DateTime axis support on the horizontal axis. The disadvantage is that gaps in time appear as gaps in the candlesticks. Weekends without trading will appear as gaps. The alternative to this method is to plot a series of OHLCs using sequential numbers, then manually define the axis tick labels.</p><div class='text-center'><a href='category/plottable-finance/#using-a-datetime-axis'><img src='images/finance_datetimeaxis_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-finance/#candlesticks-with-custom-tick-labels'>Candlesticks with Custom Tick Labels</a></strong></div><div class='card-body'><p class='card-text'>A better way to represent time on the horizontal axis is to use traditional Cartesian coordinates so each candlestick is placed at X positions (0, 1, 2, etc.), then manually define the locations and label text of important positions on the plot. This is clunky, but possible. This inelegance is why financial charting is probably best done with real financial charting libraries, not a scientific charting library like ScottPlot...</p><div class='text-center'><a href='category/plottable-finance/#candlesticks-with-custom-tick-labels'><img src='images/finance_ticklabels_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-finance/#simple-moving-average-sma'>Simple Moving Average (SMA)</a></strong></div><div class='card-body'><p class='card-text'>A simple moving average (SMA) technical indicator can be calculated and drawn as a scatter plot.</p><div class='text-center'><a href='category/plottable-finance/#simple-moving-average-sma'><img src='images/finance_sma_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-finance/#bollinger-bands'>Bollinger Bands</a></strong></div><div class='card-body'><p class='card-text'>Bollinger bands are a common technical indicator that show the average +/- two times the standard deviation of a given time range preceeding it.</p><div class='text-center'><a href='category/plottable-finance/#bollinger-bands'><img src='images/finance_bollinger_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-finance/#price-on-right'>Price on Right</a></strong></div><div class='card-body'><p class='card-text'>Newer data appears on the ride side of the chart so financial charts are often displayed with the vertical axis label on the right side as well. This is possible by disabling the left vertical axis (YAxis) and enabling the right one (YAxis2). The left and right Y axes are index 0 and 1 (respectively), and the plottable has to be update to indicate which axis index it should render on.</p><div class='text-center'><a href='category/plottable-finance/#price-on-right'><img src='images/finance_right_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-finance/#custom-wick-color'>Custom Wick Color</a></strong></div><div class='card-body'><p class='card-text'>By default candle wicks are the same color as their bodies, but this can be customized.</p><div class='text-center'><a href='category/plottable-finance/#custom-wick-color'><img src='images/finance_wick_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-finance/#custom-colors'>Custom Colors</a></strong></div><div class='card-body'><p class='card-text'>Candles that close below their open price are colored differently from candles which close at or above it. These colors can be customized. Combine this styling with a custom wick color (which also controls the candle border) to create a different visual style.</p><div class='text-center'><a href='category/plottable-finance/#custom-colors'><img src='images/finance_color_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-finance/#dark-mode'>Dark Mode</a></strong></div><div class='card-body'><p class='card-text'>A dark mode finance plot can be realized by customizing color options of the candles and figure. Colors in this example were chosen to mimic TC2000.</p><div class='text-center'><a href='category/plottable-finance/#dark-mode'><img src='images/finance_dark_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Function

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-function/#function'>Function</a></strong></div><div class='card-body'><p class='card-text'>Function plots are defined by a function (not X/Y data points) so the curve is continuous and can be zoomed in and out infinitely</p><div class='text-center'><a href='category/plottable-function/#function'><img src='images/function_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Heatmap

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-heatmap/#heatmap-quickstart'>Heatmap Quickstart</a></strong></div><div class='card-body'><p class='card-text'>Heatmaps display a 2D array using a colormap.</p><div class='text-center'><a href='category/plottable-heatmap/#heatmap-quickstart'><img src='images/heatmap_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-heatmap/#heatmap-with-colorbar'>Heatmap with Colorbar</a></strong></div><div class='card-body'><p class='card-text'>Colorbars are often added when heatmaps are used.</p><div class='text-center'><a href='category/plottable-heatmap/#heatmap-with-colorbar'><img src='images/heatmap_colorbar_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-heatmap/#heatmap-image'>Heatmap Image</a></strong></div><div class='card-body'><p class='card-text'>Image data can be plotted using the heatmap plot type.</p><div class='text-center'><a href='category/plottable-heatmap/#heatmap-image'><img src='images/heatmap_image_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-heatmap/#2d-waveform'>2D Waveform</a></strong></div><div class='card-body'><p class='card-text'>This example demonstrates a heatmap with 1000 tiles</p><div class='text-center'><a href='category/plottable-heatmap/#2d-waveform'><img src='images/heatmap_2dwaveform_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-heatmap/#colormap'>Colormap</a></strong></div><div class='card-body'><p class='card-text'>Viridis is the default colormap, but several alternatives are available.</p><div class='text-center'><a href='category/plottable-heatmap/#colormap'><img src='images/heatmap_colormap_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-heatmap/#scale-limits'>Scale Limits</a></strong></div><div class='card-body'><p class='card-text'>Heatmap colormap scale can use a defined min/max value.</p><div class='text-center'><a href='category/plottable-heatmap/#scale-limits'><img src='images/heatmap_limitscale_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-heatmap/#interpolation-by-density'>Interpolation by Density</a></strong></div><div class='card-body'><p class='card-text'>Heatmaps can be created from random 2D data points using the count within a square of fixed size.</p><div class='text-center'><a href='category/plottable-heatmap/#interpolation-by-density'><img src='images/heatmap_density_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-heatmap/#gaussian-interpolation'>Gaussian Interpolation</a></strong></div><div class='card-body'><p class='card-text'>Heatmaps can be created from 2D data points using bilinear interpolation with Gaussian weighting. This option results in a heatmap with a standard deviation of 4.</p><div class='text-center'><a href='category/plottable-heatmap/#gaussian-interpolation'><img src='images/heatmap_gaussian_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-heatmap/#coordinated-heatmap'>Coordinated Heatmap</a></strong></div><div class='card-body'><p class='card-text'>CoordinatedHeatmap is type of Heatmap stretched to fit user-defined boundaries in coordinate space. This plot type displays two-dimensional intensities on a rectangular surface according to a colormap.</p><div class='text-center'><a href='category/plottable-heatmap/#coordinated-heatmap'><img src='images/heatmap_coordinated_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-heatmap/#heatmap-with-empty-squares'>Heatmap with Empty Squares</a></strong></div><div class='card-body'><p class='card-text'>You can use a 2D array of nullable doubles to indicate some squares do not contain data. This allows the user to display heatmaps with transparency and implement non-rectangular heatmaps.</p><div class='text-center'><a href='category/plottable-heatmap/#heatmap-with-empty-squares'><img src='images/heatmap_transparent_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Image

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-image/#image-quickstart'>Image Quickstart</a></strong></div><div class='card-body'><p class='card-text'>The Image plottable places a Bitmap at a location in X/Y space.The image's position will move in space as the axes move, but the size of the bitmap will always be the same (matched to the display resolution). </p><div class='text-center'><a href='category/plottable-image/#image-quickstart'><img src='images/image_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-image/#image-alignment'>Image Alignment</a></strong></div><div class='card-body'><p class='card-text'>By default the X/Y coordinates define the upper left position of the image, but alignment can be customized.</p><div class='text-center'><a href='category/plottable-image/#image-alignment'><img src='images/image_alignment_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-image/#image-rotation'>Image Rotation</a></strong></div><div class='card-body'><p class='card-text'>Images can be rotated, but rotation is always relative to the upper left corner.</p><div class='text-center'><a href='category/plottable-image/#image-rotation'><img src='images/image_rotation_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-image/#image-border'>Image Border</a></strong></div><div class='card-body'><p class='card-text'>The borders of images can be customized.</p><div class='text-center'><a href='category/plottable-image/#image-border'><img src='images/image_border_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Pie

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-pie/#pie-chart'>Pie Chart</a></strong></div><div class='card-body'><p class='card-text'>A pie chart illustrates numerical proportions as slices of a circle.</p><div class='text-center'><a href='category/plottable-pie/#pie-chart'><img src='images/pie_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-pie/#exploded-pie-chart'>Exploded Pie Chart</a></strong></div><div class='card-body'><p class='card-text'>Exploded pie charts have a bit of space between their slices.</p><div class='text-center'><a href='category/plottable-pie/#exploded-pie-chart'><img src='images/pie_exploded_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-pie/#donut-chart'>Donut Chart</a></strong></div><div class='card-body'><p class='card-text'>Donut plots are pie charts with a hollow center.</p><div class='text-center'><a href='category/plottable-pie/#donut-chart'><img src='images/pie_donut_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-pie/#donut-with-text'>Donut with Text</a></strong></div><div class='card-body'><p class='card-text'>Custom text can be displayed in the center of a donut chart. Notice too how the colors of each slice are customized in this example.</p><div class='text-center'><a href='category/plottable-pie/#donut-with-text'><img src='images/pie_donuttext_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-pie/#slice-values'>Slice Values</a></strong></div><div class='card-body'><p class='card-text'>The value of each slice can be displayed at its center.</p><div class='text-center'><a href='category/plottable-pie/#slice-values'><img src='images/pie_showvalues_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-pie/#slice-percentages'>Slice Percentages</a></strong></div><div class='card-body'><p class='card-text'>The percentage of each slice can be displayed at its center.</p><div class='text-center'><a href='category/plottable-pie/#slice-percentages'><img src='images/pie_showpercentage_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-pie/#customize-pie-colors'>Customize Pie Colors</a></strong></div><div class='card-body'><p class='card-text'>Colors for pie slices and labels can be customized.</p><div class='text-center'><a href='category/plottable-pie/#customize-pie-colors'><img src='images/pie_customcolors_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-pie/#slices-in-legend'>Slices in Legend</a></strong></div><div class='card-body'><p class='card-text'>Slices can be labeled in the legend.</p><div class='text-center'><a href='category/plottable-pie/#slices-in-legend'><img src='images/pie_legend_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-pie/#label-everything'>Label Everything</a></strong></div><div class='card-body'><p class='card-text'>Slices can labeled with values, percentages, and lables, with a legend.</p><div class='text-center'><a href='category/plottable-pie/#label-everything'><img src='images/pie_showeverything_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-pie/#custom-slice-labels'>Custom Slice Labels</a></strong></div><div class='card-body'><p class='card-text'>Custom slice labels can be used to display values using custom formats</p><div class='text-center'><a href='category/plottable-pie/#custom-slice-labels'><img src='images/pie_customlabels_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Point

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-point/#point'>Point</a></strong></div><div class='card-body'><p class='card-text'>You can add a single point to the plot. A point is really a scatter plot with a single X/Y coordinate.</p><div class='text-center'><a href='category/plottable-point/#point'><img src='images/point_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Polygon

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-polygon/#polygon-quickstart'>Polygon Quickstart</a></strong></div><div class='card-body'><p class='card-text'>Polygons are 2D shapes made from pairs of X/Y points. The last point connects back to the first point, forming a closed shape. Polygons can be optionally outlined and optionally filled. Colors with semitransparency are especially useful for polygons.</p><div class='text-center'><a href='category/plottable-polygon/#polygon-quickstart'><img src='images/polygon_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-polygon/#filled-line-plot'>Filled Line Plot</a></strong></div><div class='card-body'><p class='card-text'>Polygons can be used to create 2D shapes resembling filled line plots. When mixed with semitransprent fills, these can be useful for displaying data.</p><div class='text-center'><a href='category/plottable-polygon/#filled-line-plot'><img src='images/polygon_filledlineplot_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-polygon/#stacked-filled-line-plot'>Stacked Filled Line Plot</a></strong></div><div class='card-body'><p class='card-text'>A stacked filled line plot effect can be achieved by overlapping polygons.</p><div class='text-center'><a href='category/plottable-polygon/#stacked-filled-line-plot'><img src='images/polygon_stackedfilledlineplot_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-polygon/#many-polygons'>Many Polygons</a></strong></div><div class='card-body'><p class='card-text'>Special rendering optimizations are available to display a large number of polygons.</p><div class='text-center'><a href='category/plottable-polygon/#many-polygons'><img src='images/polygon_polygons_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Population

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-population/#population-plot'>Population Plot</a></strong></div><div class='card-body'><p class='card-text'>The population plot makes it easy to display populations as bar graphs, box-and-whisker plots, scattered values, or box plots and data points side-by-side. The population plot is different than using a box plot with an error bar in that you pass your original data into the population plot and it determines the standard deviation, standard error, quartiles, mean, median, outliers, etc., and you get to determine how to display these values.</p><div class='text-center'><a href='category/plottable-population/#population-plot'><img src='images/population_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-population/#multiple-populations'>Multiple Populations</a></strong></div><div class='card-body'><p class='card-text'>Multiple populations can be assembled into an array and plotted as a single group.</p><div class='text-center'><a href='category/plottable-population/#multiple-populations'><img src='images/population_multiple_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-population/#multiple-series'>Multiple Series</a></strong></div><div class='card-body'><p class='card-text'>Multiple series of population groups can be plotted Here each group is clustered on the horizontal axis, and each series is given a different color and appears in the legend.</p><div class='text-center'><a href='category/plottable-population/#multiple-series'><img src='images/population_multiseries_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-population/#advanced-population-styling'>Advanced Population Styling</a></strong></div><div class='card-body'><p class='card-text'>Populations can be displayed many different ways. Scatter values can be displayed on either side of the bar or bar. Populations can be shown as bar graphs instead of box plots. Public fields allow many additional customizations.</p><div class='text-center'><a href='category/plottable-population/#advanced-population-styling'><img src='images/population_advanced_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Radar

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-radar/#radar'>Radar</a></strong></div><div class='card-body'><p class='card-text'>A radar chart concisely displays multiple values. Radar plots are also called a spider charts or star charts.</p><div class='text-center'><a href='category/plottable-radar/#radar'><img src='images/radar_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-radar/#straight-axis-lines'>Straight Axis Lines</a></strong></div><div class='card-body'><p class='card-text'>Change the axis type to polygon to display radar charts with straight lines.</p><div class='text-center'><a href='category/plottable-radar/#straight-axis-lines'><img src='images/radar_straightlines_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-radar/#no-axis-lines'>No Axis Lines</a></strong></div><div class='card-body'><p class='card-text'>A radar chart can have no drawn axis as well.</p><div class='text-center'><a href='category/plottable-radar/#no-axis-lines'><img src='images/radar_nolines_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-radar/#labeled-categories'>Labeled Categories</a></strong></div><div class='card-body'><p class='card-text'>Category labels can be displayed on the radar chart.</p><div class='text-center'><a href='category/plottable-radar/#labeled-categories'><img src='images/radar_labelcategory_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-radar/#labeled-values'>Labeled Values</a></strong></div><div class='card-body'><p class='card-text'>Labels can be displayed on the arms of the radar chart.</p><div class='text-center'><a href='category/plottable-radar/#labeled-values'><img src='images/radar_labelvalue_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-radar/#independent-axis-scaling'>Independent Axis Scaling</a></strong></div><div class='card-body'><p class='card-text'>Axis scaling can be independent, allowing values for each category to be displayed using a different scale. When independent axis mode is enabled, axis limits are automatically adjusted to fit the range of the data.</p><div class='text-center'><a href='category/plottable-radar/#independent-axis-scaling'><img src='images/radar_axisscaling_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-radar/#defined-axis-limits'>Defined Axis Limits</a></strong></div><div class='card-body'><p class='card-text'>Radar charts with independent axis limits use scales fitted to the data by default, but scaling can be controlled by defining the maximum value for each axis.</p><div class='text-center'><a href='category/plottable-radar/#defined-axis-limits'><img src='images/radar_axislimits_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Scale Bar

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-scale-bar/#scale-bar'>Scale Bar</a></strong></div><div class='card-body'><p class='card-text'>An L-shaped scalebar can be added in the corner of any plot. Set the vertical or horizontal sizer to zero and the scale bar will only span one dimension.</p><div class='text-center'><a href='category/plottable-scale-bar/#scale-bar'><img src='images/scalebar_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-scale-bar/#horizontal-scale-bar'>Horizontal Scale Bar</a></strong></div><div class='card-body'><p class='card-text'>Set the vertical or horizontal sizer to zero and the scale bar will only span one dimension.</p><div class='text-center'><a href='category/plottable-scale-bar/#horizontal-scale-bar'><img src='images/scalebar_horizontal_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Scatter Plot

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-scatter-plot/#scatter-plot-quickstart'>Scatter Plot Quickstart</a></strong></div><div class='card-body'><p class='card-text'>Scatter plots are best for small numbers of paired X/Y data points. For evenly-spaced data points Signal is much faster.</p><div class='text-center'><a href='category/plottable-scatter-plot/#scatter-plot-quickstart'><img src='images/scatter_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-scatter-plot/#custom-markers'>Custom markers</a></strong></div><div class='card-body'><p class='card-text'>Markers can be customized using optional arguments and public fields.</p><div class='text-center'><a href='category/plottable-scatter-plot/#custom-markers'><img src='images/scatter_markers_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-scatter-plot/#all-marker-shapes'>All marker shapes</a></strong></div><div class='card-body'><p class='card-text'>Legend indicates names of all available marker shapes</p><div class='text-center'><a href='category/plottable-scatter-plot/#all-marker-shapes'><img src='images/scatter_markershape_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-scatter-plot/#custom-lines'>Custom lines</a></strong></div><div class='card-body'><p class='card-text'>Line color, size, and style can be customized. Setting markerSize to 0 prevents markers from being rendered.</p><div class='text-center'><a href='category/plottable-scatter-plot/#custom-lines'><img src='images/scatter_linestyle_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-scatter-plot/#random-xy-points'>Random X/Y Points</a></strong></div><div class='card-body'><p class='card-text'>X data for scatter plots does not have to be evenly spaced, making scatter plots are ideal for displaying random data like this.</p><div class='text-center'><a href='category/plottable-scatter-plot/#random-xy-points'><img src='images/scatter_random_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-scatter-plot/#scatter-plot-with-errorbars'>Scatter Plot with Errorbars</a></strong></div><div class='card-body'><p class='card-text'>An array of values can be supplied for error bars and redering options can be customized as desired</p><div class='text-center'><a href='category/plottable-scatter-plot/#scatter-plot-with-errorbars'><img src='images/scatter_errorbar_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-scatter-plot/#lines-only'>Lines Only</a></strong></div><div class='card-body'><p class='card-text'>A shortcut method makes it easy to create a scatter plot with just lines (no markers)</p><div class='text-center'><a href='category/plottable-scatter-plot/#lines-only'><img src='images/scatter_lineplot_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-scatter-plot/#markers-only'>Markers Only</a></strong></div><div class='card-body'><p class='card-text'>A shortcut method makes it easy to create a scatter plot where markers are displayed at every point (without any connecting lines)</p><div class='text-center'><a href='category/plottable-scatter-plot/#markers-only'><img src='images/scatter_pointsplot_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-scatter-plot/#step-plot'>Step Plot</a></strong></div><div class='card-body'><p class='card-text'>A step plot is a special type of scatter plot where points are connected by right angles instead of straight lines.</p><div class='text-center'><a href='category/plottable-scatter-plot/#step-plot'><img src='images/scatter_stepplot_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Signal Plot

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signal-plot/#signal-plot-quickstart'>Signal Plot Quickstart</a></strong></div><div class='card-body'><p class='card-text'>Signal plots are ideal for evenly-spaced data with thousands or millions of points.</p><div class='text-center'><a href='category/plottable-signal-plot/#signal-plot-quickstart'><img src='images/signal_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signal-plot/#signal-offset'>Signal Offset</a></strong></div><div class='card-body'><p class='card-text'>Signal plots can have X and Y offsets that shift all data by a defined amount.</p><div class='text-center'><a href='category/plottable-signal-plot/#signal-offset'><img src='images/signal_offset_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signal-plot/#speed-test'>Speed Test</a></strong></div><div class='card-body'><p class='card-text'>Compare the speed to the same data plotted as a scatter plot.</p><div class='text-center'><a href='category/plottable-signal-plot/#speed-test'><img src='images/signal_advantage_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signal-plot/#styled-signal-plot'>Styled Signal Plot</a></strong></div><div class='card-body'><p class='card-text'>Signal plots can be styled using public fields. Signal plots can also be offset by a defined X or Y amount.</p><div class='text-center'><a href='category/plottable-signal-plot/#styled-signal-plot'><img src='images/signal_styled_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signal-plot/#5-million-points'>5 Million Points</a></strong></div><div class='card-body'><p class='card-text'>Signal plots with millions of points can be interacted with in real time.</p><div class='text-center'><a href='category/plottable-signal-plot/#5-million-points'><img src='images/signal_5millionpoints_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signal-plot/#display-data-density'>Display data density</a></strong></div><div class='card-body'><p class='card-text'>When plotting extremely high density data, you can't always see the trends underneath all those overlapping data points. If you send an array of colors to PlotSignal(), it will use those colors to display density.</p><div class='text-center'><a href='category/plottable-signal-plot/#display-data-density'><img src='images/signal_density_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signal-plot/#display-first-n-points'>Display first N points</a></strong></div><div class='card-body'><p class='card-text'>When plotting live data it is useful to allocate a large array in memory then fill it with values as they come in. By setting the maxRenderIndex property of a scatter plot to can prevent rendering the end of the array (which is probably filled with zeros).</p><div class='text-center'><a href='category/plottable-signal-plot/#display-first-n-points'><img src='images/signal_firstnpoints_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signal-plot/#plot-a-range-of-points'>Plot a Range of Points</a></strong></div><div class='card-body'><p class='card-text'>It is sometimes useful to only display values within a range of the source data array.</p><div class='text-center'><a href='category/plottable-signal-plot/#plot-a-range-of-points'><img src='images/signal_range_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signal-plot/#fill-below'>Fill Below</a></strong></div><div class='card-body'><p class='card-text'>Signal plots can be filled below with a solid color.</p><div class='text-center'><a href='category/plottable-signal-plot/#fill-below'><img src='images/signal_fillbelow_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signal-plot/#gradient-fill-below'>Gradient Fill Below</a></strong></div><div class='card-body'><p class='card-text'>Signal plots can be filled below using a color gradient.</p><div class='text-center'><a href='category/plottable-signal-plot/#gradient-fill-below'><img src='images/signal_fillbelowgradient_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signal-plot/#gradient-fill-above'>Gradient Fill Above</a></strong></div><div class='card-body'><p class='card-text'>Signal plots can be filled above using a color gradient.</p><div class='text-center'><a href='category/plottable-signal-plot/#gradient-fill-above'><img src='images/signal_fillabove_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signal-plot/#fill-above-and-below'>Fill Above and Below</a></strong></div><div class='card-body'><p class='card-text'>Signal plots can be filled above and below</p><div class='text-center'><a href='category/plottable-signal-plot/#fill-above-and-below'><img src='images/signal_fillaboveandbelow_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signal-plot/#gradient-fill-above-and-below'>Gradient Fill Above and Below</a></strong></div><div class='card-body'><p class='card-text'>Gradients can be used to fill above and below.</p><div class='text-center'><a href='category/plottable-signal-plot/#gradient-fill-above-and-below'><img src='images/signal_gradientaboveandbelowgradient_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: SignalConst

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signalconst/#signalconst-quickstart'>SignalConst Quickstart</a></strong></div><div class='card-body'><p class='card-text'>SignalConst plots pre-processes data to render much faster than Signal plots. Pre-processing takes a little time up-front and requires 4x the memory of Signal.</p><div class='text-center'><a href='category/plottable-signalconst/#signalconst-quickstart'><img src='images/signalconst_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: SignalXY

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signalxy/#signalxy-quickstart'>SignalXY Quickstart</a></strong></div><div class='card-body'><p class='card-text'>SignalXY is a speed-optimized plot for displaying vaues (Ys) with unevenly-spaced positions (Xs) that are in ascending order. If your data is evenly-spaced, Signal and SignalConst is faster.</p><div class='text-center'><a href='category/plottable-signalxy/#signalxy-quickstart'><img src='images/signalxy_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signalxy/#signalxy-offset'>SignalXY Offset</a></strong></div><div class='card-body'><p class='card-text'>SignalXY plots can have X and Y offsets that shift all data by a defined amount.</p><div class='text-center'><a href='category/plottable-signalxy/#signalxy-offset'><img src='images/signalxy_offset_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signalxy/#signal-data-with-gaps'>Signal Data with Gaps</a></strong></div><div class='card-body'><p class='card-text'>Signal with defined Xs that contain gaps</p><div class='text-center'><a href='category/plottable-signalxy/#signal-data-with-gaps'><img src='images/signalxy_gaps_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signalxy/#different-densities'>Different Densities</a></strong></div><div class='card-body'><p class='card-text'>Signal with mised low and high density data</p><div class='text-center'><a href='category/plottable-signalxy/#different-densities'><img src='images/signalxy_density_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: SignalXYConst

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signalxyconst/#signalconst-with-x-and-y-data'>SignalConst with X and Y data</a></strong></div><div class='card-body'><p class='card-text'>SignalXYConst is a speed-optimized plot for displaying vaues (Ys) with unevenly-spaced positions (Xs) that are in ascending order. If your data is evenly-spaced, Signal and SignalConst is faster.</p><div class='text-center'><a href='category/plottable-signalxyconst/#signalconst-with-x-and-y-data'><img src='images/signalxyconst_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-signalxyconst/#different-data-types-for-xs-and-ys'>Different data types for xs and ys</a></strong></div><div class='card-body'><p class='card-text'>SignalXYConst with (int)Xs and (float)Ys arrays</p><div class='text-center'><a href='category/plottable-signalxyconst/#different-data-types-for-xs-and-ys'><img src='images/signalxyconst_types_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Text

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-text/#text'>Text</a></strong></div><div class='card-body'><p class='card-text'>The Text plottable displays a string at an X/Y coordinate in unit space. Unlike the Annotation plottable, text moves when the axes are adjusted.</p><div class='text-center'><a href='category/plottable-text/#text'><img src='images/text_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-text/#text-alignment-and-rotation'>Text Alignment and Rotation</a></strong></div><div class='card-body'><p class='card-text'>Advanced options are available to customize rotation and alignment. Note that if rotation is used, alignment is ignored.</p><div class='text-center'><a href='category/plottable-text/#text-alignment-and-rotation'><img src='images/text_alignment_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-text/#custom-fonts'>Custom Fonts</a></strong></div><div class='card-body'><p class='card-text'>You can pass in a Font to further customize font options</p><div class='text-center'><a href='category/plottable-text/#custom-fonts'><img src='images/text_fonts_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Tooltip

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-tooltip/#tooltip-quickstart'>Tooltip Quickstart</a></strong></div><div class='card-body'><p class='card-text'>Tooltips are annotations that point to an X/Y coordinate on the plot</p><div class='text-center'><a href='category/plottable-tooltip/#tooltip-quickstart'><img src='images/tooltip_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-tooltip/#tooltip-font'>Tooltip Font</a></strong></div><div class='card-body'><p class='card-text'>Tooltips fonts can be customized</p><div class='text-center'><a href='category/plottable-tooltip/#tooltip-font'><img src='images/tooltip_font_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-tooltip/#tooltip-colors'>Tooltip Colors</a></strong></div><div class='card-body'><p class='card-text'>Tooltips border and fill styles can be customized</p><div class='text-center'><a href='category/plottable-tooltip/#tooltip-colors'><img src='images/tooltip_colors_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Plottable: Vector Field

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-vector-field/#quickstart'>Quickstart</a></strong></div><div class='card-body'><p class='card-text'>A vector field can be useful to show data explained by differential equations</p><div class='text-center'><a href='category/plottable-vector-field/#quickstart'><img src='images/vectorfield_quickstart_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-vector-field/#angle-and-magnitude'>Angle and Magnitude</a></strong></div><div class='card-body'><p class='card-text'>This example demonstrates how to define vectors according to a given angle and magnitude.</p><div class='text-center'><a href='category/plottable-vector-field/#angle-and-magnitude'><img src='images/vectorfield_anglemag_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-vector-field/#custom-colormap'>Custom Colormap</a></strong></div><div class='card-body'><p class='card-text'>A colormap can be supplied to color arrows according to their magnitude</p><div class='text-center'><a href='category/plottable-vector-field/#custom-colormap'><img src='images/vectorfield_colormap_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/plottable-vector-field/#custom-scale-factor'>Custom Scale Factor</a></strong></div><div class='card-body'><p class='card-text'>A custom scale factor can adjust the length of the arrows.</p><div class='text-center'><a href='category/plottable-vector-field/#custom-scale-factor'><img src='images/vectorfield_scalefactor_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Misc

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/misc/#spline-interpolation'>Spline Interpolation</a></strong></div><div class='card-body'><p class='card-text'>Interpolated splines create curves with many X/Y points to smoothly connect a limited number of input points.</p><div class='text-center'><a href='category/misc/#spline-interpolation'><img src='images/misc_interpolation_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/misc/#action-potential'>Action Potential</a></strong></div><div class='card-body'><p class='card-text'>The raw trace (voltage) and first derivative (voltage change / time) of a mammalian action potential.</p><div class='text-center'><a href='category/misc/#action-potential'><img src='images/misc_ap_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

## Style

<div class='row'>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/style/#default'>Default</a></strong></div><div class='card-body'><p class='card-text'>Customize many plot features using style presets</p><div class='text-center'><a href='category/style/#default'><img src='images/style_default_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/style/#control'>Control</a></strong></div><div class='card-body'><p class='card-text'>Customize many plot features using style presets</p><div class='text-center'><a href='category/style/#control'><img src='images/style_control_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/style/#blue1'>Blue1</a></strong></div><div class='card-body'><p class='card-text'>Customize many plot features using style presets</p><div class='text-center'><a href='category/style/#blue1'><img src='images/style_blue1_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/style/#blue2'>Blue2</a></strong></div><div class='card-body'><p class='card-text'>Customize many plot features using style presets</p><div class='text-center'><a href='category/style/#blue2'><img src='images/style_blue2_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/style/#blue3'>Blue3</a></strong></div><div class='card-body'><p class='card-text'>Customize many plot features using style presets</p><div class='text-center'><a href='category/style/#blue3'><img src='images/style_blue3_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/style/#light1'>Light1</a></strong></div><div class='card-body'><p class='card-text'>Customize many plot features using style presets</p><div class='text-center'><a href='category/style/#light1'><img src='images/style_light1_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/style/#light2'>Light2</a></strong></div><div class='card-body'><p class='card-text'>Customize many plot features using style presets</p><div class='text-center'><a href='category/style/#light2'><img src='images/style_light2_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/style/#gray1'>Gray1</a></strong></div><div class='card-body'><p class='card-text'>Customize many plot features using style presets</p><div class='text-center'><a href='category/style/#gray1'><img src='images/style_gray1_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/style/#gray2'>Gray2</a></strong></div><div class='card-body'><p class='card-text'>Customize many plot features using style presets</p><div class='text-center'><a href='category/style/#gray2'><img src='images/style_gray2_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/style/#black'>Black</a></strong></div><div class='card-body'><p class='card-text'>Customize many plot features using style presets</p><div class='text-center'><a href='category/style/#black'><img src='images/style_black_thumb.jpg' class='mw-100' /></a></div></div></div></div>

<div class='col-md-4 mb-3'><div class='card'><div class='card-header'><strong><a href='category/style/#seaborn'>Seaborn</a></strong></div><div class='card-body'><p class='card-text'>Customize many plot features using style presets</p><div class='text-center'><a href='category/style/#seaborn'><img src='images/style_seaborn_thumb.jpg' class='mw-100' /></a></div></div></div></div>

</div>

<hr class='my-4 invisible'>

# The Plot Module

The Plot module is the primary way to interct with ScottPlot. It has helper methods to make it easy to create and add Plottable objects. Use the Render() method to render the plot as an image.

## Properties

<a href='api/plot/#xaxis'><strong>XAxis</strong></a> - Axis on the bottom edge of the plot

<a href='api/plot/#xaxis2'><strong>XAxis2</strong></a> - Axis on the top edge of the plot

<a href='api/plot/#yaxis'><strong>YAxis</strong></a> - Axis on the left edge of the plot

<a href='api/plot/#yaxis2'><strong>YAxis2</strong></a> - Axis on the right edge of the plot

<a href='api/plot/#version'><strong>Version</strong></a> - ScottPlot version in the format "1.2.3" (or "1.2.3-beta" for pre-releases)

## Methods

<a href='api/plot/#axisauto'><strong>AxisAuto()</strong></a> - Automatically adjust axis limits to fit the data

<a href='api/plot/#axisautox'><strong>AxisAutoX()</strong></a> - Automatically adjust axis limits to fit the data

<a href='api/plot/#axisautoy'><strong>AxisAutoY()</strong></a> - Automatically adjust axis limits to fit the data (with a little extra margin)

<a href='api/plot/#axispan'><strong>AxisPan()</strong></a> - Pan the primary X and Y axis without affecting zoom

<a href='api/plot/#axisscale'><strong>AxisScale()</strong></a> - Adjust axis limits to achieve a certain pixel scale (units per pixel)

<a href='api/plot/#axisscalelock'><strong>AxisScaleLock()</strong></a> - Lock X and Y axis scales (units per pixel) together to protect symmetry of circles and squares

<a href='api/plot/#axiszoom'><strong>AxisZoom()</strong></a> - Zoom in or out. The amount of zoom is defined as a fraction of the current axis span.

<a href='api/plot/#benchmark'><strong>Benchmark()</strong></a> - If enabled, the benchmark displays render information in the corner of the plot.

<a href='api/plot/#clear'><strong>Clear()</strong></a> - Clear all plottables

<a href='api/plot/#clear'><strong>Clear()</strong></a> - Remove all plottables of the given type

<a href='api/plot/#copy'><strong>Copy()</strong></a> - Return a new Plot with all the same Plottables (and some of the styles) of this one.

<a href='api/plot/#equals'><strong>Equals()</strong></a> - Returns true if the given plot is the exact same plot as this one

<a href='api/plot/#frame'><strong>Frame()</strong></a> - Configure color and visibility of the frame that outlines the data area. Note that the axis lines of all 4 primary axes touch each other, giving the appearance of a rectangle framing the data area. This method allows the user to customize these lines as a group or individually.

<a href='api/plot/#frameless'><strong>Frameless()</strong></a> - Give the plot a frameless appearance by setting the size of all axes to zero. This causes the data area to go right up to the edge of the plot.

<a href='api/plot/#getaxislimits'><strong>GetAxisLimits()</strong></a> - Returns the current limits for a given pair of axes.

<a href='api/plot/#getcoordinate'><strong>GetCoordinate()</strong></a> - Return the coordinate (in coordinate space) for the given pixel

<a href='api/plot/#getcoordinatex'><strong>GetCoordinateX()</strong></a> - Return the X position (in coordinate space) for the given pixel column

<a href='api/plot/#getcoordinatey'><strong>GetCoordinateY()</strong></a> - Return the Y position (in coordinate space) for the given pixel row

<a href='api/plot/#getguid'><strong>GetGuid()</strong></a> - Every plot has a globally unique ID (GUID) that can help differentiate it from other plots

<a href='api/plot/#gethashcode'><strong>GetHashCode()</strong></a> - Returns an integer unique to this instance (based on the GUID)

<a href='api/plot/#getnextcolor'><strong>GetNextColor()</strong></a> - Return a new color from the Pallette based on the number of plottables already in the plot. Use this to ensure every plottable gets a unique color.

<a href='api/plot/#getpixel'><strong>GetPixel()</strong></a> - Return the pixel for the given point in coordinate space

<a href='api/plot/#getpixelx'><strong>GetPixelX()</strong></a> - Return the horizontal pixel location given position in coordinate space

<a href='api/plot/#getpixely'><strong>GetPixelY()</strong></a> - Return the vertical pixel location given position in coordinate space

<a href='api/plot/#getplottables'><strong>GetPlottables()</strong></a> - Return a copy of the list of plottables

<a href='api/plot/#getsettings'><strong>GetSettings()</strong></a> - The Settings module stores manages plot state and advanced configuration. Its class structure changes frequently, and users are highly advised not to interact with it directly. This method returns the settings module for advanced users and developers to interact with.

<a href='api/plot/#grid'><strong>Grid()</strong></a> - Customize basic options for the primary X and Y axes. Call XAxis.Grid() and YAxis.Grid() to further customize grid settings.

<a href='api/plot/#layout'><strong>Layout()</strong></a> - Set padding around the data area by defining the minimum size and padding for all axes

<a href='api/plot/#legend'><strong>Legend()</strong></a> - Configure legend visibility and location. Optionally you can further customize the legend by interacting with the object it returns.

<a href='api/plot/#matchlayout'><strong>MatchLayout()</strong></a> - Adjust this axis layout based on the layout of a source plot

<a href='api/plot/#palette'><strong>Palette()</strong></a> - The palette defines the default colors given to plottables when they are added

<a href='api/plot/#remove'><strong>Remove()</strong></a> - Remove a specific plottable

<a href='api/plot/#render'><strong>Render()</strong></a> - Render the plot onto an existing bitmap

<a href='api/plot/#render'><strong>Render()</strong></a> - Render the plot onto a new Bitmap (using the size given when the plot was created or resized)

<a href='api/plot/#render'><strong>Render()</strong></a> - Render the plot onto a new Bitmap of the given dimensions

<a href='api/plot/#renderlegend'><strong>RenderLegend()</strong></a> - Return a new Bitmap containing only the legend

<a href='api/plot/#renderlock'><strong>RenderLock()</strong></a> - Wait for the current render to finish, then prevent future renders until RenderUnlock() is called. Locking rendering is required if you intend to modify plottables while rendering is occurring in another thread.

<a href='api/plot/#renderunlock'><strong>RenderUnlock()</strong></a> - Release the render lock, allowing renders to proceed.

<a href='api/plot/#resize'><strong>Resize()</strong></a> - Update the default size for new renders

<a href='api/plot/#savefig'><strong>SaveFig()</strong></a> - Save the plot as an image

<a href='api/plot/#setaxislimits'><strong>SetAxisLimits()</strong></a> - Set limits for the a given pair of axes

<a href='api/plot/#setaxislimits'><strong>SetAxisLimits()</strong></a> - Set limits for a pair of axes

<a href='api/plot/#setaxislimitsx'><strong>SetAxisLimitsX()</strong></a> - Set limits for the primary X axis

<a href='api/plot/#setaxislimitsy'><strong>SetAxisLimitsY()</strong></a> - Set limits for the primary Y axis

<a href='api/plot/#setculture'><strong>SetCulture()</strong></a> - Set the culture to use for number-to-string converstion for tick labels of all axes.

<a href='api/plot/#setculture'><strong>SetCulture()</strong></a> - Set the culture to use for number-to-string converstion for tick labels of all axes. This overload allows you to manually define every format string, allowing extensive customization of number and date formatting.

<a href='api/plot/#setviewlimits'><strong>SetViewLimits()</strong></a> - Set limits of the view for the primary axes. View limits define the boundaries of axis limits. You cannot zoom, pan, or set axis limits beyond view limits.

<a href='api/plot/#style'><strong>Style()</strong></a> - Set colors of all plot components using pre-defined styles

<a href='api/plot/#style'><strong>Style()</strong></a> - Set the color of specific plot components

<a href='api/plot/#title'><strong>Title()</strong></a> - Set the label for the horizontal axis above the plot (XAxis2)

<a href='api/plot/#validate'><strong>Validate()</strong></a> - Throw an exception if any plottable contains an invalid state.

<a href='api/plot/#xlabel'><strong>XLabel()</strong></a> - Set the label for the vertical axis to the right of the plot (XAxis)

<a href='api/plot/#xticks'><strong>XTicks()</strong></a> - Manually define X axis tick labels using consecutive integer positions (0, 1, 2, etc.)

<a href='api/plot/#xticks'><strong>XTicks()</strong></a> - Manually define X axis tick positions and labels

<a href='api/plot/#ylabel'><strong>YLabel()</strong></a> - Set the label for the vertical axis to the right of the plot (YAxis2)

<a href='api/plot/#yticks'><strong>YTicks()</strong></a> - Manually define Y axis tick labels using consecutive integer positions (0, 1, 2, etc.)

<a href='api/plot/#yticks'><strong>YTicks()</strong></a> - Manually define Y axis tick positions and labels

## Methods for Creating Plottables

<a href='api/plot/#add'><strong>Add()</strong></a> - Add a plottable to the plot

<a href='api/plot/#addannotation'><strong>AddAnnotation()</strong></a> - Display text in the data area at a pixel location (not a X/Y coordinates)

<a href='api/plot/#addarrow'><strong>AddArrow()</strong></a> - Display an arrow pointing to a spot in coordinate space

<a href='api/plot/#addaxis'><strong>AddAxis()</strong></a> - Create and return an additional axis

<a href='api/plot/#addbar'><strong>AddBar()</strong></a> - Add a bar plot for the given values. Bars will be placed at X positions 0, 1, 2, etc.

<a href='api/plot/#addbar'><strong>AddBar()</strong></a> - Add a bar plot for the given values using defined bar positions

<a href='api/plot/#addbar'><strong>AddBar()</strong></a> - Add a bar plot (values +/- errors) using defined positions

<a href='api/plot/#addbargroups'><strong>AddBarGroups()</strong></a> - Create a series of bar plots and customize the ticks and legend

<a href='api/plot/#addbubbleplot'><strong>AddBubblePlot()</strong></a> - Add an empty bubble plot. Call it's Add() method to add bubbles with custom position and styling.

<a href='api/plot/#addbubbleplot'><strong>AddBubblePlot()</strong></a> - Add a bubble plot with multiple bubbles at the given positions all styled the same. Call the Add() method to add bubbles manually, allowing further customization of size and style.

<a href='api/plot/#addcandlesticks'><strong>AddCandlesticks()</strong></a> - Add candlesticks to the chart from OHLC (open, high, low, close) data

<a href='api/plot/#addclevelanddot'><strong>AddClevelandDot()</strong></a> - Add a Cleveland Dot plot for the given values. Cleveland Dots will be placed at X positions 0, 1, 2, etc.

<a href='api/plot/#addclevelanddot'><strong>AddClevelandDot()</strong></a> - Add a Cleveland Dot plot for the given values using defined dot positions.

<a href='api/plot/#addcolorbar'><strong>AddColorbar()</strong></a> - Add a colorbar to display a colormap beside the data area

<a href='api/plot/#addcolorbar'><strong>AddColorbar()</strong></a> - Add a colorbar initialized with settings from a heatmap

<a href='api/plot/#addfill'><strong>AddFill()</strong></a> - Create a polygon to fill the area between Y values and a baseline.

<a href='api/plot/#addfill'><strong>AddFill()</strong></a> - Create a polygon to fill the area between Y values of two curves.

<a href='api/plot/#addfillaboveandbelow'><strong>AddFillAboveAndBelow()</strong></a> - Create a polygon to fill the area between Y values and a baseline that uses two different colors for area above and area below the baseline.

<a href='api/plot/#addfunction'><strong>AddFunction()</strong></a> - Add a line plot that uses a function (rather than X/Y points) to place the curve

<a href='api/plot/#addheatmap'><strong>AddHeatmap()</strong></a> - Add a heatmap to the plot automatically-sized so each cell is 1x1.

<a href='api/plot/#addheatmap'><strong>AddHeatmap()</strong></a> - Add a heatmap to the plot automatically-sized so each cell is 1x1.

<a href='api/plot/#addheatmapcoordinated'><strong>AddHeatmapCoordinated()</strong></a> - Add heatmap to the plot stretched to fit the given dimensions. Unlike the regular heatmap which gives each cell a size of 1x1 and starts at the axis origin, this heatmap stretches the array so that it covers the defined X and Y spans.

<a href='api/plot/#addheatmapcoordinated'><strong>AddHeatmapCoordinated()</strong></a> - Add heatmap to the plot stretched to fit the given dimensions. Unlike the regular heatmap which gives each cell a size of 1x1 and starts at the axis origin, this heatmap stretches the array so that it covers the defined X and Y spans.

<a href='api/plot/#addhorizontalline'><strong>AddHorizontalLine()</strong></a> - Add a horizontal axis line at a specific Y position

<a href='api/plot/#addhorizontalspan'><strong>AddHorizontalSpan()</strong></a> - Add a horizontal span (shades the region between two X positions)

<a href='api/plot/#addimage'><strong>AddImage()</strong></a> - Display an image at a specific coordinate

<a href='api/plot/#addline'><strong>AddLine()</strong></a> - Add a line (a scatter plot with two points) to the plot

<a href='api/plot/#addline'><strong>AddLine()</strong></a> - Add a line (a scatter plot with two points) to the plot

<a href='api/plot/#addlollipop'><strong>AddLollipop()</strong></a> - Add a Lollipop plot for the given values. Lollipops will be placed at X positions 0, 1, 2, etc.

<a href='api/plot/#addlollipop'><strong>AddLollipop()</strong></a> - Add a lollipop plot for the given values using defined lollipop positions

<a href='api/plot/#addohlcs'><strong>AddOHLCs()</strong></a> - Add OHLC (open, high, low, close) data to the plot

<a href='api/plot/#addpie'><strong>AddPie()</strong></a> - Add a pie chart to the plot

<a href='api/plot/#addpoint'><strong>AddPoint()</strong></a> - Add a point (a scatter plot with a single marker)

<a href='api/plot/#addpolygon'><strong>AddPolygon()</strong></a> - Add a polygon to the plot

<a href='api/plot/#addpolygons'><strong>AddPolygons()</strong></a> - Add many polygons using an optimized rendering method

<a href='api/plot/#addpopulation'><strong>AddPopulation()</strong></a> - Add a population to the plot

<a href='api/plot/#addpopulations'><strong>AddPopulations()</strong></a> - Add multiple populations to the plot as a single series

<a href='api/plot/#addpopulations'><strong>AddPopulations()</strong></a> - Add multiple populations to the plot as a single series

<a href='api/plot/#addradar'><strong>AddRadar()</strong></a> - Add a radar plot

<a href='api/plot/#addscalebar'><strong>AddScaleBar()</strong></a> - Add an L-shaped scalebar to the corner of the plot

<a href='api/plot/#addscatter'><strong>AddScatter()</strong></a> - Add a scatter plot from X/Y pairs. Lines and markers are shown by default. Scatter plots are slower than Signal plots.

<a href='api/plot/#addscatterlines'><strong>AddScatterLines()</strong></a> - Add a scatter plot from X/Y pairs connected by lines (no markers). Scatter plots are slower than Signal plots.

<a href='api/plot/#addscatterlist'><strong>AddScatterList()</strong></a> - Scatter plot with Add() and Clear() methods for updating data

<a href='api/plot/#addscatterpoints'><strong>AddScatterPoints()</strong></a> - Add a scatter plot from X/Y pairs using markers at points (no lines). Scatter plots are slower than Signal plots.

<a href='api/plot/#addscatterstep'><strong>AddScatterStep()</strong></a> - Add a step plot is a type of line plot where points are connected with right angles instead of straight lines.

<a href='api/plot/#addsignal'><strong>AddSignal()</strong></a> - Signal plots have evenly-spaced X points and render very fast.

<a href='api/plot/#addsignalconstt'><strong>AddSignalConst<T>()</strong></a> - SignalConts plots have evenly-spaced X points and render faster than Signal plots but data in source arrays cannot be changed after it is loaded. Methods can be used to update all or portions of the data.

<a href='api/plot/#addsignalxy'><strong>AddSignalXY()</strong></a> - Speed-optimized plot for Ys with unevenly-spaced ascending Xs

<a href='api/plot/#addsignalxyconstt'><strong>AddSignalXYConst<T>()</strong></a> - Speed-optimized plot for Ys with unevenly-spaced ascending Xs. Faster than SignalXY but values cannot be modified after loading.

<a href='api/plot/#addtext'><strong>AddText()</strong></a> - Display text at specific X/Y coordinates

<a href='api/plot/#addtext'><strong>AddText()</strong></a> - Display text at specific X/Y coordinates

<a href='api/plot/#addtooltip'><strong>AddTooltip()</strong></a> - Display a text bubble that points to an X/Y location on the plot

<a href='api/plot/#addvectorfield'><strong>AddVectorField()</strong></a> - Add a 2D vector field to the plot

<a href='api/plot/#addverticalline'><strong>AddVerticalLine()</strong></a> - Add a vertical axis line at a specific Y position

<a href='api/plot/#addverticalspan'><strong>AddVerticalSpan()</strong></a> - Add a horizontal span (shades the region between two X positions)

# Plottable Types

<a href='api/plottable/annotation/'><strong>Annotation</strong></a> - Text placed at a location relative to the data area that does not move when the axis limits change

<a href='api/plottable/hline/'><strong>HLine</strong></a> - Horizontal line at a Y position

<a href='api/plottable/vline/'><strong>VLine</strong></a> - Vertical line at an X position

<a href='api/plottable/hspan/'><strong>HSpan</strong></a> - Shaded horizontal region between two X values

<a href='api/plottable/vspan/'><strong>VSpan</strong></a> - Shade the region between two Y values

<a href='api/plottable/barplot/'><strong>BarPlot</strong></a> - Bar plots display a series of bars. Positions are defined by Xs. Heights are defined by Ys (relative to BaseValue and YOffsets).

<a href='api/plottable/bubbleplot/'><strong>BubblePlot</strong></a> - Display circles of user-defined sizes and colors at specific X/Y positions

<a href='api/plottable/clevelanddotplot/'><strong>ClevelandDotPlot</strong></a> - Cleveland Dot plots display a series of paired p[oints. Positions are defined by Xs. Heights are defined by Ys1 and Ys2 (internally done with Ys and YOffsets).

<a href='api/plottable/colorbar/'><strong>Colorbar</strong></a> - A colorbar translates numeric intensity values to colors. The Colorbar plot type displays a Colorbar along an edge of the plot.

<a href='api/plottable/coordinatedheatmap/'><strong>CoordinatedHeatmap</strong></a> - This variation of the Heatmap renders intensity data as a rectangle sized to fit user-defined axis limits

<a href='api/plottable/financeplot/'><strong>FinancePlot</strong></a> - Finance plots display open/high/low/close (OHLC) data

<a href='api/plottable/functionplot/'><strong>FunctionPlot</strong></a> - A function plot displays a curve using a function (Y as a function of X)

<a href='api/plottable/heatmap/'><strong>Heatmap</strong></a> - A heatmap displays a 2D array of intensities as small rectangles on the plot colored according to their intensity value according to a colormap.

<a href='api/plottable/image/'><strong>Image</strong></a> - Display a Bitmap at X/Y coordinates in unit space

<a href='api/plottable/lollipopplot/'><strong>LollipopPlot</strong></a> - Lollipop plots display a series of "Lollipops" in place of bars. Positions are defined by Xs. Heights are defined by Ys (relative to BaseValue and YOffsets).

<a href='api/plottable/pieplot/'><strong>PiePlot</strong></a> - A pie plot displays a collection of values as a circle. Pie plots with a hollow center are donut plots.

<a href='api/plottable/polygon/'><strong>Polygon</strong></a> - A polygon is a collection of X/Y points that are all connected to form a closed shape. Polygons can be optionally filled with a color or a gradient.

<a href='api/plottable/polygons/'><strong>Polygons</strong></a> - Polygons are multiple Polygon objects. This plot type is faster alternative for rendering a large number of polygons compared to adding a bunch of individual Polygon objects to the plot.

<a href='api/plottable/populationplot/'><strong>PopulationPlot</strong></a> - Population plots are designed to show collections of data. A Population is a 1D array of values, and statistics are calculated automatically. Populations can be displayed as bar plots, box plots, or scatter plots. Public methods, fields, and properties allow extensive customization. This plottable supports higher-order grouping (groups of groups).

<a href='api/plottable/radarplot/'><strong>RadarPlot</strong></a> - A radar chart is a graphical method of displaying multivariate data in the form of a two-dimensional chart of three or more quantitative variables represented on axes starting from the same point.

<a href='api/plottable/scalebar/'><strong>ScaleBar</strong></a> - An L-shaped scalebar rendered in the corner of the data area

<a href='api/plottable/scatterplot/'><strong>ScatterPlot</strong></a> - The scatter plot renders X/Y pairs as points and/or connected lines. Scatter plots can be extremely slow for large datasets, so use Signal plots in these situations.

<a href='api/plottable/scatterplotlist/'><strong>ScatterPlotList</strong></a> - A collection of X/Y coordinates that can be displayed as markers and/or connected lines. Unlike the regular ScatterPlot, this plot type has Add() methods to easily add data.

<a href='api/plottable/signalplot/'><strong>SignalPlot</strong></a> - A signal plot displays evenly-spaced data. Instead of X/Y pairs, signal plots take Y values and a sample rate. Optional X and Y offsets can further customize the data.

<a href='api/plottable/signalplotconst1/'><strong>SignalPlotConst<T></strong></a> - This plot type is a potentially faster version of the SignalPlot. It pre-calculates min/max values for various segments of data, greatly speeding-up rendering for extremely large datasets (10s of millions of points). Note that these pre-calculations require more memory and an up-front calculation delay. If the underlying data is updated, you must call Update() methods to recalculate the min/max values.

<a href='api/plottable/signalplotxy/'><strong>SignalPlotXY</strong></a> - A variation of the SignalPlot optimized for unevenly-spaced ascending X values.

<a href='api/plottable/signalplotxyconst2/'><strong>SignalPlotXYConst<T></strong></a> - A variation of the SignalPlotConst optimized for unevenly-spaced ascending X values.

<a href='api/plottable/signalplotxygeneric2/'><strong>SignalPlotXYGeneric<T></strong></a> - A variation of the SignalPlotConst optimized for unevenly-spaced ascending X values.

<a href='api/plottable/text/'><strong>Text</strong></a> - Display a text label at an X/Y position in coordinate space

<a href='api/plottable/tooltip/'><strong>Tooltip</strong></a> - A tooltip displays a text bubble pointing to a specific location in X/Y space. The position of the bubble moves according to the axis limits to best display the text in the data area.

<a href='api/plottable/vectorfield/'><strong>VectorField</strong></a> - The VectorField displays arrows representing a 2D array of 2D vectors