SciencePlots: Matplotlib Styles for Scientific Figures
Matplotlib styles for scientific plotting
At a glance
- What is it?
- SciencePlots packages ready-made Matplotlib style sheets for papers, theses and presentations, including journal-specific looks for IEEE and Nature. It is a thin layer over Matplotlib, so the main costs are a LaTeX dependency and style cascade order.
- Who is it for?
- Adopt SciencePlots if you already produce figures in Matplotlib and want journal-shaped defaults without hand-tuning rcParams. Skip it if you need interactive or web output, or if you cannot install LaTeX and CJK fonts on the machine that renders the figures.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 100 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The problem SciencePlots solves for paper and thesis figures
Matplotlib's defaults are tuned for screen display, not for print. Line widths, font sizes, figure dimensions and tick direction all need adjusting before a plot looks at home in a two-column paper. Doing that by hand means maintaining a block of rcParams in every project, and re-deriving it when a co-author or a new journal template disagrees.
SciencePlots turns those settings into named style sheets that Matplotlib loads through its normal style mechanism. The README describes the repository as holding "Matplotlib styles to format your figures for scientific papers, presentations and theses." The audience is anyone who writes plotting code in Python and has to hand figures to a journal, a thesis committee or a slide deck.
The scope is deliberately narrow. There is no new plotting API, no wrapper object, no figure class. If your code already calls plt.plot, the only change is a style name. That keeps the migration cost low, and it also means SciencePlots cannot fix anything Matplotlib itself does badly.
How the style sheets cascade, and why order matters
The mechanism is Matplotlib's style resolution. A style sheet is a file of rcParams; when you call plt.style.use with a list, Matplotlib applies them left to right, so later entries override earlier ones. The README states this directly: with `plt.style.use(['science','ieee'])`, "the ieee style will override some of the parameters from the science style in order to configure the plot for IEEE papers (column width, fontsizes, etc.)."
That cascade is the whole architecture, and it is also the main thing to get wrong. `['science','ieee']` and `['ieee','science']` are not the same figure. The first gives you the science look narrowed to an IEEE column; the second lets the base style overwrite the journal-specific settings.
The repository layout reflects this: the styles live under src/, the example script is examples/plot-examples.py, and the rendered outputs sit in examples/figures/. The pyproject.toml lists matplotlib as the only runtime dependency, which is consistent with a package that ships configuration rather than code. Optional extras are test dependencies (pytest, numpy) under the `test` extra.
Since version 2.0.0 the import is required. The README carries an explicit warning: "As of version 2.0.0, you need to add `import scienceplots` before setting the style (`plt.style.use('science')`)." Without it, Matplotlib will not find the style name and the call fails.
Installing SciencePlots and drawing a first IEEE-ready figure
The README gives four install routes. The most direct is pip from PyPI, and conda-forge is supported as an alternative channel.
pip install SciencePlotsConda users get the same release from the conda-forge channel:
conda install -c conda-forge scienceplotsIf you want the current master branch rather than the latest release, the README offers a git install, and for a local working copy it documents cloning and installing in editable mode:
git clone https://github.com/garrettj403/SciencePlots.git
cd SciencePlots
pip install -e .With the package installed, a minimal script imports scienceplots, sets the style and then plots as usual. The import must come before the style call.
import matplotlib.pyplot as plt
import scienceplots
plt.style.use('science')
plt.plot([0, 1, 2], [0, 1, 4])
plt.show()To target an IEEE paper, pass both names in order. The ieee entry comes second so that its column width and font sizes win.
plt.style.use(['science', 'ieee'])If you only want the style for one figure and not the rest of the session, the README shows the context-manager form:
with plt.style.context('science'):
plt.figure()
plt.plot(x, y)
plt.show()One prerequisite is easy to miss. The README states that "SciencePlots requires Latex" and links to separate installation instructions. If LaTeX is not on the machine, the default science style will not render text through it, and the failure surfaces at draw time rather than at import.
Journal styles, color cycles and non-Latin scripts
Beyond the base science style, the repository ships journal-oriented variants. The ieee style is aimed at IEEE papers, and the README notes the reason: "IEEE requires figures to be readable when printed in black and white. The ieee style also sets the figure width to fit within one column of an IEEE paper." That is a print constraint, not an aesthetic one, and it is the kind of thing that is tedious to rediscover per submission. The nature style targets Nature articles, where the README notes that Nature recommends sans-serif fonts.
Color handling is a separate axis. The README lists a bright cycle described as color blind safe and a high-vis cycle, plus Paul Tol's discrete rainbow sets exposed as `discrete-rainbow-<n>`, where n runs from 1 to 23 inclusive. The numbering matters: `discrete-rainbow-15` and `discrete-rainbow-8` are different palettes, so the style name encodes how many distinct colors you get.
For non-Latin text, the README lists support for Traditional Chinese, Simplified Chinese, Japanese, Korean, Russian and Turkish, with the gallery showing `science` combined with `no-latex` and `cjk-tc-font`. Note the combination: the CJK examples pair a font style with no-latex, which sidesteps the LaTeX text path. The README also warns that CJK fonts must be installed separately, and the pyproject keywords include cjk-fonts, so the font dependency is a known part of the package rather than an afterthought.
Where SciencePlots stops being the right tool
The LaTeX requirement is the sharpest limitation. It is not optional for the default styles, and the README's requirement note points to a wiki page for installing it. On a shared CI runner, a locked-down cluster node or a colleague's laptop, that is a real installation step with its own failure modes.
CJK output has a second dependency on top: the fonts themselves are installed separately. A style name alone will not produce Chinese or Japanese labels if the font is absent.
Cascade order is the other trap. Because styles are plain rcParams applied in sequence, a combination the maintainers have not tested can produce a figure that is technically valid and visually wrong. Nothing in the package validates the pairing for you.
Finally, this is a print-oriented package. If your target is an interactive dashboard, a web chart or an animated figure, the journal column widths and LaTeX text rendering are irrelevant at best. Matplotlib can do those things, but SciencePlots is not aimed at them, and the README's framing is papers, presentations and theses throughout.
SciencePlots against Proplot and Ultraplot
The alternative most often mentioned alongside SciencePlots is Proplot, with Ultraplot appearing as a related successor project. The difference is architectural rather than cosmetic.
SciencePlots ships style sheets and nothing else. You keep the Matplotlib API you already know, and the package's contribution is a set of rcParams values. That means zero learning curve and zero lock-in: removing the import and the style call returns you to stock Matplotlib with no code rewrite.
Proplot and Ultraplot take the other route. They wrap or extend Matplotlib with their own figure and axes interfaces, adding layout and labeling conveniences on top. That buys more control over complex multi-panel layouts, at the cost of adopting a different API surface and depending on that project's compatibility with your Matplotlib version.
A practical way to choose: if your figures are ordinary single- or few-panel plots and the complaint is that they look wrong in print, SciencePlots is the smaller change. If the complaint is that assembling and labeling a grid of panels is painful, a wrapper library addresses a problem SciencePlots does not attempt to solve.
Maintenance, licence and the cost of upgrading
The repository is not archived, and the last push was on 2026-06-23, the same day as the 2.2.2 release. The preceding releases are 2.2.1 on 2026-06-23 and 2.2.0 on 2025-11-20. The pyproject classifier reads "Development Status :: 6 - Mature", and the only runtime dependency is matplotlib, with requires-python set to >=3.8. A package whose entire payload is configuration has little surface area to break, which is the main reason upgrade cost tends to be low.
The upgrade cost that does exist is concentrated in two places. The 2.0.0 change requiring `import scienceplots` is the documented example: code written against older versions fails until the import is added. And because style sheets are rcParams, a release that adjusts a style will change your figures without changing your code, which you notice when a figure looks different rather than when a test fails.
On licensing, the project is MIT and pyproject.toml declares `license = "MIT"` with a LICENSE file included via license-files. That is permissive as far as the package itself goes. Two adjacent items are worth checking separately and are not covered by the MIT grant: the fonts you install for CJK output carry their own licences, and the journal styles encode conventions from publishers such as IEEE and Nature. Whether a given colour cycle or font is acceptable in a specific submission is a question for that venue's author guidelines, not something the repository can settle. This is a description of what the files declare, not legal advice.
Editorial conclusion
Adopt SciencePlots if you already produce figures in Matplotlib and want journal-shaped defaults without hand-tuning rcParams. Skip it if you need interactive or web output, or if you cannot install LaTeX and CJK fonts on the machine that renders the figures. Before relying on it, verify two things in your own environment: that `plt.style.use('science')` runs without a LaTeX error, and that your chosen style combination produces the column width and font sizes your target venue expects.
Frequently asked questions
How do I use SciencePlots in a Python script?
Import scienceplots before setting the style, then call plt.style.use with one or more style names. Since version 2.0.0 the import is required, and the README warns that without it the style will not be found.
How do I install SciencePlots?
The README gives pip install SciencePlots for the PyPI release, conda install -c conda-forge scienceplots for the conda-forge channel, and a git install for the latest commit. You can also clone the repository and run pip install -e . for a local editable copy.
How does SciencePlots differ from plain Matplotlib?
SciencePlots does not replace Matplotlib. It ships style sheets that Matplotlib loads through its existing style mechanism, so the plotting API stays the same and the package only changes rcParams such as fonts, sizes and figure widths.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/garrettj403-scienceplots)