An interactive data visualization platform built on SQLAlchemy and Druid.io
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
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.
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)
"""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),
])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"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"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"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"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"""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()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()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()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"""# Default chart configuration
CHART_ARGS = {
'height': 700,
'title': None,
'target_div': 'chart'
}The visualization framework includes comprehensive error handling for common scenarios:
Each visualization type gracefully handles these conditions and provides meaningful error messages to users.
Install with Tessl CLI
npx tessl i tessl/pypi-panoramix