--- title: "Getting Started with nivo.bubblechart" author: "Anastasiia Kostiv" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: true toc_depth: 3 fig_width: 7 fig_height: 5 vignette: > %\VignetteIndexEntry{Getting Started with nivo.bubblechart} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.align = "center", warning = FALSE, message = FALSE ) ``` # Introduction Welcome to **nivo.bubblechart**. This package brings the power of [Nivo's](https://nivo.rocks) circle packing visualizations to R, making it straightforward to create interactive bubble charts for data analysis and Shiny applications.
**What are bubble charts?** Bubble charts (circle packing diagrams) display hierarchical data as nested circles. The size of each bubble represents a quantitative value, making it easy to compare magnitudes across categories.
## Why use this package? - **Clean defaults** - Charts look professional without extensive configuration - **Customizable** - Control over colors, sizes, and interactions - **Interactive** - Built-in hover effects and click event handling - **Responsive** - Works across devices and screen sizes - **Shiny integration** - First-class support for Shiny applications - **Data frame support** - Easy conversion from data frames --- # Installation ## From CRAN ```{r eval=FALSE} install.packages("nivo.bubblechart") ``` ## Development Version ```{r eval=FALSE} # Install from GitHub # install.packages("devtools") devtools::install_github("DataRacerEdu/nivo.bubblechart") ```
**Tip:** After installation, check out the example Shiny apps included in the package.
--- # Quick Start ## Basic Example Create a bubble chart with a few lines of code: ```{r eval=FALSE} library(nivo.bubblechart) # Prepare data fruit_data <- list( name = "Fruits", children = list( list(name = "Apples", value = 450, color = "#ff6b6b", labelColor = "#ffffff"), list(name = "Bananas", value = 320, color = "#feca57", labelColor = "#000000"), list(name = "Oranges", value = 280, color = "#ff9f43", labelColor = "#ffffff"), list(name = "Grapes", value = 150, color = "#a29bfe", labelColor = "#ffffff") ) ) # Create visualization bubblechart( element_id = "fruit_chart", main_color = "#ff6b6b", label_color = "#ffffff", on_hover_title_color = "#2c3e50", data = fruit_data, height = "500px" ) ``` --- # Data Structure ## Hierarchical Format The package expects data as a nested list: ```{r eval=FALSE} hierarchical_data <- list( name = "root", # Root node name children = list( # Child nodes list( name = "Item 1", # Display name value = 100, # Bubble size color = "#3498db", # Fill color labelColor = "#fff" # Text color ), list( name = "Item 2", value = 200, color = "#e74c3c", labelColor = "#fff" ) ) ) ``` ### Required Fields | Field | Type | Description | |-------|------|-------------| | `name` | character | Display name for the bubble | | `value` | numeric | Determines bubble size (must be positive) | | `color` | character | Hex color code for bubble fill | | `labelColor` | character | Hex color code for label text |
**Note:** All bubbles must have the same structure. Missing fields may cause rendering issues.
--- # Working with Data Frames ## Using prepare_bubble_data() Most R users work with data frames. The `prepare_bubble_data()` function handles the conversion: ### Basic Conversion ```{r eval=FALSE} # Data frame sales_data <- data.frame( product = c("Laptop", "Phone", "Tablet", "Watch", "Headphones"), revenue = c(45000, 38000, 22000, 15000, 8000), category_color = c("#3498db", "#3498db", "#3498db", "#e74c3c", "#e74c3c"), text_color = c("#ffffff", "#ffffff", "#ffffff", "#ffffff", "#ffffff") ) # Convert to bubble chart format chart_data <- prepare_bubble_data( df = sales_data, name_col = "product", value_col = "revenue", color_col = "category_color", label_color_col = "text_color", root_name = "Product Sales" ) # Create chart bubblechart( element_id = "sales_chart", main_color = "#3498db", label_color = "#ffffff", on_hover_title_color = "#2c3e50", data = chart_data, height = "600px" ) ``` ### Using Default Colors When your data doesn't include color columns: ```{r eval=FALSE} simple_data <- data.frame( category = c("Marketing", "Engineering", "Sales", "Support"), budget = c(120000, 250000, 180000, 90000) ) chart_data <- prepare_bubble_data( df = simple_data, name_col = "category", value_col = "budget", default_color = "#9b59b6", default_label_color = "#ffffff" ) ``` ### Dynamic Color Mapping Assign colors based on data values: ```{r eval=FALSE} company_data <- data.frame( department = c("HR", "IT", "Finance", "Operations", "R&D"), employees = c(25, 150, 40, 200, 80) ) # Color by department size company_data$color <- ifelse( company_data$employees > 100, "#27ae60", ifelse(company_data$employees > 50, "#f39c12", "#e74c3c") ) company_data$labelColor <- "#ffffff" chart_data <- prepare_bubble_data(company_data) ``` --- # Customization ## Color Parameters ```{r eval=FALSE} bubblechart( element_id = "color_demo", main_color = "#3498db", # Default bubble color label_color = "#ecf0f1", # Default label color activeColor = "transparent", # Selected bubble color on_hover_title_color = "#e74c3c", # Hover label color borderWidth = 2, # Border thickness data = your_data ) ``` ## Color Palettes Some tested combinations: ```{r eval=FALSE} # Ocean theme ocean_colors <- list( main = "#006ba6", label = "#ffffff", hover = "#0496ff" ) # Sunset theme sunset_colors <- list( main = "#ff6b6b", label = "#ffffff", hover = "#4ecdc4" ) # Dark theme dark_colors <- list( main = "#2c3e50", label = "#ecf0f1", hover = "#3498db" ) ``` ## Sizing ```{r eval=FALSE} # Responsive bubblechart( element_id = "responsive_chart", data = your_data, width = "100%", height = "600px" ) # Fixed dimensions bubblechart( element_id = "fixed_chart", data = your_data, width = "800px", height = "600px" ) ``` ## Interactivity Disable interactions for static output: ```{r eval=FALSE} bubblechart( element_id = "static_viz", data = your_data, isInteractive = FALSE ) ``` --- # Shiny Integration ## Complete Example ```{r eval=FALSE} library(shiny) library(nivo.bubblechart) sample_data <- list( name = "Tech Companies", children = list( list(name = "Apple", value = 2800, color = "#A3AAAE", labelColor = "#000000"), list(name = "Microsoft", value = 2500, color = "#00A4EF", labelColor = "#ffffff"), list(name = "Google", value = 1800, color = "#4285F4", labelColor = "#ffffff"), list(name = "Amazon", value = 1600, color = "#FF9900", labelColor = "#000000"), list(name = "Meta", value = 900, color = "#0668E1", labelColor = "#ffffff") ) ) ui <- fluidPage( titlePanel("Market Cap Visualization"), sidebarLayout( sidebarPanel( h4("Selected Company"), verbatimTextOutput("selected_company") ), mainPanel( bubblechartOutput("tech_chart", height = "600px") ) ) ) server <- function(input, output, session) { output$tech_chart <- renderBubblechart({ bubblechart( element_id = "tech_bubble", main_color = "#667eea", label_color = "#ffffff", on_hover_title_color = "#FFD700", activeColor = "#FF6B6B", borderWidth = 2, data = sample_data, height = "600px" ) }) output$selected_company <- renderPrint({ clicked <- input$tech_bubble_clicked if (is.null(clicked)) { cat("Click a bubble to select") } else if (clicked == "DESELECT_EVENT") { cat("Deselected") } else { cat("Selected:", clicked) } }) } shinyApp(ui, server) ``` ## Click Event Handling ```{r eval=FALSE} server <- function(input, output, session) { observeEvent(input$my_chart_clicked, { clicked_item <- input$my_chart_clicked if (clicked_item == "DESELECT_EVENT") { showNotification("Deselected", type = "message") } else { showNotification(paste("Selected:", clicked_item), type = "message") } }) } ``` --- # Use Cases ## Portfolio Allocation ```{r eval=FALSE} portfolio <- data.frame( asset = c("Stocks", "Bonds", "Real Estate", "Cash"), amount = c(45000, 30000, 20000, 8000) ) portfolio$color <- c("#e74c3c", "#f39c12", "#3498db", "#27ae60") portfolio$labelColor <- "#ffffff" portfolio_data <- prepare_bubble_data( portfolio, name_col = "asset", value_col = "amount" ) ``` ## Website Analytics ```{r eval=FALSE} web_traffic <- data.frame( page = c("Home", "Products", "Blog", "About"), visitors = c(15000, 8500, 6200, 2100), bounce_rate = c(0.35, 0.42, 0.28, 0.55) ) # Color by bounce rate web_traffic$color <- ifelse( web_traffic$bounce_rate < 0.3, "#27ae60", ifelse(web_traffic$bounce_rate < 0.5, "#f39c12", "#e74c3c") ) web_traffic$labelColor <- "#ffffff" traffic_data <- prepare_bubble_data( web_traffic, name_col = "page", value_col = "visitors" ) ``` --- # Best Practices
**Recommendations:** - Use positive numeric values only - Limit to 5-7 colors for readability - Avoid extreme size differences between bubbles - Test data structure with `str()` before visualizing - Use high contrast colors for accessibility
## Performance For large datasets, aggregate before visualizing: ```{r eval=FALSE} large_data <- your_data %>% group_by(category) %>% summarise(total = sum(value), .groups = 'drop') %>% head(20) chart_data <- prepare_bubble_data( large_data, name_col = "category", value_col = "total" ) ``` --- # Troubleshooting ## Bubbles not appearing ```{r eval=FALSE} # Verify structure str(your_data) # Check positive values all(sapply(your_data$children, function(x) x$value > 0)) # Verify fields names(your_data$children[[1]]) ``` ## Colors not displaying ```{r eval=FALSE} # Convert factors to character df$color <- as.character(df$color) df$labelColor <- as.character(df$labelColor) ``` ## Shiny events not firing ```{r eval=FALSE} # element_id creates input$_clicked bubblechart(element_id = "my_chart", ...) # Access as: observeEvent(input$my_chart_clicked, { ... }) ``` --- # Function Reference ## bubblechart() | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `element_id` | character | required | Shiny input ID | | `main_color` | character | required | Default bubble color | | `label_color` | character | required | Default label color | | `on_hover_title_color` | character | required | Hover label color | | `data` | list | NULL | Hierarchical data | | `width` | character | NULL | Chart width | | `height` | character | "400px" | Chart height | | `isInteractive` | logical | TRUE | Enable interactions | | `activeColor` | character | "transparent" | Selected color | | `borderWidth` | numeric | 3 | Border width (px) | ## prepare_bubble_data() | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `df` | data.frame | required | Input data | | `name_col` | character | "name" | Name column | | `value_col` | character | "value" | Value column | | `color_col` | character | "color" | Color column | | `label_color_col` | character | "labelColor" | Label color column | | `root_name` | character | "root" | Root node name | | `default_color` | character | "#ff5f56" | Fallback color | | `default_label_color` | character | "#ffffff" | Fallback label color | --- # Resources - [Nivo Documentation](https://nivo.rocks/circle-packing/) - [GitHub Repository](https://github.com/DataRacerEdu/nivo.bubblechart) - [Report Issues](https://github.com/DataRacerEdu/nivo.bubblechart/issues) --- *Last updated: `r Sys.Date()`*