-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdefault.py
More file actions
112 lines (93 loc) · 3.07 KB
/
default.py
File metadata and controls
112 lines (93 loc) · 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
"""
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 PIL import Image
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
chart = Chart(container="container")
chart.options = HighchartsOptions()
# Chart configuration
chart.options.chart = {
"type": "scatter",
"width": 4800,
"height": 2700,
"backgroundColor": "#ffffff",
"spacing": [20, 20, 60, 20],
}
# Title
chart.options.title = {"text": "Basic Scatter Plot", "style": {"fontSize": "48px"}}
# Axes
chart.options.x_axis = {
"title": {"text": "X Value", "style": {"fontSize": "40px"}},
"labels": {"style": {"fontSize": "32px"}},
"gridLineWidth": 1,
"gridLineColor": "rgba(0, 0, 0, 0.1)",
}
chart.options.y_axis = {
"title": {"text": "Y Value", "style": {"fontSize": "40px"}},
"labels": {"style": {"fontSize": "32px"}},
"gridLineWidth": 1,
"gridLineColor": "rgba(0, 0, 0, 0.1)",
}
# Legend (not needed for single series but show it for clarity)
chart.options.legend = {"enabled": False}
# 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": 8, "fillColor": "#306998", "lineWidth": 0, "states": {"hover": {"enabled": True}}}
chart.add_series(series)
# 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"""<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>{highcharts_js}</script>
</head>
<body style="margin:0;">
<div id="container" style="width: 4800px; height: 2700px;"></div>
<script>{html_str}</script>
</body>
</html>"""
# 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=4900,2800")
driver = webdriver.Chrome(options=chrome_options)
driver.get(f"file://{temp_path}")
time.sleep(5)
# Screenshot the full window and crop to exact dimensions
driver.save_screenshot("plot_raw.png")
driver.quit()
# Crop to exact dimensions (4800 x 2700)
with Image.open("plot_raw.png") as img:
cropped = img.crop((0, 0, 4800, 2700))
cropped.save("plot.png")
Path("plot_raw.png").unlink()
Path(temp_path).unlink()