CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-panoramix

An interactive data visualization platform built on SQLAlchemy and Druid.io

Pending

Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

Overview
Eval results
Files

visualizations.mddocs/

Visualization Framework

Panoramix provides a comprehensive visualization framework with multiple chart types, dynamic form generation, and flexible rendering capabilities. The system supports both SQL and Druid data sources with consistent APIs.

Capabilities

Base Visualization System

The visualization framework is built around a pluggable architecture with a base class and specialized implementations for different chart types.

class BaseViz:
    """
    Base visualization class providing core functionality.
    
    Attributes:
        verbose_name (str): Human-readable visualization name
        template (str): Jinja2 template for rendering
        hidden_fields (list): Form fields to hide in UI
        datasource (Datasource or Table): Data source instance
        form_data (dict): Form data from user interface
    """
    
    def bake_query(self):
        """
        Prepare and validate query parameters.
        
        Processes form data and prepares query parameters
        for execution against the data source.
        """
    
    def query_obj(self):
        """
        Build query object for data source.
        
        Returns:
            dict: Query parameters formatted for data source
        """
    
    def render(self):
        """
        Execute query and render visualization.
        
        Returns:
            str: Rendered HTML/JSON for the visualization
        """
    
    def render_no_data(self):
        """
        Render visualization when no data is available.
        
        Returns:
            str: No-data state HTML/JSON
        """
    
    def form_class(self):
        """
        Generate dynamic form class for this visualization.
        
        Returns:
            class: WTForms form class with appropriate fields
        """
    
    def query_filters(self):
        """
        Extract filter conditions from form data.
        
        Returns:
            list: List of filter tuples (column, operator, value)
        """

Chart Types

Panoramix supports multiple chart types through specialized visualization classes:

# Available visualization types
viz_types = OrderedDict([
    ('table', TableViz),
    ('line', TimeSeriesViz),
    ('compare', TimeSeriesCompareViz),
    ('compare_value', TimeSeriesCompareValueViz),
    ('area', TimeSeriesAreaViz),
    ('bar', TimeSeriesBarViz),
    ('stacked_ts_bar', TimeSeriesStackedBarViz),
    ('dist_bar', DistributionBarViz),
    ('pie', DistributionPieViz),
    ('bubble', BubbleViz),
])

Table Visualization

Display data in tabular format with sorting, pagination, and export capabilities.

class TableViz(BaseViz):
    """
    Table visualization for displaying raw data.
    
    Features:
    - Sortable columns
    - Pagination support
    - Export to CSV/Excel
    - Cell formatting
    - Search and filtering
    """
    verbose_name = "Table View"
    template = "panoramix/viz_table.html"

Time Series Visualizations

Various time-based chart types for temporal data analysis.

class TimeSeriesViz(BaseViz):
    """
    Line chart for time series data.
    
    Features:
    - Multiple metrics on same chart
    - Interactive tooltips
    - Zoom and pan
    - Time range selection
    """
    verbose_name = "Time Series - Line Chart"

class TimeSeriesAreaViz(BaseViz):
    """
    Stacked area chart for time series data.
    
    Features:
    - Stacked area visualization
    - Multiple metrics stacking
    - Hover interactions
    """
    verbose_name = "Time Series - Stacked"

class TimeSeriesBarViz(BaseViz):
    """
    Bar chart for time series data.
    
    Features:
    - Time-based bar charts
    - Multiple series support
    - Grouping capabilities
    """
    verbose_name = "Time Series - Bar Chart"

class TimeSeriesCompareViz(BaseViz):
    """
    Time series comparison showing percentage change.
    
    Features:
    - Period-over-period comparison
    - Percentage change calculation
    - Trend indicators
    """
    verbose_name = "Time Series - Percent Change"

Distribution Visualizations

Charts for showing data distributions and proportions.

class DistributionPieViz(BaseViz):
    """
    Pie chart for categorical data distribution.
    
    Features:
    - Interactive pie slices
    - Legend display
    - Percentage labels
    """
    verbose_name = "Distribution - Pie Chart"

class DistributionBarViz(BaseViz):
    """
    Horizontal bar chart for distributions.
    
    Features:
    - Horizontal bar layout
    - Category comparison
    - Value labels
    """
    verbose_name = "Distribution - Bar Chart"

Advanced Visualizations

Specialized chart types for complex data analysis.

class BubbleViz(BaseViz):
    """
    Bubble chart for multi-dimensional data.
    
    Features:
    - X/Y positioning
    - Bubble size mapping
    - Color coding
    - Interactive tooltips
    """
    verbose_name = "Bubble Chart"

Dynamic Form Generation

The visualization framework includes dynamic form generation for chart configuration.

def form_factory(datasource, form_args, extra_fields_dict):
    """
    Generate dynamic forms for visualization configuration.
    
    Args:
        datasource (Datasource or Table): Data source instance
        form_args (dict): Base form arguments
        extra_fields_dict (dict): Additional form fields
        
    Returns:
        OmgWtForm: Generated WTForms form class
    """

class OmgWtForm(Form):
    """Base WTForms form class for visualizations"""

Usage Examples

Creating a Line Chart

from panoramix.viz import TimeSeriesViz

# Form data from user interface
form_data = {
    'datasource': 'events',
    'viz_type': 'line',
    'metrics': ['count'],
    'groupby': [],
    'granularity': 'day',
    'since': '7 days ago',
    'until': 'now'
}

# Create visualization
viz = TimeSeriesViz(datasource, form_data)

# Render chart
chart_html = viz.render()

Creating a Pie Chart

from panoramix.viz import DistributionPieViz

form_data = {
    'datasource': 'sales',
    'viz_type': 'pie', 
    'metrics': ['sum__revenue'],
    'groupby': ['product_category'],
    'row_limit': 10
}

viz = DistributionPieViz(datasource, form_data)
pie_chart = viz.render()

Bubble Chart Analysis

from panoramix.viz import BubbleViz

form_data = {
    'datasource': 'campaigns',
    'viz_type': 'bubble',
    'x': 'impressions',
    'y': 'clicks', 
    'size': 'spend',
    'entity': 'campaign_name',
    'limit': 50
}

viz = BubbleViz(datasource, form_data)
bubble_chart = viz.render()

Highcharts Integration

Panoramix integrates with Highcharts for rich, interactive visualizations.

class HighchartsViz(BaseViz):
    """Base class for Highcharts-powered visualizations"""
    
    def get_df(self):
        """Get pandas DataFrame from query results"""
        
    def to_series(self, df, classed=''):
        """Convert DataFrame to Highcharts series format"""

Chart Configuration

# Default chart configuration
CHART_ARGS = {
    'height': 700,
    'title': None,
    'target_div': 'chart'
}

Error Handling

The visualization framework includes comprehensive error handling for common scenarios:

  • Invalid data source configurations
  • Missing required fields
  • Query execution failures
  • Rendering errors
  • No data conditions

Each visualization type gracefully handles these conditions and provides meaningful error messages to users.

Install with Tessl CLI

npx tessl i tessl/pypi-panoramix

docs

configuration.md

data-sources.md

druid-sources.md

index.md

sql-tables.md

visualizations.md

web-interface.md

tile.json