Skip to content

Commit bfb2af8

Browse files
chore: merge feature branch with selenium fix
2 parents bdeeb33 + 40ca75c commit bfb2af8

10 files changed

Lines changed: 263 additions & 790 deletions

File tree

.github/workflows/ci-plottest.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ jobs:
6666
echo "📦 Installing: uv sync $EXTRAS"
6767
uv sync $EXTRAS
6868
69-
- name: Setup Chrome for Highcharts
70-
if: steps.detect_libs.outputs.has_plots == 'true' && contains(steps.detect_libs.outputs.libraries, 'highcharts')
69+
- name: Setup Chrome for Selenium-based libraries
70+
if: steps.detect_libs.outputs.has_plots == 'true' && (contains(steps.detect_libs.outputs.libraries, 'highcharts') || contains(steps.detect_libs.outputs.libraries, 'bokeh'))
7171
uses: browser-actions/setup-chrome@v1
7272
with:
7373
chrome-version: stable

plots/altair/bar/bar-basic/default.py

Lines changed: 16 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -7,101 +7,21 @@
77
import pandas as pd
88

99

10-
def create_plot(
11-
data: pd.DataFrame,
12-
category: str,
13-
value: str,
14-
*,
15-
color: str = "steelblue",
16-
alpha: float = 0.8,
17-
title: str | None = None,
18-
xlabel: str | None = None,
19-
ylabel: str | None = None,
20-
rotation: int = 0,
21-
**kwargs,
22-
) -> alt.Chart:
23-
"""
24-
Create a basic vertical bar chart.
25-
26-
A fundamental bar chart that visualizes categorical data with numeric values,
27-
ideal for comparing quantities across discrete categories.
28-
29-
Args:
30-
data: Input DataFrame containing the data to plot.
31-
category: Column name for categorical x-axis values.
32-
value: Column name for numeric y-axis values.
33-
color: Bar fill color. Defaults to "steelblue".
34-
alpha: Transparency level for bars (0-1). Defaults to 0.8.
35-
title: Plot title. Defaults to None.
36-
xlabel: X-axis label. Defaults to column name if None.
37-
ylabel: Y-axis label. Defaults to column name if None.
38-
rotation: Rotation angle for x-axis labels. Defaults to 0.
39-
**kwargs: Additional parameters passed to chart properties.
40-
41-
Returns:
42-
Altair Chart object.
43-
44-
Raises:
45-
ValueError: If data is empty.
46-
KeyError: If required columns are not found in data.
47-
48-
Example:
49-
>>> data = pd.DataFrame({
50-
... 'category': ['A', 'B', 'C'],
51-
... 'value': [10, 20, 15]
52-
... })
53-
>>> chart = create_plot(data, 'category', 'value', title='Example')
54-
"""
55-
# Input validation
56-
if data.empty:
57-
raise ValueError("Data cannot be empty")
58-
59-
for col in [category, value]:
60-
if col not in data.columns:
61-
available = ", ".join(data.columns)
62-
raise KeyError(f"Column '{col}' not found. Available: {available}")
63-
64-
# Determine axis labels
65-
x_label = xlabel if xlabel is not None else category
66-
y_label = ylabel if ylabel is not None else value
67-
68-
# Build x-axis configuration
69-
x_axis = alt.Axis(title=x_label, labelAngle=-rotation if rotation != 0 else 0)
70-
71-
# Build y-axis configuration with subtle grid
72-
y_axis = alt.Axis(title=y_label, grid=True, gridOpacity=0.3)
73-
74-
# Create the bar chart
75-
chart = (
76-
alt.Chart(data)
77-
.mark_bar(color=color, opacity=alpha)
78-
.encode(
79-
x=alt.X(f"{category}:N", axis=x_axis, sort=None),
80-
y=alt.Y(f"{value}:Q", axis=y_axis, scale=alt.Scale(domain=[0, data[value].max() * 1.1])),
81-
tooltip=[alt.Tooltip(f"{category}:N", title=x_label), alt.Tooltip(f"{value}:Q", title=y_label)],
82-
)
83-
.properties(width=800, height=450)
84-
)
85-
86-
# Add title if provided
87-
if title is not None:
88-
chart = chart.properties(title=title)
89-
90-
# Configure chart appearance
91-
chart = chart.configure_axis(labelFontSize=12, titleFontSize=14).configure_title(fontSize=16, anchor="middle")
92-
93-
return chart
94-
95-
96-
if __name__ == "__main__":
97-
# Sample data for testing
98-
sample_data = pd.DataFrame(
99-
{"category": ["Product A", "Product B", "Product C", "Product D", "Product E"], "value": [45, 78, 52, 91, 63]}
10+
# Data
11+
data = pd.DataFrame(
12+
{"category": ["Product A", "Product B", "Product C", "Product D", "Product E"], "value": [45, 78, 52, 91, 63]}
13+
)
14+
15+
# Create chart
16+
chart = (
17+
alt.Chart(data)
18+
.mark_bar(color="#306998")
19+
.encode(
20+
x=alt.X("category:N", title="Category", axis=alt.Axis(labelFontSize=16, titleFontSize=20)),
21+
y=alt.Y("value:Q", title="Value", axis=alt.Axis(labelFontSize=16, titleFontSize=20)),
10022
)
23+
.properties(width=1600, height=900, title=alt.Title(text="Basic Bar Chart", fontSize=20))
24+
)
10125

102-
# Create plot
103-
fig = create_plot(sample_data, "category", "value", title="Sales by Product")
104-
105-
# Save
106-
fig.save("plot.png", scale_factor=2.0)
107-
print("Plot saved to plot.png")
26+
# Save as PNG (1600 × 900 with scale_factor=3 = 4800 × 2700)
27+
chart.save("plot.png", scale_factor=3.0)

0 commit comments

Comments
 (0)