|
7 | 7 | import pandas as pd |
8 | 8 |
|
9 | 9 |
|
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)), |
100 | 22 | ) |
| 23 | + .properties(width=1600, height=900, title=alt.Title(text="Basic Bar Chart", fontSize=20)) |
| 24 | +) |
101 | 25 |
|
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