You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中实现Altair式选择直方图?散点图选择成难点

Great question! I totally get why you're drawn to that Altair selection histogram example—it’s a super intuitive way to explore data interactively. Let’s break down two solid approaches to replicate this in R, including the core scatter plot selection functionality you’re after.

1. Directly Replicate with R's altair Package

If you want to stay as close as possible to the original Altair workflow, R has an official altair package that wraps the Python library, so the logic will match almost exactly.

Step-by-Step Implementation

First, install and load the required packages:

install.packages("altair")
library(altair)
library(ggplot2) # For the iris dataset

Initialize the Altair renderer to output HTML (required for interactive elements):

alt$renderer_set("html")

Create the brush selection tool (this is the core interactive component):

brush <- alt$selection_interval(encodings = list("x", "y"))

Build the scatter plot, with conditional coloring for selected/unselected points:

points <- alt$Chart(iris)$mark_point()$encode(
  x = "PetalLength:Q",
  y = "PetalWidth:Q",
  color = alt$condition(brush, "Species:N", alt$value("lightgray"))
)$add_selection(brush)

Build the histogram, filtered to only show data from the selected scatter plot points:

histogram <- alt$Chart(iris)$mark_bar()$encode(
  x = "count():Q",
  y = "SepalLength:Q",
  color = "Species:N"
)$transform_filter(brush)

Combine and display the two charts side-by-side:

points | histogram

This will give you the exact same interactive behavior as the Altair example: drag to select points in the scatter plot, and the histogram will automatically update to show the distribution of SepalLength for only the selected points.

2. Implement with Shiny + Plotly (Pure R Ecosystem)

If you prefer to stick to native R tools without relying on the Python-backed altair package, you can build this interaction using Shiny and Plotly. This is a common but underused pattern, so it’s easy to miss!

Step-by-Step Implementation

First, install the required packages:

install.packages(c("shiny", "plotly", "dplyr"))

Build the full Shiny app:

library(shiny)
library(plotly)
library(dplyr)

# UI: Split layout for side-by-side charts
ui <- fluidPage(
  splitLayout(
    plotlyOutput("scatter_plot"),
    plotlyOutput("histogram_plot")
  )
)

# Server: Handle interactive selection and filtering
server <- function(input, output) {
  # Render interactive scatter plot with box selection enabled
  output$scatter_plot <- renderPlotly({
    plot_ly(
      data = iris,
      x = ~PetalLength,
      y = ~PetalWidth,
      color = ~Species,
      type = "scatter",
      mode = "markers"
    ) %>%
      layout(dragmode = "select") # Turn on box selection
  })

  # Render histogram linked to scatter plot selection
  output$histogram_plot <- renderPlotly({
    # Get data from the selected points in the scatter plot
    selected <- event_data("plotly_selected")

    # If no points are selected, show the full dataset
    if (is.null(selected)) {
      plot_data <- iris
    } else {
      # Filter to only selected points (Plotly uses 0-based indexing)
      plot_data <- iris[selected$pointNumber + 1, ]
    }

    # Build the horizontal histogram
    plot_ly(
      data = plot_data,
      y = ~SepalLength,
      color = ~Species,
      type = "histogram",
      orientation = "h"
    )
  })
}

# Run the app
shinyApp(ui, server)

How It Works

  • The scatter plot uses dragmode = "select" to enable box selection.
  • event_data("plotly_selected") captures the indices of the selected points.
  • The histogram dynamically updates to show only the data from the selected points, or the full dataset if nothing is selected.

You can also adapt this to use ggplot2 instead of raw Plotly: just build your scatter plot with ggplot2, convert it to a Plotly object with ggplotly(), and the event_data logic will still work.


内容的提问来源于stack exchange,提问作者dank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:55:46