ResearchPlot
Source-backed venue compliance, artifact auditing, and submission bundles for Matplotlib figures.
ResearchPlot turns a venue name into a reproducible figure target. It styles a Matplotlib figure at the requested physical width, evaluates source-backed rules, exports transactionally, audits the files that were actually written, and can assemble a submission bundle with hashes and provenance.
It is a compliance assistant, not an acceptance guarantee. Every result distinguishes verified facts from recommendations, inferences, manual requirements, and checks the software could not establish.
Install
python -m pip install researchplot-venues
The distribution is called researchplot-venues; the import and command remain
researchplot:
import researchplot as rp
ResearchPlot 1.x requires Python 3.11 or newer. It works offline at runtime, does not download fonts or templates, and does not require LaTeX. The old plotting wrappers are not shipped in 1.x. If an older project still needs them, pin the final 0.2 release in a separate environment:
python -m pip install "researchplot-venues[plots]==0.2.1"
Create and verify one figure
from pathlib import Path
import matplotlib.pyplot as plt
import researchplot as rp
target = rp.target(
"nature@2026.08.0",
role="main",
width="single",
content="line-art",
)
with target.style() as style:
fig, ax = style.subplots(aspect=0.62)
ax.plot([0, 1, 2, 3], [0, 1, 4, 9], marker="o")
ax.set(xlabel="Input", ylabel="Response")
result = target.export(fig, Path("submission") / "figure1.pdf", policy="complete")
print(result.report.verdict)
print(result.paths)
print(result.manifest_path)
plt.close(fig)
policy="complete" rejects both known required violations and unresolved required
checks. It stages output in a temporary location, audits the resulting artifact, and
starts the final commit only after the selected policy succeeds. Handled commit failures
trigger rollback. Multi-file destinations are replaced sequentially, so abrupt process
termination and non-cooperating concurrent writers remain outside that guarantee.
Build a submission bundle
submission = rp.Submission(
"nature@2026.08.0",
output_dir="submission",
policy="complete",
)
submission.add(
"figure1",
fig,
role="main",
width="single",
content="line-art",
formats=("pdf",),
alt_text="A line chart whose response rises quadratically with input.",
source_data="data/figure1.csv",
)
bundle = submission.build()
print(bundle.manifest_path)
print(bundle.passed)
The manifest records the ResearchPlot version, immutable profile coordinate and digest, full source metadata and caveats, target metadata, file SHA-256 hashes, automated findings, manual attestations, captions, alt text, and copied source-data files when provided.
Compliance has three verdicts
| Verdict | Meaning |
|---|---|
COMPLIANT |
Every applicable required rule was checked and passed. |
NON_COMPLIANT |
At least one applicable required rule failed. |
INDETERMINATE |
No required rule failed, but at least one required rule could not be established. |
Rule level and check outcome are separate. A recommendation can warn without blocking,
while inferred guidance is informational. A required SKIP is never presented as a
pass.
Export policies let CI choose the boundary:
violations: block known required failures;complete: also block unresolved required checks;off: always return evidence without blocking.
Profiles are versioned evidence
Coordinates use <profile-id>@<revision>, for example
nature@2026.08.0 or cvpr-2026@2026.08.0. Pinning the coordinate makes a paper
reproducible. An unpinned ID or friendly alias resolves to a bundled revision and
warns, so a changing default cannot go unnoticed.
The initial 1.0 catalog covers IEEE journals, Nature, generic Elsevier artwork,
NeurIPS 2026, ICML 2026, CVPR 2026, ACL 2026, PLOS Biology, and ACM acmart.
Missing official guidance remains unspecified rather than being invented. Run:
researchplot profile list
researchplot profile show nature@2026.08.0
researchplot explain figure.width.single --profile nature@2026.08.0
| Profile | Final width options |
|---|---|
ieee-journal@2026.08.0 |
88.9 / 181.864 mm |
nature@2026.08.0 |
89 / 183 mm |
elsevier-generic@2026.08.0 |
30 / 90 / 140 / 190 mm |
neurips-2026@2026.08.0 |
139.7 mm |
icml-2026@2026.08.0 |
82.55 / 171.45 mm |
cvpr-2026@2026.08.0 |
83.34375 / 174.625 mm |
acl-2026@2026.08.0 |
77 / 160 mm |
plos-biology@2026.08.0 |
132 / 190.5 mm; 66.8–190.5 mm allowed range |
acm-acmart@2026.08.0 |
Bundle metadata only; no generic width |
Profiles are bundled JSON validated against a published schema. Every rule states its applicability, strength, verification mode, official source, section or page locator, and verification date. Runtime resolution remains offline.
Check files and projects in CI
# researchplot.toml
profile = "nature@2026.08.0"
policy = "complete"
[[figures]]
path = "figures/figure1.pdf"
role = "main"
width = "single"
content = "line-art"
alt_text = "A line chart comparing the measured response across four inputs."
source_data = "data/figure1.csv"
researchplot check --config researchplot.toml
researchplot check --config researchplot.toml --format json
researchplot check --config researchplot.toml --format sarif > researchplot.sarif
researchplot bundle build --config researchplot.toml
Exit codes are stable: 0 compliant, 1 non-compliant, 2 invalid input or a
required capability failure, and 3 indeterminate. SARIF output can be uploaded to
GitHub code scanning for inline annotations.
What ResearchPlot inspects
- Exact physical width and maximum height, with explicit tolerance.
- Font family and size, line and marker sizes, and prohibited in-figure titles.
- Color-only series distinction when a profile includes the applicable accessibility rule, plus bundle alt-text presence for ACM.
- PDF page boxes across all pages, recursive font resources, embedding, and Type 3 fonts.
- SVG physical dimensions,
viewBox, text, font declarations, external references, and embedded assets. - PNG, JPEG, and TIFF dimensions, effective DPI, color mode, bit depth, ICC metadata, compression, and file size.
- EPS format,
BoundingBox, andHiResBoundingBoxdimensions.
Unobservable properties are reported as skipped. They are not guessed and do not silently pass.
Documentation
- Getting started
- Architecture and compliance model
- Profile provenance
- Project configuration and CLI
- Submission bundles
- Migration from 0.2
- Python API
Scope and safety
ResearchPlot does not interpret scientific correctness, detect manipulation, replace a
publisher's instructions, generate figures or alt text with AI, scrape templates at
runtime, or guarantee acceptance. A journal-specific instruction always overrides a
generic publisher profile. Review each finding's linked source and use
researchplot profile show to inspect all profile caveats.
ResearchPlot is MIT licensed. See CONTRIBUTING.md before proposing a profile or behavioral change, and cite the project using CITATION.cff.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file researchplot_venues-1.0.0.tar.gz.
File metadata
- Download URL: researchplot_venues-1.0.0.tar.gz
- Upload date:
- Size: 110.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f7f5ec3afc26b9bdaa732adda9112353826e42a44dfc9196653ad51a4b2f239
|
|
| MD5 |
fdad020801af3594d5237fb6c0788aaf
|
|
| BLAKE2b-256 |
e7f86e12429acb9631e9599672cbfd4ede70f587f7ceedad5a136ac2df4ca041
|
Provenance
The following attestation bundles were made for researchplot_venues-1.0.0.tar.gz:
Publisher:
release.yml on Devrajsinh-Jhala/ResearchPlot
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
researchplot_venues-1.0.0.tar.gz -
Subject digest:
6f7f5ec3afc26b9bdaa732adda9112353826e42a44dfc9196653ad51a4b2f239 - Sigstore transparency entry: 2327566337
- Sigstore integration time:
-
Permalink:
Devrajsinh-Jhala/ResearchPlot@da9b79c781fce418558d47e173ddd4bef31eede1 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/Devrajsinh-Jhala
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@da9b79c781fce418558d47e173ddd4bef31eede1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file researchplot_venues-1.0.0-py3-none-any.whl.
File metadata
- Download URL: researchplot_venues-1.0.0-py3-none-any.whl
- Upload date:
- Size: 80.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f80fd81d54e8e79ae4fbabea1f58de960d14ded2dd7d764c650b9cb5f89405f4
|
|
| MD5 |
4959c353f536abe12e4f5d9072d5160a
|
|
| BLAKE2b-256 |
7677183afa6e6f4a94d827e1a10eebe9a978f9ead044769d980cb9b6b793065e
|
Provenance
The following attestation bundles were made for researchplot_venues-1.0.0-py3-none-any.whl:
Publisher:
release.yml on Devrajsinh-Jhala/ResearchPlot
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
researchplot_venues-1.0.0-py3-none-any.whl -
Subject digest:
f80fd81d54e8e79ae4fbabea1f58de960d14ded2dd7d764c650b9cb5f89405f4 - Sigstore transparency entry: 2327566385
- Sigstore integration time:
-
Permalink:
Devrajsinh-Jhala/ResearchPlot@da9b79c781fce418558d47e173ddd4bef31eede1 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/Devrajsinh-Jhala
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@da9b79c781fce418558d47e173ddd4bef31eede1 -
Trigger Event:
push
-
Statement type: