Skip to main content
Have a personal or library account? Click to login
Plots.jl – A User Extendable Plotting API for the Julia Programming Language Cover

Plots.jl – A User Extendable Plotting API for the Julia Programming Language

Open Access
|Feb 2023

Figures & Tables

Table 1

Contributors sorted by number of commits.

NAMEAFFILIATIONROLEORCID
Tom BreloffHeadlands TechnologiesCreatormissing
Daniel SchwabenederTU WienProjectLeader0000-0002-0412-0777
Michael Krabbe BorregaardGLOBE Institute, University of CopenhagenProjectLeader0000-0002-8146-8435
Simon ChristLeibniz Universität HannoverProjectLeader0000-0002-5866-1472
Josef HeinenForschungszentrum JülichProjectMember0000-0001-6509-1925
YuvalmissingOthermissing
Andrew PalugniokmissingProjectMembermissing
Simon Danisch@beacon-biosignalsOthermissing
Pietro VertechiVeos Digital (https://veos.digital/)ProjectMembermissing
Zhanibek OmarovKorea Advanced Inst. of Science and Technology (KAIST)ProjectMember0000-0002-8783-8791
Thatcher ChamberlinmissingOthermissing
@ma-laforgemissingProjectMembermissing
Christopher RackauckasMassachusetts Institute of TechnologyOther0000-0001-5850-0663
Oliver SchulzMax Planck Institute for PhysicsOthermissing
Sebastian Pfitzner@JuliaComputingOthermissing
Takafumi ArakakimissingOthermissing
Amin YahyaabadiUniversity of ManitobaOthermissing
Jack DevinemissingOthermissing
Sebastian PechmissingOthermissing
Patrick Kofod Mogensen@JuliaComputingOther0000-0002-4910-1932
Samuel S. WatsonmissingOthermissing
Naoki SaitoUC DavisOther0000-0001-5234-4719
Benoit PasquierUniversity of Southern California (USC)Other0000-0002-3838-5976
Ronny BergmannNTNU TrondheimOther0000-0001-8342-7218
Andy NowackiUniversity of LeedsOther0000-0001-7669-7383
Ian ButterworthmissingOthermissing
David GustavssonLund UniversityOther0000-0002-0195-475X
Anshul SinghviColumbia UniversityOther0000-0001-6055-1291
david-macmahonmissingOthermissing
Fredrik EkremissingOthermissing
Maaz Bin Tahir SaeedmissingOthermissing
Kristoffer CarlssonmissingOthermissing
Will KearneymissingOthermissing
Niklas KorsbomissingOthermissing
Miles LucasmissingOthermissing
@GodisemomissingOthermissing
Florian OswaldmissingOthermissing
Diego Javier ZeamissingOthermissing
@WillRammissingOthermissing
Fedor BezrukovmissingOthermissing
Spencer LyonmissingOthermissing
Darwin DarakanandamissingOthermissing
Lukas HauertmannmissingOthermissing
Huckleberry FebbomissingOthermissing
@H-M-HmissingOthermissing
Josh DaymissingOthermissing
@wfgramissingOthermissing
Sheehan OlvermissingOthermissing
Jerry LingmissingOthermissing
Jks LiumissingOthermissing
Seth AxenmissingOthermissing
@o01egmissingOthermissing
Sebastian Micluța-CâmpeanumissingOthermissing
Tim HolymissingOthermissing
Tony KelmanmissingOthermissing
Antoine LevittmissingOthermissing
Iblis LinmissingOthermissing
Harry ScholesmissingOthermissing
@djsegalmissingOthermissing
Goran NakerstmissingOthermissing
Felix HagemannmissingOthermissing
Matthieu GomezmissingOthermissing
@biggsbiggsbymissingOthermissing
Jonathan AndersonmissingOthermissing
Michael KrausmissingOthermissing
Carlo LucibellomissingOthermissing
Robin DeitsmissingOthermissing
Misha MkhasenkomissingOthermissing
Benoît LegatmissingOthermissing
Steven G. JohnsonmissingOthermissing
John VerzanimissingOthermissing
Mattias FältmissingOthermissing
Rashika KarkimissingOthermissing
Morten PiibelehtmissingOthermissing
Filippo VicentinimissingOthermissing
David AnthoffmissingOthermissing
Leon WabekemissingOthermissing
Yusuke KominamimissingOthermissing
Oscar DowsonmissingOthermissing
Max GmissingOthermissing
Fabian GreimelmissingOthermissing
JérémymissingOthermissing
Pearl LimissingOthermissing
David P. SandersmissingOthermissing
Asbjørn Nilsen RisethmissingOthermissing
Jan WeidnermissingOthermissing
@jakkor2missingOthermissing
Pablo ZubietamissingOthermissing
Hamza Yusuf ÇakırmissingOthermissing
John RinehartmissingOthermissing
Martin BielmissingOthermissing
Moritz SchauermissingOthermissing
Mosè GiodanomissingOthermissing
@olegshtchmissingOthermissing
Leon ShenmissingOthermissing
Jeff FesslermissingOthermissing
@hustfmissingOthermissing
Asim H DarmissingOthermissing
@8uurgmissingOthermissing
Abel SiqueiramissingOthermissing
Adrian DawidmissingOthermissing
Alberto LusianimissingOthermissing
Balázs MezeimissingOthermissing
Ben IdemissingOthermissing
Benjamin LungwitzmissingOthermissing
Bernd RiedererUniversity of GrazOther0000-0001-8390-0087
Christina LeemissingOthermissing
Christof StockermissingOthermissing
Christoph FinkensiepmissingOthermissing
@Cornelius-GmissingOthermissing
Daniel HøeghmissingOthermissing
Denny BiasiollimissingOthermissing
Dieter CastelmissingOthermissing
Elliot SabamissingOthermissing
Fengyang WangmissingOthermissing
Fons van der PlasmissingOthermissing
Fredrik Bagge CarlsonmissingOthermissing
Graham SmithmissingOthermissing
Hayato IkomamissingOthermissing
Hessam MehrmissingOthermissing
@InfiniteChaimissingOthermissing
Jack DunnmissingOthermissing
Jeff BezansonmissingOthermissing
Jeff EldredgemissingOthermissing
Jinay JainmissingOthermissing
Johan BlåbäckmissingOthermissing
@jmertmissingOthermissing
Lakshya KhatrimissingOthermissing
Lia SiegelmannmissingOthermissing
@marekkukan-twmissingOthermissing
Mauro WerderETH ZurichOther0000-0003-0137-9377
Maxim GrechkinmissingOthermissing
Michael CawtemissingOthermissing
@milesfrainmissingOthermissing
Nicholas BauermissingOthermissing
Nicolau Leal WerneckmissingOthermissing
@nilshgmissingOthermissing
Oliver EvansmissingOthermissing
Peter GagarinovmissingOthermissing
Páll HaraldssonmissingOthermissing
Rik HuijzermissingOthermissing
Romain FranconvillemissingOthermissing
Ronan PigottmissingOthermissing
Roshan ShariffmissingOthermissing
Scott ThomasmissingOthermissing
Sebastian RollénmissingOthermissing
Seth BrombergermissingOthermissing
Siva SwaminathanmissingOthermissing
Tim DuBoismissingOthermissing
Travis DePratomissingOthermissing
Will ThompsonmissingOthermissing
Yakir Luc GagnonmissingOthermissing
Benjamin ChislettmissingOthermissing
@hhaenselmissingOthermissing
@improbable22missingOthermissing
Johannes FleckmissingOthermissing
Peter CzabanmissingOthermissing
@innerleemissingOthermissing
Mats CronqvistmissingOthermissing
Shi PengchengmissingOthermissing
@wg030missingOthermissing
Will TebbuttUniversity of CambridgeOthermissing
@t-bltgmissingOthermissing
Fred CallawaymissingOthermissing
Jan Thorben SchneidermissingOthermissing
Lee PhillipsAlogus Research CorporationOther0000-0003-4102-2460
Tom GillammissingOthermissing
Listing 1

Examples of shorthands. Full list available at https://docs.juliaplots/stable/api/#Plot-specification.

Figure 1

Example plot of the iris dataset [37] to illustrate the use of different attribute types (cf. Listing 2).

Listing 2

Code corresponding to Figure 1.

jors-11-431-g10.png
Figure 2

Plotting pipeline in Plots.jl. The separation of construction and output production enables the flexible use of different backends in the same session and helps to avoid unnecessary intermediate calculation. Created using mermaid [1].

Listing 3

Examples of input preprocessing steps in Plots.jl. All these calls are equivalent.

Listing 4

Recipe signatures.

Figure 3

Showcase of composing recipes. Plotting a ODESolution object from DifferentialEquations.jl containing Measurements from Measurements.jl will apply the recipe of DifferentialEquations.jl which will return vectors of Measurements, which will apply the recipe from Measurements.jl; yielding the solutions of the Lotka-Volterra system [2] with correct error bounds without the user having to change the callsite. Neither of these packages has code in their recipes for handling types of the other package. Full code available in Listing 9.

Listing 5

Measurements.jl recipe.

Figure 4

Overview of the Plots.jl ecosystem and its interfaces with other Julia packages. The numbers of dependents are taken from juliahub [30].

Listing 6

Plots.jl code corresponding to Figure 5.

Listing 7

PyPlot.jl code roughly corresponding to using Plots; pyplot() in line 4 of Listing 6.

Listing 8

PGFPlotsX.jl code roughly corresponding to using Plots; pgfplotsx() in line 4 of Listing 6.

Figure 5

An example figure generated from the code shown in Listing 6. Listings 7 and 8 illustrate how the generated backend code could look like for different backends. The actual backend code is more verbose and likely uses more low-level functions. These listings also show how Plots.jl provides a unified API for its backend packages, since the translation between Listings 7 and 8 is not straightforward.

Figure 6

Lines of code alive of the top ten contributors of the Plots.jl repository over time. Data created with hercules [36].

Figure 7

Lines of code alive of the top ten contributors of the Plots.jl ecosystem (Figure 4) over time. Data created with hercules [36].

Listing 9

Recipes showcase.

DOI: https://doi.org/10.5334/jors.431 | Journal eISSN: 2049-9647
Language: English
Submitted on: Jun 1, 2022
Accepted on: Jan 25, 2023
Published on: Feb 14, 2023
Published by: Ubiquity Press
In partnership with: Paradigm Publishing Services
Publication frequency: 1 issue per year

© 2023 Simon Christ, Daniel Schwabeneder, Christopher Rackauckas, Michael Krabbe Borregaard, Thomas Breloff, published by Ubiquity Press
This work is licensed under the Creative Commons Attribution 4.0 License.