Plotting Fundamentals

by uw-ssec

codeapitooldata

Master quick plotting and interactive visualization with hvPlot. Use this skill when creating basic plots (line, scatter, bar, histogram, box), visualizing pandas DataFrames with minimal code, adding interactivity and hover tools, composing multiple plots in layouts, or generating publication-quality visualizations rapidly.

Skill Details

Repository Files

1 file in this skill directory


name: plotting-fundamentals description: Master quick plotting and interactive visualization with hvPlot. Use this skill when creating basic plots (line, scatter, bar, histogram, box), visualizing pandas DataFrames with minimal code, adding interactivity and hover tools, composing multiple plots in layouts, or generating publication-quality visualizations rapidly. version: 2025-01-07 compatibility: Requires hvplot >= 0.9.0, holoviews >= 1.18.0, pandas >= 1.0.0, numpy >= 1.15.0, bokeh >= 3.0.0

Plotting Fundamentals Skill

Overview

Master quick plotting and interactive visualization with hvPlot and HoloViews basics. This skill covers essential techniques for creating publication-quality plots with minimal code.

Dependencies

  • hvplot >= 0.9.0
  • holoviews >= 1.18.0
  • pandas >= 1.0.0
  • numpy >= 1.15.0
  • bokeh >= 3.0.0

Core Capabilities

1. hvPlot Quick Plotting

hvPlot provides an intuitive, pandas-like API for rapid visualization:

import hvplot.pandas
import pandas as pd
import numpy as np

# Create sample data
df = pd.DataFrame({
    'date': pd.date_range('2024-01-01', periods=100),
    'sales': np.cumsum(np.random.randn(100)) + 100,
    'region': np.random.choice(['North', 'South', 'East', 'West'], 100)
})

# Simple line plot
df.hvplot.line(x='date', y='sales', title='Sales Over Time')

# Grouped plot
df.hvplot.line(x='date', y='sales', by='region', subplots=True)

# Scatter with size and color
df.hvplot.scatter(x='sales', y='date', c='region', size=50)

2. Common Plot Types

# Bar plot
df.hvplot.bar(x='region', y='sales', rot=45)

# Histogram
df['sales'].hvplot.hist(bins=30, title='Sales Distribution')

# Box plot
df.hvplot.box(y='sales', by='region')

# Area plot
df.hvplot.area(x='date', y='sales')

# KDE (Kernel Density Estimation)
df['sales'].hvplot.kde()

# Hexbin (for large datasets)
df.hvplot.hexbin(x='sales', y='date', gridsize=20)

3. Customization Options

# Apply consistent styling
plot = df.hvplot.line(
    x='date',
    y='sales',
    title='Sales Trend',
    xlabel='Date',
    ylabel='Sales ($)',
    color='#2E86DE',
    line_width=2,
    height=400,
    width=700,
    responsive=True,
    legend='top_left'
)

# Color mapping
df.hvplot.scatter(
    x='sales',
    y='date',
    c='sales',
    cmap='viridis',
    s=100
)

# Multiple series
df.hvplot.line(
    x='date',
    y=['sales'],
    title='Performance Metrics'
)

4. Interactive Features

# Hover information
df.hvplot.scatter(
    x='sales',
    y='date',
    hover_cols=['region'],
    tools=['hover', 'pan', 'wheel_zoom']
)

# Selection and linked views
import holoviews as hv
scatter = df.hvplot.scatter(x='sales', y='date')
scatter.opts(tools=['box_select'])

# Responsive sizing
plot = df.hvplot.line(
    x='date',
    y='sales',
    responsive=True,
    height=400
)

5. Geographic Plotting with hvPlot

import geopandas as gpd

# Quick geographic plot
gdf = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
gdf.hvplot(
    c='pop_est',
    cmap='viridis',
    geo=True,
    frame_width=600
)

# City points on map
cities = gpd.GeoDataFrame({
    'name': ['City A', 'City B'],
    'geometry': [Point(0, 0), Point(1, 1)],
    'population': [1000000, 500000]
})
cities.hvplot(
    geo=True,
    c='population',
    size='population',
    cmap='plasma'
)

HoloViews Fundamentals

1. Basic Element Types

import holoviews as hv
from holoviews import opts

# Curve
curve = hv.Curve(df, 'date', 'sales')

# Scatter
scatter = hv.Scatter(df, 'sales', 'date')

# Histogram
hist = hv.Histogram(df['sales'].values)

# Image (heatmap)
image = hv.Image(data)

# Bars
bars = hv.Bars(df, 'region', 'sales')

# Text annotations
text = hv.Text(0.5, 0.5, 'Hello HoloViews')

2. Styling and Options

# Using .opts() method
plot = hv.Curve(df, 'date', 'sales').opts(
    title='Sales Trend',
    xlabel='Date',
    ylabel='Sales',
    color='#2E86DE',
    line_width=2,
    height=400,
    width=700
)

# Using opts object
opts_obj = opts.Curve(
    title='Sales',
    color='navy',
    line_width=2
)
plot = hv.Curve(df, 'date', 'sales').opts(opts_obj)

3. Composing Visualizations

# Overlaying multiple plots
overlay = hv.Curve(df, 'date', 'sales') * hv.Scatter(df_subset, 'date', 'sales')

# Side-by-side layouts
layout = hv.Curve(df1, 'date', 'sales') + hv.Scatter(df2, 'date', 'value')

# Grid layouts
grid = (
    (hv.Curve(data1) + hv.Scatter(data2)) /
    (hv.Histogram(data3) + hv.Image(data4))
)

# Faceted views
faceted = hv.Curve(df, 'date', 'sales').facet('region')

4. Interactive Selection and Linking

# Brush selection
curve_selectable = hv.Curve(df, 'date', 'sales').opts(
    tools=['box_select'],
    selection_fill_color='red',
    nonselection_fill_alpha=0.2
)

# Dynamic linking with streams
from holoviews import streams

# Hover information
hover = streams.Tap(source=scatter, transient=True)

@hv.transform
def get_info(data):
    if data.empty:
        return hv.Text(0, 0, 'Hover to select')
    return hv.Text(0, 0, f"Point: {data.iloc[0].values}")

Best Practices

1. Data Preparation

  • Always check data types before plotting
  • Handle missing values explicitly
  • Normalize columns for better visualization
  • Use appropriate data ranges

2. Visual Design

  • Choose colors for accessibility (colorblind-friendly palettes)
  • Use title and axis labels
  • Include legends for multiple series
  • Maintain consistent styling across related plots

3. Performance

  • Use datashader for datasets with >100k points
  • Downsample or aggregate before plotting
  • Use responsive=True for web dashboards
  • Cache expensive plot computations

4. Code Organization

# Create a plotting utility module
class PlotBuilder:
    COLORS = {'primary': '#2E86DE', 'secondary': '#A23B72'}
    DEFAULTS = {'height': 400, 'width': 700, 'responsive': True}

    @staticmethod
    def style_plot(plot, **kwargs):
        return plot.opts(**{**PlotBuilder.DEFAULTS, **kwargs})

# Usage
styled = PlotBuilder.style_plot(df.hvplot.line(x='date', y='sales'))

Common Patterns

Pattern 1: Dashboard with Multiple Plots

def create_sales_dashboard(df):
    return hv.Column(
        df.hvplot.line(x='date', y='sales', title='Trend'),
        df.hvplot.bar(x='region', y='sales', title='By Region'),
        df['sales'].hvplot.hist(bins=20, title='Distribution')
    )

Pattern 2: Conditional Visualization

def plot_data(df, plot_type='line'):
    if plot_type == 'line':
        return df.hvplot.line(x='date', y='sales')
    elif plot_type == 'scatter':
        return df.hvplot.scatter(x='date', y='sales')
    else:
        return df.hvplot.bar(x='region', y='sales')

Pattern 3: Multi-Series Plot with Legend

def plot_multiple_metrics(df, metrics):
    plots = [df.hvplot.line(x='date', y=m, label=m) for m in metrics]
    return hv.Overlay(plots)

Integration with Other HoloViz Tools

  • Panel: Embed plots in dashboards
  • HoloViews: Advanced composition and interactivity
  • Datashader: Large dataset visualization
  • Param: Dynamic plot updates based on parameters

Common Use Cases

  1. Time Series Analysis: Trends, anomalies, forecasting
  2. Comparative Analysis: Category comparisons, rankings
  3. Distribution Analysis: Histograms, KDEs, box plots
  4. Correlation Analysis: Scatter plots, hexbins
  5. Geographic Analysis: Maps, regional data
  6. Statistical Summaries: Summary statistics with plots

Troubleshooting

Issue: Plot Won't Display

  • Ensure hvplot.pandas or hvplot.xarray is imported
  • Check data is not empty
  • Verify x and y columns exist in dataframe

Issue: Poor Performance with Large Data

  • Use datashader for >100k points
  • Implement aggregation or sampling
  • Use hexbin or rasterization

Issue: Unclear or Overlapping Labels

  • Rotate x-axis labels with rot=45
  • Use subplots with by='column'
  • Adjust figure size with height/width

Resources

Related Skills

Xlsx

Comprehensive spreadsheet creation, editing, and analysis with support for formulas, formatting, data analysis, and visualization. When Claude needs to work with spreadsheets (.xlsx, .xlsm, .csv, .tsv, etc) for: (1) Creating new spreadsheets with formulas and formatting, (2) Reading or analyzing data, (3) Modify existing spreadsheets while preserving formulas, (4) Data analysis and visualization in spreadsheets, or (5) Recalculating formulas

data

Clickhouse Io

ClickHouse database patterns, query optimization, analytics, and data engineering best practices for high-performance analytical workloads.

datacli

Clickhouse Io

ClickHouse database patterns, query optimization, analytics, and data engineering best practices for high-performance analytical workloads.

datacli

Analyzing Financial Statements

This skill calculates key financial ratios and metrics from financial statement data for investment analysis

data

Data Storytelling

Transform data into compelling narratives using visualization, context, and persuasive structure. Use when presenting analytics to stakeholders, creating data reports, or building executive presentations.

data

Kpi Dashboard Design

Design effective KPI dashboards with metrics selection, visualization best practices, and real-time monitoring patterns. Use when building business dashboards, selecting metrics, or designing data visualization layouts.

designdata

Dbt Transformation Patterns

Master dbt (data build tool) for analytics engineering with model organization, testing, documentation, and incremental strategies. Use when building data transformations, creating data models, or implementing analytics engineering best practices.

testingdocumenttool

Sql Optimization Patterns

Master SQL query optimization, indexing strategies, and EXPLAIN analysis to dramatically improve database performance and eliminate slow queries. Use when debugging slow queries, designing database schemas, or optimizing application performance.

designdata

Anndata

This skill should be used when working with annotated data matrices in Python, particularly for single-cell genomics analysis, managing experimental measurements with metadata, or handling large-scale biological datasets. Use when tasks involve AnnData objects, h5ad files, single-cell RNA-seq data, or integration with scanpy/scverse tools.

arttooldata

Xlsx

Spreadsheet toolkit (.xlsx/.csv). Create/edit with formulas/formatting, analyze data, visualization, recalculate formulas, for spreadsheet processing and analysis.

tooldata

Skill Information

Category:Technical
Version:2025-01-07
Last Updated:1/9/2026