Air Quality Application Tutorial with LightningChart Python & Open Meteo's API

Tutorial

Assisted by AI

Follow this air quality application tutorial using Open Meteo's API and LightningChart Python data visualization library for advanced data analysis.
Soroush Sohrabian

Soroush Sohrabian

Software Developer

LinkedIn icon
Air-Quality-Application-Tutorial-Cover

Introduction to the Project

Based on the importance of air pollution in our life and its impact on health, It is essential to monitor air quality in real-time.

This air quality application tutorial with LightningChart Python & Open Meteo focuses on creating a real-time air quality monitoring dashboard using Python. This application gets data from Open-Meteo’s Air Quality API and uses LightningChart Python for visualization.

About the Dataset and Open-Meteo

Open-Meteo is a free weather API that provides historical, real-time, and forecast data on weather conditions, air quality, and environmental parameters. The dataset used in this project includes:

  • PM10 (Particulate Matter 10)
  • PM2.5 (Particulate Matter 2.5)
  • Nitrogen Dioxide (NO₂)
  • Ozone (O₃)
  • Carbon Monoxide (CO)
  • Sulfur Dioxide (SO₂)
  • UV Index
  • Temperature, Humidity, and Wind Direction

By integrating Open-Meteo’s API, we can fetch past, current, and future air quality conditions and visualize them using interactive dashboards.

LightningChart Python

LightningChart Python is a high-performance data visualization library that offers real-time and different interactive charting. It allows the creation of 2D and 3D visualizations that makies it ideal for real-time weather monitoring.

LCPython1

Features and Chart Types Used in the Project

    In this project, we used several LightningChart components:

    • Line Charts: To show air quality trends over time.
    • Bar Charts: For displaying historical, current and forecasted pollutant concentrations.
    • Polar Charts: To analyze PM2.5 by wind direction.
    • Radar Charts: For comparing multiple air quality parameters in real-time.
    • Gauge Charts: To display UV index levels.
    • 3D Charts: To visualize weather and air quality conditions.

    Performance Characteristics

    LightningChart Python provides:

    • GPU acceleration that enables smooth visualization even with large datasets.
    • Real-time updates which makes it ideal for monitoring live weather changes.
    • Low CPU and memory usage which improves dashboard responsiveness.

    Setting Up Python Environment

    Before running the project, install Python and the other required libraries using:

    pip install requests pandas pytz lightningchart

    Overview of Libraries Used

    • NumPy: For handling and processing weather data.
    • Pandas: For handling time-series air quality data
    • Requests: To fetch data from the Open-Meteo API.
    • Pytz: For handling timezone conversions
    • Trimesh: For 3D weather condition models.
    • LightningChart: To create interactive visualizations.

    Setting Up Your Development Environment

    1. Set up a virtual environment:
    python -m venv rf_analysis_env
    source rf_analysis_env/bin/activate  # On Windows: rf_analysis_env\Scripts\activate
    1. Use Visual Studio Code (VSCode) for a streamlined development experience.

    Loading and Processing Data

    To create this Open Meteo weather application, we will fetch the weather data using the following function:

    import requests
    import pandas as pd
    
    API_URL = "https://air-quality-api.open-meteo.com/v1/air-quality"
    params = {
        "latitude": 60.1699,
        "longitude": 24.9384,
        "hourly": "pm10,pm2_5,nitrogen_dioxide,ozone,carbon_monoxide",
        "past_days": 1,
        "forecast_days": 1,
        "timezone": "auto"
    }
    response = requests.get(API_URL, params=params)
    data = response.json()

    Handling and Preprocessing the Data

    After fetching data, it is moved into a DataFrame for easier analysis and visualization.

    df = pd.DataFrame(data["hourly"])
    df["time"] = pd.to_datetime(df["time"])

    Visualizing Data with LightningChart Python

    Here are some examples that shows how we created key visualizations:

    Line chart to display PM10 trends

    import lightningchart as lc
    
    dashboard = lc.Dashboard(rows=6, columns=8, theme=lc.Themes.Dark)
    chart = dashboard.ChartXY(column_index=0, row_index=0, column_span=8, row_span=4)
    chart.set_title("PM10 Levels Over Time")
    
    series = chart.add_line_series(data_pattern="ProgressiveX")
    for index, row in df.iterrows():
        series.add([row["time"].timestamp() * 1000], [row["pm10"]])
    
    dashboard.open()

    Polar Chart (PM2.5 by Wind Direction

    # Create a dashboard
    dashboard = lc.Dashboard(rows=1, columns=1)
    
    # Create a Polar Chart
    polar_chart = dashboard.PolarChart(column_index=0, row_index=0)
    polar_chart.set_title("PM2.5 Concentration by Wind Direction (Scaled)")
    
    # Generate random wind direction and PM2.5 concentration data
    for i in range(8):
        sector = polar_chart.add_sector()
        wind_direction = i * 45  # Simulated wind directions
        pm2_5_val = random.uniform(5, 50)  # Simulated PM2.5 values
        sector.set_name(f"PM2.5 {pm2_5_val:.1f} μg/m³")
        sector.set_amplitude_start(0)
        sector.set_amplitude_end(pm2_5_val / 5)  # Scaled
        sector.set_angle_start(wind_direction - 10)
        sector.set_angle_end(wind_direction + 10)
        sector.set_color(lc.Color(0, 207, 255))
        sector.set_stroke(color=lc.Color(0, 161, 255), thickness=1)
    
    dashboard.open()

    Radar (Spider) Chart (European Air Quality Indicators)

    # Create a dashboard
    dashboard = lc.Dashboard(rows=1, columns=1)
    
    # Create Radar Chart
    radar_chart = dashboard.SpiderChart(column_index=0, row_index=0)
    radar_chart.set_title("European Air Quality Indicators")
    
    # Define AQI Components
    aqi_components = {
        "PM2.5": 30,
        "PM10": 22,
        "NO₂": 15,
        "O₃": 18,
        "SO₂": 10
    }
    
    # Add axis labels
    for key in aqi_components.keys():
        radar_chart.add_axis(key)
    
    # Add data series
    series_radar = radar_chart.add_series()
    series_radar.set_name("Current AQI Data")
    series_radar.add_points([{"axis": key, "value": value} for key, value in aqi_components.items()])
    
    dashboard.open()

    Gauge Chart (UV Index)

    # Create a dashboard
    dashboard = lc.Dashboard(rows=1, columns=1)
    
    # Create Gauge Chart
    gauge_chart = dashboard.GaugeChart(column_index=0, row_index=0)
    gauge_chart.set_title("Current UV Index")
    
    # Configure gauge properties
    gauge_chart.set_angle_interval(start=225, end=-45)
    gauge_chart.set_interval(start=0, end=12)
    gauge_chart.set_bar_thickness(15)
    gauge_chart.set_value(5)  # Example value
    gauge_chart.set_value_indicators([
        {"start": 0, "end": 2, "color": lc.Color("green")},
        {"start": 2, "end": 5, "color": lc.Color("yellow")},
        {"start": 5, "end": 7, "color": lc.Color("orange")},
        {"start": 7, "end": 10, "color": lc.Color("red")},
        {"start": 10, "end": 12, "color": lc.Color("darkred")},
    ])
    
    dashboard.open()

    Bar Chart (Air Quality Components like PM10, PM2.5, NO2)

    # Create a dashboard
    dashboard = lc.Dashboard(rows=1, columns=1)
    
    # Create a Bar Chart
    bar_chart = dashboard.BarChart(column_index=0, row_index=0, vertical=True)
    bar_chart.set_title("PM2.5 and PM10 Levels")
    
    # Sample data
    categories = ["PM2.5", "PM10", "NO2", "O3", "CO"]
    values = [random.uniform(5, 50) for _ in categories]
    
    # Add data to bar chart
    data_list = [{"category": cat, "value": val} for cat, val in zip(categories, values)]
    bar_chart.set_data(data_list)
    
    dashboard.open()

    3D Chart (Air Quality Models)

    # Create a dashboard
    dashboard = lc.Dashboard(rows=1, columns=1)
    
    # Create 3D Chart
    chart_3d = dashboard.Chart3D(row_index=0, column_index=0)
    chart_3d.set_title("Air Quality 3D Visualization")
    
    # Load a 3D model (Example: air quality model)
    object_air_quality = trimesh.load("path/to/air_quality.obj")  # Replace with actual file path
    
    # Extract model geometry
    vertices = object_air_quality.vertices.flatten().tolist()
    indices = object_air_quality.faces.flatten().tolist()
    normals = object_air_quality.vertex_normals.flatten().tolist()
    
    # Add model to the 3D chart
    model_air_quality = chart_3d.add_mesh_model()
    model_air_quality.set_model_geometry(vertices=vertices, indices=indices, normals=normals)
    model_air_quality.set_scale(1.5).set_model_location(0, 0.3, 0)
    
    dashboard.open()

    Real-Time and the Next Six Hours Forecasting Dashboard

    Weekly Forecasting Dashboard

    Customizing the Open Meteo Weather Application Visualizations

    • Color Palettes: Used different gradient colors to show better data intensities.
    • Legends & Labels: Improved readability of weather parameters.

    Conclusion

    This air quality application tutorial demonstrates how to integrate Open-Meteo’s Air Quality API with LightningChart Python to create real-time environmental monitoring dashboard. By visualizing historical, real-time and forecasted data, users can track air quality trends and make decisions about outdoor activities based on pollution control dashboard.

    Continue learning with LightningChart

    How to Create a Strip Chart

    How to Create a Strip Chart

    Written by a human | Updated on April 9th, 2025What is a Strip chart application and what are the modern equivalents to it?  Before computers exist or were taking their first steps, a Strip chart was a way to visualize an analog electrical signal. Voltage was...

    Data Visualization Template for Electron JS | LightningChart®

    Updated on April 4th, 2025 | Written by humanAre you already building cross-platform applications with Electron JS?  In some of our previous articles, we’ve worked on TypeScript projects where we created pie charts and vibration chart applications. And as we...

    Bar chart race JavaScript

    Bar chart race JavaScript

    Updated on April 14th, 2025 | Written by humanBar chart race JavaScript  When I wrote this article, the COVID-19 pandemic was at its peak point. Today, things are much better thanks to vaccinations that continued their steady positive global effect. With this bar...