diff --git a/plots/highcharts/scatter/scatter-basic/default.py b/plots/highcharts/scatter/scatter-basic/default.py new file mode 100644 index 0000000000..58df30e2e5 --- /dev/null +++ b/plots/highcharts/scatter/scatter-basic/default.py @@ -0,0 +1,101 @@ +""" +scatter-basic: Basic Scatter Plot +Library: highcharts +""" + +import tempfile +import time +import urllib.request +from pathlib import Path + +import numpy as np +from highcharts_core.chart import Chart +from highcharts_core.options import HighchartsOptions +from highcharts_core.options.series.scatter import ScatterSeries +from selenium import webdriver +from selenium.webdriver.chrome.options import Options + + +# Data +np.random.seed(42) +x = np.random.randn(100) * 2 + 10 +y = x * 0.8 + np.random.randn(100) * 2 + +# Create chart with container specified +chart = Chart(container="container") +chart.options = HighchartsOptions() + +# Chart configuration +chart.options.chart = {"type": "scatter", "width": 4800, "height": 2700, "backgroundColor": "#ffffff"} + +# Title +chart.options.title = {"text": "Basic Scatter Plot", "style": {"fontSize": "48px"}} + +# Axes +chart.options.x_axis = { + "title": {"text": "X Value", "style": {"fontSize": "36px"}}, + "labels": {"style": {"fontSize": "28px"}}, + "gridLineWidth": 1, + "gridLineColor": "rgba(0, 0, 0, 0.1)", +} + +chart.options.y_axis = { + "title": {"text": "Y Value", "style": {"fontSize": "36px"}}, + "labels": {"style": {"fontSize": "28px"}}, + "gridLineWidth": 1, + "gridLineColor": "rgba(0, 0, 0, 0.1)", +} + +# Legend +chart.options.legend = {"enabled": False} + +# Create scatter series +series = ScatterSeries() +series.data = [[float(xi), float(yi)] for xi, yi in zip(x, y, strict=True)] +series.name = "Data" +series.color = "#306998" +series.marker = {"radius": 10, "fillColor": "#306998", "lineWidth": 0, "states": {"hover": {"enabled": True}}} + +chart.add_series(series) + +# Credits +chart.options.credits = {"enabled": False} + +# Download Highcharts JS for inline embedding +highcharts_url = "https://code.highcharts.com/highcharts.js" +with urllib.request.urlopen(highcharts_url, timeout=30) as response: + highcharts_js = response.read().decode("utf-8") + +# Generate HTML with inline scripts +html_str = chart.to_js_literal() +html_content = f""" + +
+ + + + + + + +""" + +# Write temp HTML and take screenshot +with tempfile.NamedTemporaryFile(mode="w", suffix=".html", delete=False, encoding="utf-8") as f: + f.write(html_content) + temp_path = f.name + +chrome_options = Options() +chrome_options.add_argument("--headless") +chrome_options.add_argument("--no-sandbox") +chrome_options.add_argument("--disable-dev-shm-usage") +chrome_options.add_argument("--disable-gpu") +chrome_options.add_argument("--window-size=4800,2700") + +driver = webdriver.Chrome(options=chrome_options) +driver.get(f"file://{temp_path}") +time.sleep(5) +driver.save_screenshot("plot.png") +driver.quit() + +Path(temp_path).unlink()