-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdefault.py
More file actions
107 lines (88 loc) · 2.77 KB
/
default.py
File metadata and controls
107 lines (88 loc) · 2.77 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
"""
line-basic: Basic Line Plot
Library: highcharts
"""
import tempfile
import time
import urllib.request
from pathlib import Path
from highcharts_core.chart import Chart
from highcharts_core.options import HighchartsOptions
from highcharts_core.options.series.area import LineSeries
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Data
time_values = ["1", "2", "3", "4", "5", "6", "7"]
value_data = [10, 15, 13, 18, 22, 19, 25]
# Create chart
chart = Chart(container="container")
chart.options = HighchartsOptions()
# Chart configuration
chart.options.chart = {
"type": "line",
"width": 4800,
"height": 2700,
"backgroundColor": "#ffffff",
"style": {"fontFamily": "Arial, sans-serif"},
}
# Title
chart.options.title = {"text": "Basic Line Plot", "style": {"fontSize": "48px"}}
# Axes
chart.options.x_axis = {
"title": {"text": "Time", "style": {"fontSize": "40px"}},
"categories": time_values,
"labels": {"style": {"fontSize": "32px"}},
"lineWidth": 2,
"tickWidth": 2,
}
chart.options.y_axis = {
"title": {"text": "Value", "style": {"fontSize": "40px"}},
"labels": {"style": {"fontSize": "32px"}},
"gridLineWidth": 1,
"gridLineColor": "#e0e0e0",
}
# Legend
chart.options.legend = {"enabled": False}
# Create series
series = LineSeries()
series.data = value_data
series.name = "Value"
series.color = "#306998"
series.line_width = 4
series.marker = {"enabled": True, "radius": 8, "fillColor": "#306998"}
chart.add_series(series)
# Download Highcharts JS for headless Chrome
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)
# Capture the container element to get exact chart dimensions
container = driver.find_element("id", "container")
container.screenshot("plot.png")
driver.quit()
Path(temp_path).unlink()