elly99 commited on
Commit
55f4a77
·
verified ·
1 Parent(s): ffcb401

Create visualization/visualization.py

Browse files
Files changed (1) hide show
  1. src/visualization/visualization.py +100 -0
src/visualization/visualization.py ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # © 2025 Elena Marziali — Code released under Apache 2.0 license.
2
+ # See LICENSE in the repository for details.
3
+ # Removal of this copyright is prohibited.
4
+
5
+ # The system can analyze text and generate interactive visualizations
6
+ # (e.g., bar charts, line plots, scatter plots) using Plotly.
7
+
8
+ # === Function to generate the interactive chart ===
9
+ def extract_numeric_values(text):
10
+ """ Extracts numeric ranges from the problem text. """
11
+ pattern = r"(\d+)\s*-\s*(\d+)|(\d+\.\d+|\d+)\s*(K|Pa|m/s)?"
12
+ matches = re.findall(pattern, text)
13
+
14
+ values = []
15
+ for match in matches:
16
+ if match[0] and match[1]: # Range (300 - 600)
17
+ values.append((int(match[0]), int(match[1])))
18
+ elif match[2]: # Single number with optional unit
19
+ values.append(float(match[2]))
20
+
21
+ return values if values else [1, 10] # Default if no numbers found
22
+
23
+ # Determines the most suitable chart type based on content
24
+ def determine_chart_type(text):
25
+ text_lower = text.lower()
26
+ if re.search(r"(growth|decay|population)", text_lower):
27
+ return "exponential_growth"
28
+ elif re.search(r"(oscillation|frequency|wave)", text_lower):
29
+ return "sinusoidal"
30
+ elif re.search(r"(temperature|pressure)", text_lower):
31
+ return "temperature_pressure"
32
+ elif re.search(r"(speed|time|acceleration)", text_lower):
33
+ return "motion"
34
+ elif "linear" in text_lower:
35
+ return "linear"
36
+ elif "logarithmic" in text_lower:
37
+ return "logarithmic"
38
+ elif "gaussian" in text_lower or "normal distribution" in text_lower:
39
+ return "gaussian"
40
+ else:
41
+ return "generic"
42
+
43
+ # Extracts numeric values from text for visualization
44
+ def extract_numeric_values(text):
45
+ numbers = [float(n) for n in re.findall(r"\d+(?:\.\d+)?", text)]
46
+ if len(numbers) >= 2:
47
+ return numbers[:2]
48
+ elif len(numbers) == 1:
49
+ return [numbers[0], numbers[0] + 10]
50
+ else:
51
+ return [1, 10]
52
+
53
+ # Generates and saves the interactive chart
54
+ # The chart is displayed in the notebook and also saved as a PNG image.
55
+ def generate_interactive_chart(problem):
56
+ chart_type = determine_chart_type(problem)
57
+ start, end = extract_numeric_values(problem)
58
+ x = np.linspace(start, end, 100)
59
+ fig = go.Figure()
60
+
61
+ if chart_type == "exponential_growth":
62
+ y = np.exp(x / max(x))
63
+ fig.add_trace(go.Scatter(x=x, y=y, mode="lines", name="Exponential Growth"))
64
+ elif chart_type == "sinusoidal":
65
+ y = np.sin(x)
66
+ fig.add_trace(go.Scatter(x=x, y=y, mode="lines", name="Sinusoidal Wave"))
67
+ elif chart_type == "motion":
68
+ y = x ** 2
69
+ fig.add_trace(go.Scatter(x=x, y=y, mode="lines", name="Speed vs Time"))
70
+ elif chart_type == "linear":
71
+ y = x
72
+ fig.add_trace(go.Scatter(x=x, y=y, mode="lines", name="Linear Trend"))
73
+ elif chart_type == "logarithmic":
74
+ x_log = np.where(x <= 0, 1e-3, x)
75
+ y = np.log(x_log)
76
+ fig.add_trace(go.Scatter(x=x, y=y, mode="lines", name="Logarithmic"))
77
+ elif chart_type == "gaussian":
78
+ mu, sigma = np.mean(x), np.std(x)
79
+ y = np.exp(-((x - mu)**2) / (2 * sigma**2))
80
+ fig.add_trace(go.Scatter(x=x, y=y, mode="lines", name="Gaussian"))
81
+ else:
82
+ y = np.sin(x)
83
+ fig.add_trace(go.Scatter(x=x, y=y, mode="lines", name="Generic"))
84
+
85
+ caption = f"Visualization of the '{chart_type}' model from {start} to {end} for the problem: \"{problem}\""
86
+ fig.update_layout(
87
+ title=caption,
88
+ xaxis_title="X Axis",
89
+ yaxis_title="Y Axis",
90
+ template="plotly_white"
91
+ )
92
+ fig.show()
93
+
94
+ fig.write_image("grafico_output.png", format="png", width=800, height=500)
95
+ print("Image saved as 'grafico_output.png'")
96
+ return fig, caption
97
+
98
+ # === Run example chart ===
99
+ example_problem = "growth"
100
+ fig, caption = generate_interactive_chart(example_problem)