Scientific Slides Elite
Powerful skill for build, slide, decks, presentations. Includes structured workflows, validation checks, and reusable patterns for scientific.
Scientific Slides Elite
Create compelling scientific presentations with structured slide decks, data-driven visuals, and clear narrative flow using Python-based automation. This skill covers slide generation with python-pptx, figure integration from matplotlib/plotly, template customization, speaker notes generation, and batch export for conferences and lab meetings.
When to Use This Skill
Choose Scientific Slides Elite when you need to:
- Generate presentation slides programmatically from research data and figures
- Build reusable slide templates for lab meetings, conferences, or thesis defenses
- Automate figure placement and formatting across multi-slide decks
- Create consistent, publication-quality presentations with minimal manual work
Consider alternatives when:
- You need general-purpose presentation design (use PowerPoint or Google Slides directly)
- You need interactive web-based slides (use reveal.js or RISE for Jupyter)
- You need poster layouts rather than slides (use Advanced PPTX Posters)
Quick Start
pip install python-pptx matplotlib Pillow
from pptx import Presentation from pptx.util import Inches, Pt, Emu from pptx.enum.text import PP_ALIGN from pptx.dml.color import RGBColor # Create a scientific presentation prs = Presentation() prs.slide_width = Inches(13.333) # Widescreen 16:9 prs.slide_height = Inches(7.5) # Title slide slide = prs.slides.add_slide(prs.slide_layouts[6]) # Blank layout txBox = slide.shapes.add_textbox(Inches(1), Inches(2), Inches(11), Inches(2)) tf = txBox.text_frame p = tf.paragraphs[0] p.text = "RNA-Seq Analysis of Tumor Microenvironment" p.font.size = Pt(36) p.font.bold = True p.font.color.rgb = RGBColor(0x1B, 0x3A, 0x5C) p.alignment = PP_ALIGN.CENTER # Add subtitle p2 = tf.add_paragraph() p2.text = "Department of Computational Biology — Lab Meeting 2025" p2.font.size = Pt(18) p2.font.color.rgb = RGBColor(0x66, 0x66, 0x66) p2.alignment = PP_ALIGN.CENTER # Data slide with figure import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots(figsize=(8, 5)) genes = ['TP53', 'BRCA1', 'EGFR', 'KRAS', 'MYC'] fold_changes = [3.2, -2.1, 4.5, 1.8, -1.5] colors = ['#e74c3c' if fc > 0 else '#3498db' for fc in fold_changes] ax.barh(genes, fold_changes, color=colors) ax.set_xlabel('Log2 Fold Change') ax.set_title('Differentially Expressed Genes') ax.axvline(x=0, color='black', linewidth=0.5) fig.tight_layout() fig.savefig('/tmp/deg_plot.png', dpi=200, bbox_inches='tight') plt.close() slide2 = prs.slides.add_slide(prs.slide_layouts[6]) slide2.shapes.add_picture('/tmp/deg_plot.png', Inches(3), Inches(1.5), Inches(7), Inches(5)) title_box = slide2.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(12), Inches(1)) title_box.text_frame.paragraphs[0].text = "Differential Expression Results" title_box.text_frame.paragraphs[0].font.size = Pt(28) title_box.text_frame.paragraphs[0].font.bold = True prs.save('lab_meeting.pptx') print("Presentation saved with 2 slides")
Core Concepts
Slide Building Blocks
| Component | python-pptx Class | Purpose |
|---|---|---|
| Presentation | Presentation() | Top-level container |
| Slide | prs.slides.add_slide() | Individual slide |
| TextBox | slide.shapes.add_textbox() | Text content areas |
| Picture | slide.shapes.add_picture() | Images and figures |
| Table | slide.shapes.add_table() | Data tables |
| Shape | slide.shapes.add_shape() | Geometric shapes |
| Group | slide.shapes.add_group_shape() | Grouped elements |
| Notes | slide.notes_slide | Speaker notes |
Multi-Slide Deck Builder
from pptx import Presentation from pptx.util import Inches, Pt from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN import matplotlib.pyplot as plt import numpy as np class ScientificDeck: """Builds a structured scientific presentation.""" def __init__(self, title, subtitle, width=13.333, height=7.5): self.prs = Presentation() self.prs.slide_width = Inches(width) self.prs.slide_height = Inches(height) self.colors = { 'title': RGBColor(0x1B, 0x3A, 0x5C), 'body': RGBColor(0x33, 0x33, 0x33), 'accent': RGBColor(0x27, 0xAE, 0x60), } self._add_title_slide(title, subtitle) def _add_title_slide(self, title, subtitle): slide = self.prs.slides.add_slide(self.prs.slide_layouts[6]) self._add_text(slide, title, Inches(1), Inches(2.5), Inches(11), Pt(40), bold=True, center=True) self._add_text(slide, subtitle, Inches(1), Inches(4), Inches(11), Pt(20), color=RGBColor(0x99,0x99,0x99), center=True) def add_figure_slide(self, title, fig_path, notes=""): slide = self.prs.slides.add_slide(self.prs.slide_layouts[6]) self._add_text(slide, title, Inches(0.5), Inches(0.3), Inches(12), Pt(28), bold=True) slide.shapes.add_picture(fig_path, Inches(2.5), Inches(1.3), Inches(8), Inches(5.5)) if notes: slide.notes_slide.notes_text_frame.text = notes return slide def add_bullet_slide(self, title, bullets, notes=""): slide = self.prs.slides.add_slide(self.prs.slide_layouts[6]) self._add_text(slide, title, Inches(0.5), Inches(0.3), Inches(12), Pt(28), bold=True) txBox = slide.shapes.add_textbox(Inches(1), Inches(1.5), Inches(11), Inches(5)) tf = txBox.text_frame tf.word_wrap = True for i, bullet in enumerate(bullets): p = tf.paragraphs[0] if i == 0 else tf.add_paragraph() p.text = f"• {bullet}" p.font.size = Pt(20) p.space_after = Pt(12) if notes: slide.notes_slide.notes_text_frame.text = notes return slide def _add_text(self, slide, text, left, top, width, size, bold=False, center=False, color=None): box = slide.shapes.add_textbox(left, top, width, Inches(1)) p = box.text_frame.paragraphs[0] p.text = text p.font.size = size p.font.bold = bold p.font.color.rgb = color or self.colors['title'] if center: p.alignment = PP_ALIGN.CENTER def save(self, path): self.prs.save(path) print(f"Saved {len(self.prs.slides)} slides to {path}") # Usage deck = ScientificDeck( "Metagenomic Survey of Coastal Sediments", "Marine Biology Lab — Weekly Update" ) deck.add_bullet_slide("Key Findings", [ "Alpha diversity significantly higher in intertidal zones (p < 0.001)", "Proteobacteria dominated all sample sites (42-68%)", "Novel MAGs assembled from deep sediment samples", "Antibiotic resistance genes enriched near outfall sites" ], notes="Emphasize the ARG finding — this is the most publishable result") deck.save("lab_update.pptx")
Configuration
| Parameter | Description | Default |
|---|---|---|
slide_width | Slide width in inches | 13.333 (16:9) |
slide_height | Slide height in inches | 7.5 (16:9) |
figure_dpi | Resolution for embedded figures | 200 |
font_family | Primary font for text | "Calibri" |
title_size | Title text size in points | 28 |
body_size | Body text size in points | 18 |
figure_format | Export format for matplotlib figures | "png" |
color_scheme | Named color palette | "academic_blue" |
Best Practices
-
Use widescreen 16:9 aspect ratio — Modern projectors and screens expect 16:9 (13.333" × 7.5"). Standard 4:3 wastes screen space and looks dated. Set dimensions explicitly in the Presentation object rather than relying on default template dimensions.
-
Limit text to 6 lines per slide maximum — Dense text slides lose the audience. Each slide should make one point with supporting visuals. Move detailed methods and supplementary data to backup slides after the conclusion. Use speaker notes for details you want to say but not show.
-
Export figures at 200 DPI minimum — Figures saved at screen resolution (72 DPI) look pixelated when projected. Save matplotlib figures with
dpi=200andbbox_inches='tight'. For retina displays and print, use 300 DPI. Vector formats (SVG/PDF) avoid this entirely but require conversion for PPTX embedding. -
Maintain consistent styling across slides — Use a builder class or template to enforce uniform fonts, colors, margins, and title positions. Inconsistent formatting distracts from the science. Define a color scheme once and reference it throughout.
-
Add speaker notes to every content slide — Notes serve as your script during the talk and as documentation when sharing the deck. Include key talking points, data sources, and transition phrases. This also makes the presentation self-contained for colleagues who weren't at the talk.
Common Issues
Figures appear blurry or pixelated on slides — The default DPI for matplotlib is 100, which is too low for projection. Always use fig.savefig(path, dpi=200, bbox_inches='tight'). Also ensure the image is sized large enough in the slide — stretching a small image makes it worse. Match the figure's pixel dimensions to the intended display size.
Text overflows the textbox boundaries — python-pptx doesn't auto-resize textboxes. Calculate the required height based on line count and font size, or enable word wrap with text_frame.word_wrap = True. For dynamic content, measure text length and adjust the textbox height: approximately Pt(font_size) * 1.5 * line_count.
Slide layouts from templates don't match expectations — Different PPTX templates define different numbers and types of layouts. Use prs.slide_layouts[6] (blank) for full control, or iterate through prs.slide_layouts and print each layout's name to find the one you want. Relying on layout indices across different templates breaks portability.
Reviews
No reviews yet. Be the first to review this template!
Similar Templates
Full-Stack Code Reviewer
Comprehensive code review skill that checks for security vulnerabilities, performance issues, accessibility, and best practices across frontend and backend code.
Test Suite Generator
Generates comprehensive test suites with unit tests, integration tests, and edge cases. Supports Jest, Vitest, Pytest, and Go testing.
Pro Architecture Workspace
Battle-tested skill for architectural, decision, making, framework. Includes structured workflows, validation checks, and reusable patterns for development.