Creates basic plots (line, scatter, bar, histogram, box) and interactive visualizations from pandas DataFrames using hvPlot, adding hover tools, layouts, and publication-quality output.
How this skill is triggered — by the user, by Claude, or both
Slash command
/holoviz-visualization:plotting-fundamentalsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Master quick plotting and interactive visualization with hvPlot and HoloViews basics. This skill covers essential techniques for creating publication-quality plots with minimal code.
Master quick plotting and interactive visualization with hvPlot and HoloViews basics. This skill covers essential techniques for creating publication-quality plots with minimal code.
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)
# 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)
# 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'
)
# 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
)
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'
)
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')
# 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)
# 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')
# 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}")
# 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'))
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')
)
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')
def plot_multiple_metrics(df, metrics):
plots = [df.hvplot.line(x='date', y=m, label=m) for m in metrics]
return hv.Overlay(plots)
hvplot.pandas or hvplot.xarray is importedrot=45by='column'npx claudepluginhub uw-ssec/rse-plugins --plugin holoviz-visualizationCreates advanced HoloViews visualizations: multi-dimensional plots, overlays, layouts, interactive streams, networks, dynamic maps, and faceted displays.
Python interactive visualization library for creating web-embeddable charts with hover, zoom, and pan. Includes Plotly Express and Graph Objects APIs.
Creates interactive, web-embeddable charts with 40+ chart types, hover info, zoom, and pan. Best for dashboards, exploratory analysis, and presentations.