Skip to main content

PubMatrixPython

PyPI Python test-coverage codecov License

Python port of the PubMatrixR R package.

Give it two lists of search terms. For every pair, it asks PubMed or PMC how many publications mention both, and hands back the counts as a table. Useful when you want to know which gene/disease combinations the literature has actually covered, and which nobody has looked at.

Based on: Becker et al. (2003) PubMatrix: a tool for multiplex literature mining. BMC Bioinformatics 4:61. https://doi.org/10.1186/1471-2105-4-61


What it does

Queries every combination of terms from your two lists against MEDLINE abstracts (pubmed) or full text (pmc) through the NCBI E-utilities. Results come back as a pandas.DataFrame and can be exported to CSV or ODS, where each cell links to the PubMed search that produced it.

You can restrict searches to a publication year range, pass terms directly or read them from a text file, and plot the result as a heatmap with optional clustering. Long runs show a progress bar.

Two things worth knowing for larger matrices: n_workers runs queries in parallel while staying under the NCBI rate limit, and cache_dir keeps results on disk so a re-run does not re-query terms it has already seen.


Installation

pip

pip install pubmatrixpython

uv

uv add pubmatrixpython

pixi

pixi add --pypi pubmatrixpython

For ODS export you also need odfpy:

pip install pubmatrixpython[ods]

Development setup

Requires uv. Install it with:

curl -LsSf https://astral.sh/uv/install.sh | sh

Clone and install dependencies:

git clone <repo-url>
cd PubMatrixPython
uv sync --all-groups

Running the notebooks

Run every uv command from the project root, where pyproject.toml lives. It will not resolve the environment from anywhere else.

cd /path/to/PubMatrixPython
uv run jupyter lab

The notebooks are in notebooks/.

Notebook What it covers
01_pubmatrix.ipynb Basic queries, date filtering, PMC database, file input, CSV export, heatmap visualisation
02_example_wnt.ipynb Full worked example: WNT genes × obesity genes

Quick start

In the REPL

uv run python
from pubmatrix import pubmatrix, plot_pubmatrix_heatmap

A = ["WNT1", "WNT2", "CTNNB1"]
B = ["obesity", "diabetes", "cancer"]

result = pubmatrix(A=A, B=B)
print(result)

plot_pubmatrix_heatmap(result, title="WNT × Disease")

Running a script

Create a file my_analysis.py:

from pubmatrix import pubmatrix, plot_pubmatrix_heatmap

A = ["WNT1", "WNT2", "WNT3A", "WNT5A", "CTNNB1"]
B = ["obesity", "diabetes", "cancer", "inflammation"]

result = pubmatrix(
    A=A,
    B=B,
    database="pubmed",
    daterange=[2010, 2024],   # optional date filter
    outfile="results",
    export_format="csv",      # saves results.csv with PubMed hyperlinks
)

print(result)

plot_pubmatrix_heatmap(
    result,
    title="WNT Genes × Disease",
    filename="heatmap.png",   # saves to file instead of displaying
)

Run it with:

uv run python my_analysis.py

Loading terms from a file

Create terms.txt:

WNT1
WNT2
CTNNB1
#
obesity
diabetes
cancer
from pubmatrix import pubmatrix_from_file

result = pubmatrix_from_file("terms.txt")
print(result)

Blank lines are ignored. If the # is missing, or either side of it is empty, you get an error naming the file.


API reference

pubmatrix(A, B, ...)

Queries PubMed and returns a pandas.DataFrame with rows from B and columns from A.

pubmatrix(
    A,                    # list of str — column terms
    B,                    # list of str — row terms
    api_key=None,         # NCBI API key (10 req/s vs 3 req/s default)
    database="pubmed",    # "pubmed" or "pmc"
    daterange=None,       # e.g. [2015, 2024]
    outfile=None,         # base filename for export
    export_format=None,   # None | "csv" | "ods"
    n_tries=3,            # attempts per query, exponential backoff between them
    n_workers=1,          # parallel workers for concurrent queries
    timeout=30,           # HTTP request timeout in seconds
    cache_dir=None,       # directory to cache query results on disk
)

pubmatrix_from_file(filepath, ...)

Reads terms from a plain-text file, then hands them to pubmatrix() along with any other arguments you pass.

File format:

WNT1
WNT2
#
obesity
diabetes
result = pubmatrix_from_file("terms.txt", database="pubmed")

plot_pubmatrix_heatmap(matrix, ...)

Plots the co-occurrence counts, clustering rows and columns unless you turn that off. Returns (fig, ax).

fig, ax = plot_pubmatrix_heatmap(
    matrix,                                        # DataFrame from pubmatrix()
    values="raw",                                  # "raw" | "row_pct" | "relative"
    title="PubMatrix Co-occurrence Heatmap",
    cluster_rows=True,
    cluster_cols=True,
    show_numbers=True,
    color_palette=None,                            # list of hex colours
    filename=None,                                 # save to PNG if set
    width=10, height=8,
    scale_font=True,
    show=False,                                    # call plt.show() after plotting
)

values selects what each cell shows:

Value Cell contents
"raw" (default) The co-occurrence counts themselves
"row_pct" Each count as a percentage of its row total
"relative" count / (row_total + col_total - count) × 100

A warning about "relative": it is not a Jaccard index, and its numbers do not carry between runs. The totals in that formula are sums over whichever partner terms happen to be in your matrix, not the publication count for each term on its own, so adding one unrelated term shifts the value in every existing cell. A real Jaccard index would need the single-term counts, and pubmatrix() never fetches those. Compare cells within one fixed matrix and nothing beyond that.

pubmatrix_heatmap(matrix, title=..., values="raw")

Quick wrapper around plot_pubmatrix_heatmap() with all defaults. Returns (fig, ax).


Output files

Set outfile and export_format and the results are written to {outfile}.csv or {outfile}.ods. Every cell holds the publication count as a hyperlink to the search that produced it. Rows are named from B, columns from A.

ODS export needs the optional odfpy dependency. See Installation.


NCBI API key

Without a key: 3 requests/second. With a key: 10 requests/second. Get one at https://account.ncbi.nlm.nih.gov/

result = pubmatrix(A=A, B=B, api_key="YOUR_KEY_HERE")

More documentation


License & citation

MIT licensed. See LICENSE.md.

If you use PubMatrixPython in your research, please cite:

Becker KG, Hosack DA, Dennis G Jr, Lempicki RA, Bright TJ, Cheadle C, Engel J. PubMatrix: a tool for multiplex literature mining. BMC Bioinformatics. 2003 Dec 10;4:61. https://doi.org/10.1186/1471-2105-4-61

Developers:

  • Tyler Laird (Author, original PubMatrixR)
  • Enrique Toledo (Author, maintainer)

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pubmatrixpython-0.3.0.tar.gz (236.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pubmatrixpython-0.3.0-py3-none-any.whl (14.7 kB view details)

Uploaded Python 3

File details

Details for the file pubmatrixpython-0.3.0.tar.gz.

File metadata

  • Download URL: pubmatrixpython-0.3.0.tar.gz
  • Upload date:
  • Size: 236.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for pubmatrixpython-0.3.0.tar.gz
Algorithm Hash digest
SHA256 8a61fba82f36916673247a370ea420f90d13ba34f2090a3e5eae47144449daf3
MD5 2d92a6aa3254b2042d3c06b866b1d6cb
BLAKE2b-256 1854fad96663e3c89ac7eed2d5bc63c0292c15f3917ff4e6cae68f05feda638e

See more details on using hashes here.

Provenance

The following attestation bundles were made for pubmatrixpython-0.3.0.tar.gz:

Publisher: publish.yml on ToledoEM/PubMatrixPython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pubmatrixpython-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: pubmatrixpython-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 14.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for pubmatrixpython-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 be8c15552aa7a3aafa8dcc19d6d9b963d1223f4cdbc607f3856126dc8977c102
MD5 fb79a0858d4ba99402d4785e1e590087
BLAKE2b-256 0cb7d3b09f9ed366385c4e908edaa08a61ad48baf6353c0a55ca93e6fe9090ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for pubmatrixpython-0.3.0-py3-none-any.whl:

Publisher: publish.yml on ToledoEM/PubMatrixPython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 files

0.2.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page