Skip to content
cccskills
FreePublished on GitHub

plotly-r

Interactive R visualization with plotly: plot_ly() for scatter, line, bar, heatmap, 3D charts; ggplotly() to convert ggplot2 objects; layout() for customization; htmlwidgets::saveWidget() for export. Use when execution language is R and interactivity needed. Python equivalent: plotly. For static figures use ggplot2.

The English summary is being prepared. Showing the original description.

DAAF-Contribution-Community/daaf238 stars(GitHub 238 + cccskills 0)

Run score Not tested

See how to install

Files included (8)

  • SKILL.md9.3 KB
  • references/chart-types.md5.9 KB
  • references/export.md5.1 KB
  • references/ggplotly.md6.0 KB
  • references/gotchas.md7.7 KB
  • references/layouts.md7.4 KB
  • references/quickstart.md6.0 KB
  • references/subplots.md4.6 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

plotly-r Skill

Interactive R visualization with the plotly package (4.12.0). Covers plot_ly() for direct trace-based charts (scatter, line, bar, histogram, box, heatmap, 3D scatter, 3D surface); ggplotly() for converting ggplot2 objects to interactive equivalents; layout() for axis, title, legend, and annotation customization; subplot() for multi-panel composition; and htmlwidgets::saveWidget() for self-contained HTML export. Use when execution language is R and interactive hover/zoom/pan behavior is needed. Python equivalent: plotly (Plotly Express + Graph Objects). For static publication-quality R figures, use ggplot2 instead.

What is plotly for R?

plotly is an R interface to the Plotly.js JavaScript library:

  • Interactive: Hover, zoom, pan, and select built-in
  • Two approaches: plot_ly() (direct) and ggplotly() (convert from ggplot2)
  • Web-based: Renders as HTML/JavaScript via htmlwidgets
  • Wide chart support: scatter, line, bar, histogram, box, heatmap, 3D, maps
  • Piping: Works with R's native pipe |> for chained layout/trace updates

How to Use This Skill

Reference File Structure

FilePurposeWhen to Read
quickstart.mdplot_ly() basics, add_trace(), piping, saveWidgetStarting out
chart-types.mdscatter, line, bar, histogram, box, heatmap, 3DChoosing chart types
ggplotly.mdConverting ggplot2 objects, tooltip customizationggplot2 bridge
layouts.mdlayout() for axes, titles, legends, annotationsCustomizing appearance
export.mdsaveWidget(), orca/kaleido for static, Quarto embeddingSaving and sharing
subplots.mdsubplot() composition, shared axes, mixed typesMulti-panel layouts
gotchas.mdplot_ly vs ggplotly tradeoffs, formula interface, performanceDebugging

Reading Order

  1. Quick plot? Start with quickstart.md
  2. Which chart? Check chart-types.md
  3. Have ggplot2 code? Read ggplotly.md
  4. Customize layout? Read layouts.md
  5. Save/export? Read export.md
  6. Multiple panels? Read subplots.md
  7. Trouble? Check gotchas.md

Related Skills

SkillRelationship
plotlyPython equivalent (Plotly Express + Graph Objects)
ggplot2Static R figures; ggplotly() converts ggplot2 objects to interactive
quartoQuarto embedding for plotly htmlwidgets
tidyverseData preparation -- tidy data feeds into plot_ly() pipelines
r-python-translationCross-language visualization translation
data-scientistMethod selection and visualization design guidance

Quick Decision Trees

"What chart type do I need?"

What are you visualizing?
|-- Relationship (x vs y)
|   |-- Continuous x, continuous y -> plot_ly(type = "scatter", mode = "markers")
|   |-- Time series -> plot_ly(type = "scatter", mode = "lines")
|   +-- With error/uncertainty -> add error bars via error_y
|-- Distribution
|   |-- One variable -> plot_ly(type = "histogram")
|   |-- By group -> plot_ly(type = "box") or plot_ly(type = "violin")
|   +-- Heatmap/density -> plot_ly(type = "heatmap")
|-- Comparison
|   |-- Counts/values -> plot_ly(type = "bar")
|   +-- Grouped -> barmode = "group" in layout()
|-- 3D
|   |-- Scatter -> plot_ly(type = "scatter3d")
|   +-- Surface -> plot_ly(type = "surface")
+-- Already have ggplot2 code -> ggplotly(p)

"How do I save this plot?"

Saving a plot?
|-- Interactive HTML (primary DAAF export) -> htmlwidgets::saveWidget()
|-- Static PNG (requires orca/kaleido) -> orca() or kaleido()
|-- Embed in Quarto -> just print the widget in a code chunk
+-- Temp file (smoke tests) -> saveWidget(p, tempfile(fileext = ".html"))

"plot_ly() or ggplotly()?"

Which approach?
|-- Building from scratch -> plot_ly()
|-- Already have ggplot2 code -> ggplotly()
|-- Need fine-grained trace control -> plot_ly()
|-- Quick interactive version of static plot -> ggplotly()
|-- Complex multi-trace with mixed types -> plot_ly() + add_trace()
+-- Want ggplot2 facets interactive -> ggplotly() (preserves faceting)

File-First Execution in Research Workflows

In DAAF research pipelines, all visualizations are generated through script files in scripts/stage8_analysis/, not interactively. This ensures auditability and reproducibility.

The pattern:

  1. Write plot code to scripts/stage8_analysis/{step}_{plot-name}.R
  2. Execute via bash {BASE_DIR}/scripts/run_with_capture.sh {script_path}
  3. Output gets appended to the script as comments
  4. Use htmlwidgets::saveWidget() to save interactive HTML to the project output directory

See agent_reference/SCRIPT_EXECUTION_REFERENCE.md for the mandatory file-first execution protocol.

Quick Reference

Essential Setup

library(plotly)
library(htmlwidgets)  # saveWidget() for HTML export

Basic plot_ly() Pattern

p <- plot_ly(df, x = ~col_x, y = ~col_y, type = "scatter", mode = "markers")
p

Note the formula interface: columns are referenced with ~col_name (tilde prefix), not bare names or strings.

ggplotly() Bridge

library(ggplot2)
library(plotly)

g <- ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl))) +
  geom_point()

p <- ggplotly(g)
p

Common plot_ly() Trace Types

TypeModeUse Case
"scatter""markers"Scatter plot
"scatter""lines"Line chart
"scatter""lines+markers"Line with points
"bar"—Bar chart
"histogram"—Histogram
"box"—Box plot
"heatmap"—Heatmap
"scatter3d""markers"3D scatter
"surface"—3D surface

Layout Customization

p <- plot_ly(df, x = ~x, y = ~y, type = "scatter", mode = "markers") |>
  layout(
    title = "My Plot",
    xaxis = list(title = "X Label"),
    yaxis = list(title = "Y Label")
  )

Saving Plots

library(htmlwidgets)

# HTML export (uses CDN for plotly.js -- default for DAAF)
saveWidget(p, "plot.html", selfcontained = FALSE)

# Self-contained HTML (embeds plotly.js, ~3MB -- requires pandoc)
# saveWidget(p, "plot.html", selfcontained = TRUE)  # NOT available in DAAF (no pandoc)

DAAF note: selfcontained = TRUE requires pandoc, which is not installed in the DAAF container. Use selfcontained = FALSE (loads plotly.js from CDN). Static image export via orca() or kaleido() is also not available. Use ggplot2 with ggsave() for static PNG/SVG figures.

Piping with |>

plotly R functions return the plot object, enabling piping:

p <- plot_ly(df, x = ~x, y = ~y, type = "scatter", mode = "markers") |>
  add_trace(y = ~y2, name = "Series 2", mode = "lines") |>
  layout(title = "Two Series", xaxis = list(title = "X")) |>
  config(displayModeBar = FALSE)

Topic Index

TopicReference File
plot_ly() basics./references/quickstart.md
add_trace()./references/quickstart.md
Formula interface (~x)./references/quickstart.md
Piping with |>./references/quickstart.md
saveWidget()./references/quickstart.md
Scatter plots./references/chart-types.md
Line charts./references/chart-types.md
Bar charts./references/chart-types.md
Histograms./references/chart-types.md
Box plots./references/chart-types.md
Heatmaps./references/chart-types.md
3D scatter and surface./references/chart-types.md
ggplotly() conversion./references/ggplotly.md
Tooltip customization./references/ggplotly.md
ggplotly limitations./references/ggplotly.md
Axis titles and formatting./references/layouts.md
Legends./references/layouts.md
Annotations./references/layouts.md
Multiple axes./references/layouts.md
Color scales./references/layouts.md
HTML export./references/export.md
Static image export./references/export.md
Quarto embedding./references/export.md
subplot() composition./references/subplots.md
Shared axes in subplots./references/subplots.md
Mixed chart types./references/subplots.md
plot_ly vs ggplotly./references/gotchas.md
Formula interface gotchas./references/gotchas.md
Performance with large data./references/gotchas.md
Common errors./references/gotchas.md

Citation

When plotly is used as a primary visualization tool, include in the report's Software & Tools references:

Sievert, C. (2020). Interactive Web-Based Data Visualization with R, plotly, and shiny. Chapman and Hall/CRC. https://plotly-r.com

Cite when: plotly produces interactive figures included in the report or notebook. Do not cite when: Only used for quick exploratory plots not included in deliverables.

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

Guide for creating DAAF agent definition files. Covers 12-section template, hook registration, skills-in-frontmatter, integration checklist. Use when adding or revising agents. For SKILL.md files, use skill-authoring instead.

The English summary is being prepared. Showing the original description.

DAAF-Contribution-Community/daaf238Updated Oct 17, 2026

Researcher-facing analytic triangulation ("creative verification") for stress-testing provisional findings and designing pre-specified challenges before an analysis runs. Turns a researcher's concern or focal claim into competing explanations, bounded discriminating tests, audited diagnostic artifacts, and evidence-calibrated interpretations in a hypothesis/evidence ledger — behavioral, output-level verification replacing line-by-line code review. Covers 12 challenge families organized by Shadish-Cook-Campbell validity type, named sensitivity statistics, pre-committed interpretation rules, anti-fishing guardrails, and interactive diagnostic-artifact QA. Use in Ad Hoc Collaboration to verify, challenge, or stress-test a result, or to design discriminating tests before an analysis runs. Not code-change verification (verify skill / code review) and not final adjudication or re-execution (data-verifier, Reproducibility Verification) — prospective, hypothesis-driven challenge design of analytic claims.

The English summary is being prepared. Showing the original description.

DAAF-Contribution-Community/daaf238Updated Oct 17, 2026

In-situ smoke testing that verifies a LIVE DAAF deployment functions end-to-end in whatever provider route it is configured for. Auto-detects the active install route (anthropic-subscription, openrouter, chatgpt-subscription shim, openai-api shim) and runs tiered probes: Tier 0 free preflight (route/env coherence, hooks, statuslines, shim health); Tier 1 one live round-trip (~cents); Tier 2 a six-probe functional battery (dispatch, coding, web, skill loading, isolation-strip, nested-dispatch deny); Tier D a zero-cost deterministic battery (bats, Pester, lint, safety-hook tests). Use after install, after a rebuild or update, after any provider/config change (new API key, model remap, shim change), for pre-release validation, or when asked "is my install working" or to "smoke test the deployment/config." Requires the DAAF_DEV=1 dev image; a contributor tool, not end-user-facing. NOT DAAFBench (model behavioral-adherence evaluation under benchmarks/) and NOT scripts/smoke_tests/ (R/Python library-package smoke tests).

The English summary is being prepared. Showing the original description.

DAAF-Contribution-Community/daaf238Updated Oct 17, 2026

Operational framework for the DAAF orchestrator. Defines engagement modes, confirmation protocol, subagent dispatch, context budget, and reference-loading. Loaded exclusively by the orchestrator — not for subagents or user questions.

The English summary is being prepared. Showing the original description.

DAAF-Contribution-Community/daaf238Updated Oct 17, 2026

Data science methodology and method-selection routing for quantitative research. Covers EDA, data validation, descriptive analysis, causal inference (IV, DiD, RD, synthetic control), clustering/PCA/UMAP, supervised ML, geospatial analysis, network analysis, and visualization design. Contains the canonical method-to-library routing tree, routed by execution language — Python: statsmodels (OLS/GLM/time series), pyfixest (FE/DiD), linearmodels (RE/GMM/SUR), svy (complex surveys), scikit-learn (clustering/prediction ML), geopandas (spatial), igraph (network analysis); R: r-stats (OLS/GLM/time series), fixest (FE/DiD), plm (panel/RE/IV), survey-r (complex surveys), tidymodels (ML), sf-terra (spatial), igraph-r (network analysis). Load the routed tool-specific skill before giving tool-specific advice or writing code — library skills encode environment constraints and curated caveats absent from general knowledge.

The English summary is being prepared. Showing the original description.

DAAF-Contribution-Community/daaf238Updated Oct 17, 2026

Interpretation guidance for Urban Institute Education Data Portal datasets. The Portal is a curation layer over federal data: lowercase variable names, integer-encoded categoricals, standardized missing codes (-1 missing, -2 not applicable, -3 suppressed). Covers year definitions, grade encoding (grade=-1 is Pre-K, not missing), suppression rates, ODC-By licensing, and cross-source join identifiers. Load before analyzing any Portal data. Routes to source-specific deep-dive skills for individual datasets.

The English summary is being prepared. Showing the original description.

DAAF-Contribution-Community/daaf238Updated Oct 17, 2026

See all skills by DAAF-Contribution-Community

Report a problem with this skill