--- title: Chart widgets --- ## Overview Filament comes with many "chart" widget templates, which you can use to display real-time, interactive charts. Start by creating a widget with the command: ```bash php artisan make:filament-widget BlogPostsChart --chart ``` There is a single `ChartWidget` class that is extended for all charts. The type of chart is set by the `getType()` method. In this example, that method returns the string `'line'`. The `protected static ?string $heading` variable is used to set the heading that describes the chart. If you need to set the heading dynamically, you can override the `getHeading()` method. The `getData()` method is used to return an array of datasets and labels. Each dataset is a labeled array of points to plot on the chart, and each label is a string. This structure is identical to the [Chart.js](https://www.chartjs.org/docs) library, which Filament uses to render charts. You may use the [Chart.js documentation](https://www.chartjs.org/docs) to fully understand the possibilities to return from `getData()`, based on the chart type. ```php [ [ 'label' => 'Blog posts created', 'data' => [0, 10, 5, 2, 21, 32, 45, 74, 65, 45, 77, 89], ], ], 'labels' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], ]; } protected function getType(): string { return 'line'; } } ``` Now, check out your widget in the dashboard. ## Available chart types Below is a list of available chart widget classes which you may extend, and their corresponding [Chart.js](https://www.chartjs.org/docs) documentation page, for inspiration on what to return from `getData()`: - `Filament\Widgets\BarChartWidget` - [Chart.js documentation](https://www.chartjs.org/docs/latest/charts/bar) - `Filament\Widgets\BubbleChartWidget` - [Chart.js documentation](https://www.chartjs.org/docs/latest/charts/bubble) - `Filament\Widgets\DoughnutChartWidget` - [Chart.js documentation](https://www.chartjs.org/docs/latest/charts/doughnut) - `Filament\Widgets\LineChartWidget` - [Chart.js documentation](https://www.chartjs.org/docs/latest/charts/line) - `Filament\Widgets\PieChartWidget` - [Chart.js documentation](https://www.chartjs.org/docs/latest/charts/doughnut) - `Filament\Widgets\PolarAreaChartWidget` - [Chart.js documentation](https://www.chartjs.org/docs/latest/charts/polar) - `Filament\Widgets\RadarChartWidget` - [Chart.js documentation](https://www.chartjs.org/docs/latest/charts/radar) - `Filament\Widgets\ScatterChartWidget` - [Chart.js documentation](https://www.chartjs.org/docs/latest/charts/scatter) ## Customizing the chart color You can customize the color of the chart data by setting the `$color` property to either `danger`, `gray`, `info`, `primary`, `success` or `warning`: ```php protected static string $color = 'info'; ``` If you're looking to customize the color further, or use multiple colors across multiple datasets, you can still make use of Chart.js's [color options](https://www.chartjs.org/docs/latest/general/colors.html) in the data: ```php protected function getData(): array { return [ 'datasets' => [ [ 'label' => 'Blog posts created', 'data' => [0, 10, 5, 2, 21, 32, 45, 74, 65, 45, 77, 89], 'backgroundColor' => '#36A2EB', 'borderColor' => '#9BD0F5', ], ], 'labels' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], ]; } ``` ## Generating chart data from an Eloquent model To generate chart data from an Eloquent model, Filament recommends that you install the `flowframe/laravel-trend` package. You can view the [documentation](https://github.com/Flowframe/laravel-trend). Here is an example of generating chart data from a model using the `laravel-trend` package: ```php use Flowframe\Trend\Trend; use Flowframe\Trend\TrendValue; protected function getData(): array { $data = Trend::model(BlogPost::class) ->between( start: now()->startOfYear(), end: now()->endOfYear(), ) ->perMonth() ->count(); return [ 'datasets' => [ [ 'label' => 'Blog posts', 'data' => $data->map(fn (TrendValue $value) => $value->aggregate), ], ], 'labels' => $data->map(fn (TrendValue $value) => $value->date), ]; } ``` ## Filtering chart data You can set up chart filters to change the data shown on chart. Commonly, this is used to change the time period that chart data is rendered for. To set a default filter value, set the `$filter` property: ```php public ?string $filter = 'today'; ``` Then, define the `getFilters()` method to return an array of values and labels for your filter: ```php protected function getFilters(): ?array { return [ 'today' => 'Today', 'week' => 'Last week', 'month' => 'Last month', 'year' => 'This year', ]; } ``` You can use the active filter value within your `getData()` method: ```php protected function getData(): array { $activeFilter = $this->filter; // ... } ``` ## Live updating chart data (polling) By default, chart widgets refresh their data every 5 seconds. To customize this, you may override the `$pollingInterval` property on the class to a new interval: ```php protected static ?string $pollingInterval = '10s'; ``` Alternatively, you may disable polling altogether: ```php protected static ?string $pollingInterval = null; ``` ## Setting a maximum chart height You may place a maximum height on the chart to ensure that it doesn't get too big, using the `$maxHeight` property: ```php protected static ?string $maxHeight = '300px'; ``` ## Setting chart configuration options You may specify an `$options` variable on the chart class to control the many configuration options that the Chart.js library provides. For instance, you could turn off the [legend](https://www.chartjs.org/docs/latest/configuration/legend.html) for `LineChartWidget` class: ```php protected static ?array $options = [ 'plugins' => [ 'legend' => [ 'display' => false, ], ], ]; ``` Alternatively, you can override the `getOptions()` method to return a dynamic array of options: ```php protected function getOptions(): array { return [ 'plugins' => [ 'legend' => [ 'display' => false, ], ], ]; } ``` These PHP arrays will get transformed into JSON objects when the chart is rendered. If you want to return raw JavaScript from this method instead, you can return a `RawJs` object. This is useful if you want to use a JavaScript callback function, for example: ```php use Filament\Support\RawJs; protected function getOptions(): RawJs { return RawJs::make(<< '€' + value, }, }, }, } JS); } ``` ## Adding a description You may add a description, below the heading of the chart, using the `getDescription()` method: ```php public function getDescription(): ?string { return 'The number of blog posts published per month.'; } ``` ## Disabling lazy loading By default, widgets are lazy-loaded. This means that they will only be loaded when they are visible on the page. To disable this behavior, you may override the `$isLazy` property on the widget class: ```php protected static bool $isLazy = true; ```