Skip to main content
Ctrl+K

Plotting in Julia

  • Julia visualization example notebooks
  • PythonPlot.jl gallery
  • Plots.jl gallery
  • Binder logo Binder
  • Colab logo Colab
  • .ipynb

Plots.jl gallery

Contents

  • Attributes
    • Ticks size and properties
    • No axis
    • Log scale for axes
    • Axis range
    • Scientific notation
    • Flip
    • Aspect ratio
    • Fonts
  • Bar plots
    • Grouped vertical bar plots
    • Stacked vertical bar plots
    • Horizontal Bar Plot
    • Categorical Histogram Plot
  • Histogram
  • Box plots
  • Contour Plots
    • Over a function
    • Nullclines
    • Contour plot over an array
    • Filled Contour Plots
  • Datetime plot
  • Error bar
  • Heatmap
  • Line plots
    • Plotting multiple series
    • Parametric plots
  • 3D line plot
    • Line colors
    • Line styles
  • Polar Plots
    • Rose Plots
  • Quiver Plots
  • Scatter Plots
  • Stairstep plot
  • Stem plot
  • Subplots
    • Build subplots one by one
  • Surface plots
  • Twin Y Axis
  • Animations

Plots.jl gallery#

Sources:

  • goropikari/PlotsGallery.jl (repo archived)

  • Julia Plots docs

Attributes#

https://docs.juliaplots.org/stable/attributes/

using Plots
using Random
Random.seed!(2024)
Random.TaskLocalRNG()

Ticks size and properties#

plot(sin, 0, 2π;
    xticks=0:0.5:2π,
    xrotation=60,
    xtickfontsize=25,
    bottom_margin=15Plots.mm)
_images/23deb306ffe8309112b70ea6a9e5a27988e242e232c6575ea030f594eb235282.png
plot(sin, 0, 2π;
    xtick=(0:0.5:2π, ["$i a" for i in 0:0.5:2π]),
    ytick=-1:0.2:1,
    xrotation=60,
    yrotation=90,
)
_images/0396e921804e307a0fa8f674c11cef5cf1d0a58bbd3f839803fa8c7fcc9abc31.png

No axis#

axis=false

plot(sin, 0, 2π, axis=false)
_images/f5a78ef181a31fe1227cb39653d29eb59fd937ea627186468c0d0be164f514bf.png

Log scale for axes#

xscale=:log10, yscale=:log10

plot(exp, -5, 5, yscale=:log10, title="semilogy", legend=nothing)
_images/aa4af60642e7886904bdd0b1b33cfada61696db01abe8b4d8d257f0a7c474a8e.png
plot(log, 1e-5, 10, xscale=:log10, title="semilogx", legend=nothing)
_images/1eb4bd8dce3df77c00de26dcff6b15a7359734660bb76836fed39187bdb965f9.png
plot(x->x^1.7, 1e-3, 3, scale=:log10, title="log-log", label="x^(1.7)", legend=:topleft)
_images/42d185b8530e1eaddb94ed3e96f6c902c3c9f1dcf17561849809a4e548a06d64.png

Axis range#

xlims and ylims

plot(sin, 0, 2π, xlims=(-10, 10), ylims=(-2,2))
_images/88b964fd6ca95a681065a4f8a72996ec58dc3938587e676bc8856a6b946d1537.png

Scientific notation#

yformatter=:scientific

plot(exp, 0, 10, yformatter=:scientific)
_images/dc2a869bc2af2e3d06b23dd0249b4be3ad39cb9a9ca199605506c9fa96444bd3.png

Flip#

xflip=true and/or yflip=true

plot(identity, 0:0.01:2π, proj=:polar, xflip=true, yflip=true, legend=false)
_images/fb19bd7f363ec6fb1383f34f15c65ca4ec4150be2c1538bc8e3065603925a5a2.png

Aspect ratio#

aspect_ratio=:equal or aspect_ratio=<number>

heatmap(bitrand(10, 10), aspect_ratio=:equal, c=:blues, colorbar=false)
_images/0479f4e1736f82521ccf8824ad1313d2d4899ba1b88ccbe1c6e536d957795fde.png

Fonts#

LaTeX fonts are supported by the LaTeXStrings.jl package.

using Plots
using LaTeXStrings

plot(sin, 0, 2π,
    title=L"y = \sin(x)",
    titlefont=font(40), ## title

    xlabel=L"x",
    ylabel="y",
    xguidefontsize=30, ## x-guide
    yguidefontsize=20, ## y-guide
    # guidefontsize=20, ## both x,y-guide

    xtick=(0:0.5:2π, ["\$ $(i) \$" for i in 0:0.5:2π]),
    ytick=-1:0.5:1,
    xtickfontsize=15,
    ytickfontsize=20,
    # tickfontsize=10, ## for both x and y

    label="Sin function",
    legendfontsize=12,

    xlims=(0,2π),
    ylims=(-1,1),
    bottom_margin=5Plots.mm,
    left_margin=10Plots.mm,
    top_margin=15Plots.mm
)
_images/421642683269b68fe5014ccc0c45b00933d8a55efb79fb7cada1608dda32d6b8.png
fib(x) = (((1+sqrt(5))/2)^x - ((1-sqrt(5))/2)^x)/sqrt(5)

ann = L"F_n = \frac{1}{\sqrt{5}} \left[\left( \frac{1+\sqrt{5}}{2} \right)^n - \left( \frac{1-\sqrt{5}}{2} \right)^n \right]"

plot(fib, 1:12, marker=:circle, xlabel=L"n", ylabel=L"F_n", annotation=(5, 100, ann))
_images/0a84dbb1f9839c78e12a0c4f7f4f500e082c419589a215dc5500d6a806299f2b.png

Bar plots#

using Plots
using StatsPlots
using StatsBase
measles = [38556, 24472, 14556, 18060, 19549, 8122, 28541, 7880, 3283, 4135, 7953, 1884]
mumps = [20178, 23536, 34561, 37395, 36072, 32237, 18597, 9408, 6005, 6268, 8963, 13882]
chickenPox = [37140, 32169, 37533, 39103, 33244, 23269, 16737, 5411, 3435, 6052, 12825, 23332]
ticklabel = string.(collect('A':'L'))
12-element Vector{String}:
 "A"
 "B"
 "C"
 "D"
 "E"
 "F"
 "G"
 "H"
 "I"
 "J"
 "K"
 "L"

Grouped vertical bar plots#

Requires the StatsPlots.jl package. groupedbar(data, bar_position = :dodge)

groupedbar([measles mumps chickenPox], bar_position = :dodge, bar_width=0.7, xticks=(1:12, ticklabel), label=["measles" "mumps" "chickenPox"])
_images/d3e75cf3875c2c2b458ee933947aa118c94509b911c85da2f21d8a3bd9820ae8.png

Stacked vertical bar plots#

Requires StatsPlots package. groupedbar(data, bar_position = :stack)

groupedbar([measles mumps chickenPox],
        bar_position = :stack,
        bar_width=0.7,
        xticks=(1:12, ticklabel),
        label=["measles" "mumps" "chickenPox"])
_images/20b9cfa2536e28fc1af89882441db6b905d570039549e34dacfc510da0c6233f.png

Horizontal Bar Plot#

bar(data, orientation=:h)

bar(1:12, orientation=:h, yticks=(1:12, ticklabel), yflip=true)
_images/3b3e7bbf5a942c21234f2461b1a33628e0b6044d737bf45dcb651c9aa772a38f.png

Categorical Histogram Plot#

status = ["Poor", "Fair", "Good", "Excellent"]
data = sample(status, Weights([1,1,2,2]), 100)
datamap = countmap(data)

bar((x -> datamap[x]).(status), xticks=(1:4, status), legend=nothing)
_images/c280f5abd95238caff8bf7fb5bbb7a6acef895bb1b3eac122cfd024cab1e9ca9.png

Histogram#

histogram(data, bins=N)

using Plots

x = randn(1000)
y = randn(1000)
z = randn(1000)

histogram(x, bins=20, alpha=0.4, label="A")
histogram!(y, bins=20, alpha=0.4, label="B")
histogram!(z, bins=20, alpha=0.4, label="C")
_images/746124d8fb92aa91b87a38ba2e5789e213cbab285750ae9f35412e27330a215f.png

Box plots#

using Plots
using StatsPlots
using Statistics

n = 30
science = rand(1:10, n)
boxplot(science, label="science")
_images/0235e341d2ce428b2dc6d90c2f21424ae2cf1f9cd81a0bc547c6909b00b9c33c.png
english = rand(1:10, n)
boxplot([science english], label=["science" "english"])
_images/6c3de79c7ba53673c211b4147f3ad965898dce637f0c0a6e8647d026ac5f95c1.png

Contour Plots#

Over a function#

contour(xs, ys, f) where z = f(x, y)

using Plots

xs = range(0, stop=2, length=50)
ys = range(0, stop=2, length=50)
f = (x , y) -> x^2 + y^2

contour(xs, ys, f)
_images/2d9f46985d4d6c6a48f1c592748bf4a31f835731fe28e35495e32eaad4d90941.png

Nullclines#

Nullclines (zero-growth isoclines) are curves where the derivative of one variable is zero. Nullclines are used to analyze evolution and stability of ODE systems.

using Plots

dx = (x, y) -> 3x - 1.4x*y
dy = (x, y) -> -y + 0.8x*y

myrange = -1:0.01:4

contour(myrange, myrange, dx, levels=[0], color=:red, legend=false)
contour!(myrange, myrange, dy, levels=[0], color=:blue, legend=false)
_images/864c60594600a347d7bd09d3d0a18949de10efb25e6ac45162793dadbc39990b.png

Contour plot over an array#

contour(x1d, y1d, xy2d)

# Notice xs is transposed
# This makes zz a 2D matrix
zz = f.(xs', ys)
contour(xs, ys, zz)
_images/2d9f46985d4d6c6a48f1c592748bf4a31f835731fe28e35495e32eaad4d90941.png

Filled Contour Plots#

  • contour(xs, ys, f, fill=true)

  • contourf(xs, ys, f)

contour(0:0.01:5, 0:0.01:5, (x, y) -> sin(3x) * cos(x+y), xlabel="x", ylabel="y", fill=true)
_images/c83294162260fcf2d8111f18e7b88e160259bb7166453a1a91c762b2ae75f5cf.png

Datetime plot#

  • Use Dates package and Data data type

  • Customize ticks

using Plots
using Dates

days = 31
position = cumsum(randn(days))
x = Date(2018,1,1):Day(1):Date(2018,1,31)
ticks = [x[i] for i in 1:5:length(x)]

plot(x, position,
     xlabel="Date",
     ylabel="Position",
     title="Track of random walker",
	 legend=nothing,
     xticks=ticks,
     xrotation=45,
     bottom_margin=10Plots.mm,
     left_margin=5Plots.mm)
_images/388d1fe976ca70aedbd212190da2f5a31986facc2bc6a66b74a286e4bb9826e5.png

Error bar#

plots(..., xerr=xerr, yerr=yerr)

using Plots

f = x -> 2 * x + 1
x = 0:0.1:2
n = length(x)
y = f.(x) + randn(n)

plot(x, y,
    xerr=0.1 * rand(n),
    yerr=rand(n),
	legend=nothing)
_images/8e7508a32eadc7e14bc5d4024f294a57397204d398283fd56a873658f4b78269.png

Heatmap#

heatmap(data)

using Plots

a = rand(5,5)
xlabel = string.(collect('A':'E'))
ylabel = string.(collect('a':'e'))
heatmap(a, xticks=(1:5, xlabel),
           yticks=(1:5, ylabel),
           aspect_ratio=:equal)

fontsize = 15
nrow, ncol = size(a)

# Add number annotations to plots
ann = [(i,j, text(round(a[i,j], digits=2), fontsize, :white, :center))
            for i in 1:nrow for j in 1:ncol]

annotate!(ann, linecolor=:white)
_images/14131d7b6e29e2ca408002eb02b5fb7bf5bb02adec532ac7ddff9e52deb783ac.png

Line plots#

using Plots
plot(x, y)
plot(f, xRange)
plot(f, xMin, xMax)
plot(x, [y1 y2])
using Plots

# Data
x = 0:0.1:2pi
y1 = cos.(x)
y2 = sin.(x)

# Creating a plot in steps
plot(x, y1, color="blue", linewidth=3)
plot!(x, y2, color="red", line=:dash)
title!("Trigonometric functions")
xlabel!("angle")
ylabel!("sin(x) and cos(x)")
plot!(xlims=(0,2pi), ylims=(-2, 2), size=(600, 600))
_images/37dce28774819d46a638fd8917f8dba24f36fdda1cecd12017cc900bf85493cc.png
plot(x, y1, line=(:blue, 3))
plot!(x, y2, line=(:dash, :red))

# Use keywords to set the options all in one plot() call
plot!(title="Trigonometric functions",
        xlabel="angle",
        ylabel="sin(x) and cos(x)",
        xlims=(0,2pi), ylims=(-2, 2), size=(600, 600))
_images/37dce28774819d46a638fd8917f8dba24f36fdda1cecd12017cc900bf85493cc.png

Plotting multiple series#

  • One row = one observation

  • One column = one species

time = 30
walker1 = cumsum(randn(time))
walker2 = cumsum(randn(time))
walker3 = cumsum(randn(time))
walker4 = cumsum(randn(time))
walker5 = cumsum(randn(time))
plot(1:time, [walker1 walker2 walker3 walker4 walker5],
    xlabel="time", ylabel="position",
    label=["walker1" "walker2" "walker3" "walker4" "walker5"],
    legend=:topleft
)
_images/f15a5d5c916cc798d5d76f539a952902ebfd073d722c5ed9dec87bb269a72fbb.png

Parametric plots#

Functions can be plotted directly.

  • plot(f, xmin, xmax)

  • plot(f, range_of_x)

  • plot(fx(t), fy(t), range_of_t)

let
    f = x -> 5exp(-x^2)
    g = x -> x^2
    plot([f, g], -3, 3, label=["f" "g"], legend=:top)
end
_images/43028b4d1790ae80d814c6dc30b1ab8ed4c69d4dc6b72d00401c0863b3bddaa6.png
plot(sin, t->sin(2t), 0, 2π, leg=false, fill=(0,:orange))
_images/553918fadf7a0faf3184dcbf74db8607075a3e4d1b1a5f4516020c2b0ec4ebef.png

3D line plot#

Similar to 2D line plots.

plot(fx(t), fy(t), fz(t), tmin, tmax [, kwargs...])

plot(cos, sin, t -> sin(5t), 0, 2pi, legend=nothing)
_images/6a744ea425b5ad4473f6a800bc453123b179fd95efcefce56833d7ffa9121cea.png

Line colors#

plot(x, y, c=color)

using Plots
using SpecialFunctions

x = 0:0.2:10
y0 = besselj.(0,x)
y1 = besselj.(1,x)
y2 = besselj.(2,x)
y3 = besselj.(3,x)
y4 = besselj.(4,x)
y5 = besselj.(5,x)
y6 = besselj.(6,x)
colors = [:red :green :blue :cyan :magenta :yellow :black]
plot(x, [y0 y1 y2 y3 y4 y5 y6], c=colors)
_images/b802650aba53c12e6b58773738b8b57b413c316270d3cf64089780c539242b6e.png

Line styles#

using Plots
@show Plots.supported_styles()
Plots.supported_styles() = [:auto, :dash, :dashdot, :dashdotdot, :dot, :solid]
6-element Vector{Symbol}:
 :auto
 :dash
 :dashdot
 :dashdotdot
 :dot
 :solid
style = Plots.supported_styles()[2:end]
style = reshape(style, 1, length(style))
plot(x, [y0 y1 y2 y3 y4], line=(3, style))
_images/b868035eeffe239d78a7b0214927c1086c137c9b60069d09d3bde7434edd019e.png

Polar Plots#

plot(θ, r, proj=:polar)

using Plots
plot(θ -> 1 + cos(θ) * sin(θ)^2, 0, 2π, proj=:polar, lims=(0, 1.5))
_images/4f57a913160d77fbb461542827ad26d4f2fa25383da2c63f7f361903477419fe.png

Rose Plots#

plot(..., proj=:polar, line=:steppre)

n = 24
R = rand(n+1)
plot(0:2pi/n:2pi, R, proj=:polar, line=:steppre, lims=(0, 1), legend=nothing)
_images/c36596a1fbc84c7aaf2f1e430c363e538d5997f9a49603508c9b1ae589665d3b.png

Quiver Plots#

  • quiver(x1d, y1d, quiver=(vx1d, vy1d)

  • quiver(x2d, y2d, quiver=(x, y)->(u, v))

using Plots

n = 7
f = (x,y) -> hypot(x, y) |> inv

x = repeat(-3:(2*3)/n:3, 1, n) |> vec
y = repeat(-3:(2*3)/n:3, 1, n)' |> vec
vx = f.(x,y) .* cos.(atan.(y,x)) |> vec
vy = f.(x,y) .* sin.(atan.(y,x)) |> vec
quiver(x, y, quiver=(vx, vy), aspect_ratio=:equal)
_images/65534101bee6e5f8e367d71e7a5837af486780f993c3b4abf6c40289bfab82cf.png
g = (x, y) -> [f(x,y) * cos(atan(y,x)), f(x,y) * sin(atan(y,x))]
xx = [x for y in -3:(2*3)/n:3, x in -3:(2*3)/n:3]
yy = [y for y in -3:(2*3)/n:3, x in -3:(2*3)/n:3]
quiver(xx, yy, quiver=g, aspect_ratio=:equal, color=:black)
_images/80971b2b3099e4d3d3978cd49d6e0210341a52e407db968af8f140ec4c98f8ff.png

Scatter Plots#

2D Scatter Plots: scatter(xpos, ypos)

using Plots

n = 50
x = rand(n)
y = rand(n)
ms = rand(50) * 30
scatter(x, y, markersize=ms)
_images/e7e0575c6498e326c0e476930a5945ef1a3f83aabd07a3f22b41aa875e481786.png

3D Scatter Plots: scatter(xpos, ypos, zpos)

scatter(x, y, rand(n), markersize=ms)
_images/bc779a33ca2ee394df725f498efe11b087999be998173ea61bfe29f9de6da879.png

Stairstep plot#

plot(..., line=:steppre)

plot(sin.(0:0.3:2pi), line=:steppre, label="Steps")
_images/28cd249f90aa3226361e9f3741a7a739b5cd0088df5fa4ad04ddca4a80c2360b.png

Stem plot#

Known as the lollipop plot.

plot(..., line=:stem)

plot(sin.(0:0.3:2pi), line=:stem, marker=:star, markersize=20, ylims=(-1.1, 1.1), label="Stars")
_images/08c0de24bf2e78cd9b12c88f624b45137bb0fd9aceebfbf6a4ab45261b2963f0.png

Subplots#

  • plot(p1, p2, p3, ...)

  • plot(..., layout=(nrow, ncol))

  • plot(..., layout=@layout [...])

Source

using Plots

data = rand(100, 4)
100×4 Matrix{Float64}:
 0.709981   0.973362  0.516176   0.363075
 0.761391   0.388399  0.193247   0.724163
 0.75949    0.815402  0.0369112  0.137228
 0.761702   0.902961  0.330324   0.455833
 0.795277   0.416984  0.945352   0.176323
 0.586307   0.286339  0.499248   0.0763004
 0.276137   0.765012  0.594053   0.294608
 0.84172    0.687983  0.841599   0.620266
 0.847136   0.393362  0.305451   0.216803
 0.380462   0.687962  0.794865   0.127923
 ⋮                               
 0.378577   0.106089  0.691953   0.777491
 0.0571538  0.977407  0.276459   0.607869
 0.674539   0.610381  0.236658   0.662346
 0.278811   0.179141  0.604079   0.515615
 0.695049   0.514618  0.438862   0.922791
 0.924816   0.210846  0.912419   0.860384
 0.508744   0.798775  0.132198   0.429291
 0.5701     0.786537  0.709826   0.66473
 0.83062    0.233978  0.425281   0.375258

create a 2x2 grid, and map each of the 4 series to one of the subplots

plot(data, layout = 4)
_images/e1d9292179022093f0de089886d2153d95aceb0af25343af6869d70621529d24.png

More complex grid layouts can be created with the grid(…) constructor:

plot(data, layout = grid(4, 1, heights=[0.1 ,0.4, 0.4, 0.1]))
_images/3ce74d288eb19ad5f626a74890630688c253ab984dce4532fb797383a7b12379.png

Adding titles and labels

plot(data, layout = 4, label=["a" "b" "c" "d"], title=["1" "2" "3" "4"])
_images/0a37f5765406a817e68dd3363d3a3e2e5f187732f93e05bad5ea14f8b1288607.png

Use @layout macro

l = @layout [
    a{0.3w} [grid(3,3)
             b{0.2h}  ]
]
plot(
    rand(10, 11),
    layout = l, legend = false, seriestype = [:bar :scatter :path],
    title = ["($i)" for j in 1:1, i in 1:11], titleloc = :right, titlefont = font(8)
)
_images/d11f71afff2fa721c715ea92cde065320f568e5b46213fbb79a99e0699bce43a.png

Use _ to ignore a spot in the layout

plot((plot() for i in 1:7)..., layout=@layout([_ ° _; ° ° °; ° ° °]))
_images/472ad30b8b8b38bfdffc6d0aa47090b9e5064886fecc81f5cc2fda037c6668fa.png

Build subplots one by one#

p1 = plot(sin, 0, 2pi, xlabel="x1")
p2 = plot(cos, 0, 2pi, xlabel="x2")
p3 = histogram(randn(1000), xlabel="x3")
p4 = plot(x->exp(-x^2), -3, 3, xlabel="x4")
plot(p1, p2, p3, p4)
_images/747a5f8d3cd78343c134abc8ede226429ad02f393c6c8d3ede2c87edeece01dd.png

Surface plots#

  • surface(x, y, z)

  • surface(x, y, (x,y)->z)

  • plot(x, y, z, linetype=:surface)

  • plot(x, y, z, linetype=:wireframe)

using Plots

x = y = -10:10
f = (x , y) -> x^2 + y^2

surface(x, y, f)
_images/284ce5a223803d5d4e797dbda93c31b1710ac52740e49dbc3e759ba9421b3035.png

surface style

plot(x, y, f, linetype=:surface)
_images/284ce5a223803d5d4e797dbda93c31b1710ac52740e49dbc3e759ba9421b3035.png

wireframe style

plot(x, y, f, linetype=:wireframe)
_images/71d760d3141d6b9761f32420be8efa6eae3aee85518cbb0305c6abef41713585.png

Twin Y Axis#

plot!(twinx())

using Plots

plot(randn(100), ylabel="y1", leg=:topright)
plot!(
    twinx(), randn(100)*10,
    c=:red,
    ylabel="y2",
    leg=:bottomright,
    size=(600, 400)
)
plot!(right_margin=15Plots.mm)
_images/625a1ee77aea780302fbcda4a45f486a562f24890293e2d03fa6d1ace9065743.png

Animations#

using Plots

define the Lorenz attractor

Base.@kwdef mutable struct Lorenz
    dt::Float64 = 0.02
    σ::Float64 = 10
    ρ::Float64 = 28
    β::Float64 = 8/3
    x::Float64 = 1
    y::Float64 = 1
    z::Float64 = 1
end

function step!(l::Lorenz)
    dx = l.σ * (l.y - l.x)
    dy = l.x * (l.ρ - l.z) - l.y
    dz = l.x * l.y - l.β * l.z
    l.x += l.dt * dx
    l.y += l.dt * dy
    l.z += l.dt * dz
end

attractor = Lorenz()
Main.var"##230".Lorenz(0.02, 10.0, 28.0, 2.6666666666666665, 1.0, 1.0, 1.0)

initialize a 3D plot with 1 empty series

plt = plot3d(
    1,
    xlim = (-30, 30),
    ylim = (-30, 30),
    zlim = (0, 60),
    title = "Lorenz Attractor",
    marker = 2,
)

plt
_images/0bff5704174bd903189ab222f5ed56b546f68d1219e6c38df1eb02877db10e4d.png

pushing new points to the plot

anim = @animate for i=1:1500
    step!(attractor)
    push!(plt, attractor.x, attractor.y, attractor.z)
end

mp4(anim, fps = 15)
[ Info: Saved animation to /tmp/jl_j8Dkxyx8BO.mp4

This notebook was generated using Literate.jl.

previous

PythonPlot.jl gallery

Contents
  • Attributes
    • Ticks size and properties
    • No axis
    • Log scale for axes
    • Axis range
    • Scientific notation
    • Flip
    • Aspect ratio
    • Fonts
  • Bar plots
    • Grouped vertical bar plots
    • Stacked vertical bar plots
    • Horizontal Bar Plot
    • Categorical Histogram Plot
  • Histogram
  • Box plots
  • Contour Plots
    • Over a function
    • Nullclines
    • Contour plot over an array
    • Filled Contour Plots
  • Datetime plot
  • Error bar
  • Heatmap
  • Line plots
    • Plotting multiple series
    • Parametric plots
  • 3D line plot
    • Line colors
    • Line styles
  • Polar Plots
    • Rose Plots
  • Quiver Plots
  • Scatter Plots
  • Stairstep plot
  • Stem plot
  • Subplots
    • Build subplots one by one
  • Surface plots
  • Twin Y Axis
  • Animations

By Wen-Wei Tseng

© Copyright 2022.