# SVG Plotter
A lightweight, TypeScript-based library for generating dynamic SVG charts and plots with customizable styling and data visualization capabilities.
## Features
- **Pure SVG Generation**: Creates scalable vector graphics without external dependencies
- **TypeScript Support**: Fully typed interfaces for better development experience
- **Multiple Chart Types**: Support for line charts with optional fill areas and data points
- **Flexible Scaling**: Linear and logarithmic (base 2/10) y-axis scaling
- **Time Series Support**: Built-in time formatting for time-based data
- **Customizable Styling**: Full control over colors, dimensions, grid lines, and visual elements
- **Dynamic Updates**: Real-time data and grid updates without recreating the entire chart
- **Responsive Design**: Configurable dimensions and margins for different layouts
## See Demo - [HERE](https://mumarshahbaz.github.io/SVG-Plotter-deprecated/demo.html)
## Installation
Include the minified JavaScript file directly from jsDelivr CDN:
```html
```
Or via ES6 import in your JavaScript/TypeScript project:
```javascript
import { SVG_GENERATOR } from 'https://cdn.jsdelivr.net/gh/MUmarShahbaz/SVG-Plotter-deprecated@dist/svg_plotter.min.js';
```
## Usage
### Basic Example
```html
SVG Plotter Example
```
### ES6 Module Example
```javascript
import { SVG_GENERATOR } from 'https://cdn.jsdelivr.net/gh/MUmarShahbaz/SVG-Plotter-deprecated@dist/svg_plotter.min.js';
// Define your data
const data: DATA = {
title: "Sample Chart",
grid: {
x: {
title: "Time",
type: "linear",
ticks: {
raw: [0, 1, 2, 3, 4, 5],
formatted: ["0", "1", "2", "3", "4", "5"],
min: 0,
max: 5,
range: 5
},
time_format: null
},
y: {
title: "Value",
type: "linear",
ticks: {
min: 0,
max: 100,
range: 100
},
base: null
}
},
series: [
{
label: "Dataset 1",
color: "#3498db",
data: [10, 25, 45, 30, 60, 80]
}
]
};
// Configure the chart appearance
const config: SVG_CONFIG = {
bg: "#ffffff",
dimensions: {
width: { image: 800, plot: 600 },
height: { image: 600, plot: 400 },
margins: { left: 80, right: 50, top: 50, bottom: 80 }
},
grid: {
gaps: {
x: { gap_by: "val", val: 1 },
y: { gap_by: "val", val: 20 }
},
lines: {
axes: { color: "#2c3e50", width: 2 },
main: { color: "#bdc3c7", width: 1 },
font: { color: "#2c3e50", size: 12 }
}
},
series: {
width: 2,
alpha: 1,
point: { radius: 4, alpha: 1 },
fill: { alpha: 0.3 }
}
};
// Create the chart
const chart = SVG_GENERATOR(config, data, "my-chart");
// Initialize and append to DOM
const svgElement = chart.init(document.body);
chart.updateGrid();
chart.updateData();
```
### Time Series Example
```javascript
const timeData = {
title: "Performance Over Time",
grid: {
x: {
title: "Time",
type: "time",
ticks: {
raw: [0, 60000, 120000, 180000], // milliseconds
formatted: ["0", "1m", "2m", "3m"],
min: 0,
max: 180000,
range: 180000
},
time_format: "m:s"
},
// ... rest of configuration
}
// ... rest of data
};
```
### Logarithmic Scale Example
```javascript
const logData = {
// ... other properties
grid: {
// ... x configuration
y: {
title: "Log Scale",
type: "log",
ticks: {
min: 1,
max: 1000,
range: 999
},
base: 10
}
}
// ... rest of data
};
```
## API Reference
### SVG_GENERATOR(config, data, id)
Creates a new SVG chart object.
**Parameters:**
- `config` (Object): Chart configuration object
- `data` (Object): Chart data object
- `id` (string): Unique identifier for the SVG element
**Returns:** Chart object with the following methods:
#### Methods
- **`init(parent?: HTMLElement)`**: Initialize the SVG element and optionally append to parent
- **`updateGrid(append?: boolean)`**: Update or redraw the grid
- **`updateData(append?: boolean, new_data?: Object, refresh_grid?: boolean)`**: Update chart data
### Data Types
#### Time Formats
- `"ms"`: Milliseconds (e.g., "1500ms")
- `"s.ms"`: Seconds with milliseconds (e.g., "1.500s")
- `"m:s"`: Minutes and seconds (e.g., "1:30")
- `"h:m:s"`: Hours, minutes, seconds (e.g., "1:30:45")
- `"d-h:m"`: Days, hours, minutes (e.g., "2-14:30")
#### Grid Gap Modes
- `"val"`: Gap by data value
- `"px"`: Gap by pixel distance
#### Scale Types
- `"linear"`: Linear scaling
- `"log"`: Logarithmic scaling (base 2 or 10)
- `"time"`: Time-based x-axis
## Configuration Options
### Dimensions
```javascript
dimensions: {
width: { image: number, plot: number },
height: { image: number, plot: number },
margins: { left: number, right: number, top: number, bottom: number }
}
```
### Grid Configuration
```javascript
grid: {
gaps: {
x: { gap_by: "val" | "px", val: number },
y: { gap_by: "val" | "px", val: number } | null
},
lines: {
axes: { color: string, width: number },
main: { color: string, width: number },
font: { color: string, size: number }
}
}
```
### Series Styling
```javascript
series: {
width: number, // Line width
alpha: number, // Line opacity (0-1)
point: { radius: number, alpha: number } | null, // Data points
fill: { alpha: number } | null // Fill area under line
}
```
## Browser Support
This library uses standard DOM APIs and SVG elements, making it compatible with all modern browsers that support:
- SVG 1.1
- ES2017 features
- DOM manipulation
## Contributing
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
## License
This project is licensed under the terms found in the [LICENSE.md](LICENSE.md) file.
## Examples
Check out the `examples/` directory for more detailed usage examples and demos.
---
Built with TypeScript and ❤️ for data visualization.