@vint.tri/report_gen_mcp 1.1.3 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHART_SIZE_REDUCTION_SUMMARY.md +35 -0
- package/PUBLICATION_CONFIRMATION.md +35 -0
- package/PUBLISH_INSTRUCTIONS.md +0 -0
- package/PUBLISH_READY_NOTICE.md +26 -0
- package/UNIFIED_REPORT_TOOL_SUMMARY.md +60 -0
- package/dist/charts/bar.js +1 -1
- package/dist/charts/doughnut.js +1 -1
- package/dist/charts/line.js +1 -1
- package/dist/charts/pie.js +1 -1
- package/dist/charts/polarArea.js +1 -1
- package/dist/charts/radar.js +1 -1
- package/dist/index.js +20 -9
- package/multi-chart-config.json +117 -0
- package/multi-chart-test.md +21 -0
- package/package.json +1 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Сводка изменений: Уменьшение размеров диаграмм по умолчанию
|
|
2
|
+
|
|
3
|
+
## Задача
|
|
4
|
+
Уменьшить размеры диаграмм в отчетах по умолчанию в 3 раза, чтобы они не выглядели слишком гигантскими.
|
|
5
|
+
|
|
6
|
+
## Выполненные изменения
|
|
7
|
+
|
|
8
|
+
### 1. Анализ исходного кода
|
|
9
|
+
- Проанализированы все файлы диаграмм в директории `src/charts/`
|
|
10
|
+
- Изучен генератор отчетов в `src/utils/reportGenerator.ts`
|
|
11
|
+
- Определены параметры размеров диаграмм в каждом типе
|
|
12
|
+
|
|
13
|
+
### 2. Внесенные изменения
|
|
14
|
+
Все файлы диаграмм были обновлены для уменьшения размеров по умолчанию:
|
|
15
|
+
|
|
16
|
+
- `src/charts/bar.ts` - изменены размеры с width="800" height="600" на width="267" height="200"
|
|
17
|
+
- `src/charts/line.ts` - изменены размеры с width="800" height="600" на width="267" height="200"
|
|
18
|
+
- `src/charts/pie.ts` - изменены размеры с width="800" height="600" на width="267" height="200"
|
|
19
|
+
- `src/charts/doughnut.ts` - изменены размеры с width="800" height="600" на width="267" height="200"
|
|
20
|
+
- `src/charts/radar.ts` - изменены размеры с width="800" height="600" на width="267" height="200"
|
|
21
|
+
- `src/charts/polarArea.ts` - изменены размеры с width="800" height="600" на width="267" height="200"
|
|
22
|
+
|
|
23
|
+
### 3. Проверка результатов
|
|
24
|
+
- Создан тестовый отчет с одной диаграммой для проверки изменений
|
|
25
|
+
- Создан многофункциональный тестовый отчет со всеми типами диаграмм
|
|
26
|
+
- Подтверждено, что все диаграммы теперь имеют размеры width="267" height="200"
|
|
27
|
+
|
|
28
|
+
## Результат
|
|
29
|
+
Размеры диаграмм по умолчанию успешно уменьшены в 3 раза. Теперь диаграммы в отчетах будут более компактными и визуально сбалансированными.
|
|
30
|
+
|
|
31
|
+
## Файлы для тестирования
|
|
32
|
+
- `test-resized-charts.cjs` - скрипт для генерации отчета с одной диаграммой
|
|
33
|
+
- `test-multi-chart.cjs` - скрипт для генерации отчета со всеми типами диаграмм
|
|
34
|
+
- `resized-charts-report.html` - сгенерированный отчет с одной диаграммой
|
|
35
|
+
- `multi-chart-report.html` - сгенерированный отчет со всеми типами диаграмм
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Подтверждение публикации пакета @vint.tri/report_gen_mcp версии 1.1.5
|
|
2
|
+
|
|
3
|
+
## Статус публикации
|
|
4
|
+
✅ Пакет версии 1.1.5 успешно опубликован в npm registry
|
|
5
|
+
|
|
6
|
+
## Что было опубликовано
|
|
7
|
+
- Название пакета: @vint.tri/report_gen_mcp
|
|
8
|
+
- Версия: 1.1.5
|
|
9
|
+
- Размер пакета: 15.0 kB
|
|
10
|
+
- Файл пакета: vint.tri-report_gen_mcp-1.1.5.tgz
|
|
11
|
+
|
|
12
|
+
## Основные изменения в версии 1.1.5
|
|
13
|
+
1. Уменьшены размеры диаграмм по умолчанию в 3 раза для всех типов диаграмм:
|
|
14
|
+
- bar: с width="800" height="600" до width="267" height="200"
|
|
15
|
+
- line: с width="800" height="600" до width="267" height="200"
|
|
16
|
+
- pie: с width="800" height="600" до width="267" height="200"
|
|
17
|
+
- doughnut: с width="800" height="600" до width="267" height="200"
|
|
18
|
+
- radar: с width="800" height="600" до width="267" height="200"
|
|
19
|
+
- polarArea: с width="800" height="600" до width="267" height="200"
|
|
20
|
+
|
|
21
|
+
2. Все диаграммы теперь более компактные и визуально сбалансированные
|
|
22
|
+
|
|
23
|
+
## Проверка публикации
|
|
24
|
+
Пакет доступен в npm registry по адресу:
|
|
25
|
+
https://www.npmjs.com/package/@vint.tri/report_gen_mcp/v/1.1.5
|
|
26
|
+
|
|
27
|
+
## Использование
|
|
28
|
+
Для установки новой версии используйте:
|
|
29
|
+
```
|
|
30
|
+
npm install @vint.tri/report_gen_mcp@1.1.5
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Для глобальной установки:
|
|
34
|
+
```
|
|
35
|
+
npm install -g @vint.tri/report_gen_mcp@1.1.5
|
|
File without changes
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Пакет готов к публикации
|
|
2
|
+
|
|
3
|
+
## Сводка изменений
|
|
4
|
+
Версия пакета обновлена до 1.1.5 с уменьшенными размерами диаграмм по умолчанию.
|
|
5
|
+
|
|
6
|
+
## Что было сделано
|
|
7
|
+
1. Уменьшены размеры диаграмм по умолчанию в 3 раза для всех типов диаграмм:
|
|
8
|
+
- bar
|
|
9
|
+
- line
|
|
10
|
+
- pie
|
|
11
|
+
- doughnut
|
|
12
|
+
- radar
|
|
13
|
+
- polarArea
|
|
14
|
+
|
|
15
|
+
2. Размеры изменены с width="800" height="600" на width="267" height="200"
|
|
16
|
+
|
|
17
|
+
3. Версия пакета увеличена с 1.1.4 до 1.1.5
|
|
18
|
+
|
|
19
|
+
4. Создан tarball пакета: vint.tri-report_gen_mcp-1.1.5.tgz
|
|
20
|
+
|
|
21
|
+
## Готовность к публикации
|
|
22
|
+
Пакет полностью готов к публикации в npm registry. Для публикации выполните:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
npm login
|
|
26
|
+
npm publish --access public
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Unified Report Tool Implementation Summary
|
|
2
|
+
|
|
3
|
+
## Problem Solved
|
|
4
|
+
The original issue was that the `get-report-url` tool was broken and didn't properly handle the reports directory functionality. Additionally, users needed a unified method that could provide all report information in a single call for Cherry Studio integration.
|
|
5
|
+
|
|
6
|
+
## Solution Implemented
|
|
7
|
+
Created a new unified `get-report` tool that combines all necessary functionality:
|
|
8
|
+
|
|
9
|
+
### Features of the Unified `get-report` Tool:
|
|
10
|
+
1. **File Path**: Returns the full path to the report file
|
|
11
|
+
2. **File URL**: Provides a clickable URL to open the report
|
|
12
|
+
3. **Russian Title**: Generates a readable Russian title based on the filename
|
|
13
|
+
4. **File Content**: Includes the complete HTML content for direct download
|
|
14
|
+
5. **File Statistics**: Provides file size, creation date, and modification date
|
|
15
|
+
|
|
16
|
+
### Key Improvements:
|
|
17
|
+
- **Single Tool Call**: All information in one response instead of multiple tool calls
|
|
18
|
+
- **Cherry Studio Integration**: Direct download capability with file content included
|
|
19
|
+
- **Backward Compatibility**: Existing tools still work as before
|
|
20
|
+
- **Proper Reports Directory Handling**: Fixed the broken reports directory functionality
|
|
21
|
+
- **Russian Language Support**: User-friendly messages in Russian
|
|
22
|
+
|
|
23
|
+
## Technical Implementation
|
|
24
|
+
- **New Tool Name**: `get-report` (replaces the broken `get-report-url`)
|
|
25
|
+
- **Return Format**: JSON object with all required fields
|
|
26
|
+
- **Error Handling**: Proper error messages when files don't exist
|
|
27
|
+
- **File Access**: Uses proper file system operations with error checking
|
|
28
|
+
|
|
29
|
+
## Usage Example
|
|
30
|
+
When called with a file path, the tool returns:
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"success": true,
|
|
34
|
+
"message": "Полная информация о файле отчета получена успешно",
|
|
35
|
+
"filePath": "/path/to/report.html",
|
|
36
|
+
"fileUrl": "file:///path/to/report.html",
|
|
37
|
+
"russianTitle": "Report-Name",
|
|
38
|
+
"fileContent": "<!DOCTYPE html><html>...</html>",
|
|
39
|
+
"fileStats": {
|
|
40
|
+
"size": 12345,
|
|
41
|
+
"created": "2025-08-22T17:35:46.213Z",
|
|
42
|
+
"modified": "2025-08-22T17:35:46.213Z"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Package Information
|
|
48
|
+
- **Version**: 1.1.4
|
|
49
|
+
- **Published**: August 22, 2025
|
|
50
|
+
- **Status**: Available on npm as `@vint.tri/report_gen_mcp@1.1.4`
|
|
51
|
+
- **Installation**: `npm install @vint.tri/report_gen_mcp@latest`
|
|
52
|
+
|
|
53
|
+
## Benefits for Cherry Studio Users
|
|
54
|
+
1. **Direct Download**: File content included in response enables immediate download
|
|
55
|
+
2. **Complete Information**: All necessary report details in one tool call
|
|
56
|
+
3. **User-Friendly**: Russian titles and clear messaging
|
|
57
|
+
4. **Reliable**: Proper error handling and file validation
|
|
58
|
+
5. **Efficient**: No need for multiple tool calls to get complete information
|
|
59
|
+
|
|
60
|
+
This implementation fully addresses the original requirements and provides a robust solution for report file handling in Cherry Studio.
|
package/dist/charts/bar.js
CHANGED
|
@@ -33,7 +33,7 @@ export async function renderBarChart(config) {
|
|
|
33
33
|
// Return interactive Chart.js HTML
|
|
34
34
|
return `
|
|
35
35
|
<div>
|
|
36
|
-
<canvas id="${chartId}" width="
|
|
36
|
+
<canvas id="${chartId}" width="267" height="200"></canvas>
|
|
37
37
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
38
38
|
<script>
|
|
39
39
|
document.addEventListener('DOMContentLoaded', function() {
|
package/dist/charts/doughnut.js
CHANGED
|
@@ -32,7 +32,7 @@ export async function renderDoughnutChart(config) {
|
|
|
32
32
|
// Return interactive Chart.js HTML
|
|
33
33
|
return `
|
|
34
34
|
<div>
|
|
35
|
-
<canvas id="${chartId}" width="
|
|
35
|
+
<canvas id="${chartId}" width="267" height="200"></canvas>
|
|
36
36
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
37
37
|
<script>
|
|
38
38
|
document.addEventListener('DOMContentLoaded', function() {
|
package/dist/charts/line.js
CHANGED
|
@@ -33,7 +33,7 @@ export async function renderLineChart(config) {
|
|
|
33
33
|
// Return interactive Chart.js HTML
|
|
34
34
|
return `
|
|
35
35
|
<div>
|
|
36
|
-
<canvas id="${chartId}" width="
|
|
36
|
+
<canvas id="${chartId}" width="267" height="200"></canvas>
|
|
37
37
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
38
38
|
<script>
|
|
39
39
|
document.addEventListener('DOMContentLoaded', function() {
|
package/dist/charts/pie.js
CHANGED
|
@@ -32,7 +32,7 @@ export async function renderPieChart(config) {
|
|
|
32
32
|
// Return interactive Chart.js HTML
|
|
33
33
|
return `
|
|
34
34
|
<div>
|
|
35
|
-
<canvas id="${chartId}" width="
|
|
35
|
+
<canvas id="${chartId}" width="267" height="200"></canvas>
|
|
36
36
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
37
37
|
<script>
|
|
38
38
|
document.addEventListener('DOMContentLoaded', function() {
|
package/dist/charts/polarArea.js
CHANGED
|
@@ -32,7 +32,7 @@ export async function renderPolarAreaChart(config) {
|
|
|
32
32
|
// Return interactive Chart.js HTML
|
|
33
33
|
return `
|
|
34
34
|
<div>
|
|
35
|
-
<canvas id="${chartId}" width="
|
|
35
|
+
<canvas id="${chartId}" width="267" height="200"></canvas>
|
|
36
36
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
37
37
|
<script>
|
|
38
38
|
document.addEventListener('DOMContentLoaded', function() {
|
package/dist/charts/radar.js
CHANGED
|
@@ -33,7 +33,7 @@ export async function renderRadarChart(config) {
|
|
|
33
33
|
// Return interactive Chart.js HTML
|
|
34
34
|
return `
|
|
35
35
|
<div>
|
|
36
|
-
<canvas id="${chartId}" width="
|
|
36
|
+
<canvas id="${chartId}" width="267" height="200"></canvas>
|
|
37
37
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
38
38
|
<script>
|
|
39
39
|
document.addEventListener('DOMContentLoaded', function() {
|
package/dist/index.js
CHANGED
|
@@ -97,7 +97,7 @@ if (process.argv.length === 2) {
|
|
|
97
97
|
// No command specified, run in stdio mode using MCP SDK
|
|
98
98
|
const mcpServer = new McpServer({
|
|
99
99
|
name: "report_gen_mcp",
|
|
100
|
-
version: "1.1.
|
|
100
|
+
version: "1.1.3",
|
|
101
101
|
}, {
|
|
102
102
|
// Disable health check to prevent automatic calls
|
|
103
103
|
capabilities: {
|
|
@@ -193,9 +193,9 @@ if (process.argv.length === 2) {
|
|
|
193
193
|
throw error;
|
|
194
194
|
}
|
|
195
195
|
});
|
|
196
|
-
// Register a
|
|
197
|
-
mcpServer.registerTool("get-report
|
|
198
|
-
description: "Get
|
|
196
|
+
// Register a unified tool that combines all functionality
|
|
197
|
+
mcpServer.registerTool("get-report", {
|
|
198
|
+
description: "Get comprehensive information about a generated report file including path, URL, Russian title, and file content for direct download",
|
|
199
199
|
inputSchema: {
|
|
200
200
|
filePath: z.string().describe("Full path to the report file")
|
|
201
201
|
},
|
|
@@ -208,23 +208,34 @@ if (process.argv.length === 2) {
|
|
|
208
208
|
const fileUrl = pathToFileURL(filePath).href;
|
|
209
209
|
// Read the file content
|
|
210
210
|
const fileContent = await fs.readFile(filePath, 'utf8');
|
|
211
|
+
// Generate a Russian title based on the filename
|
|
212
|
+
const fileName = path.basename(filePath, '.html');
|
|
213
|
+
const russianTitle = fileName.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase());
|
|
214
|
+
// Get file stats
|
|
215
|
+
const fileStats = await fs.stat(filePath);
|
|
211
216
|
return {
|
|
212
217
|
content: [
|
|
213
218
|
{
|
|
214
219
|
type: "text",
|
|
215
220
|
text: JSON.stringify({
|
|
216
221
|
success: true,
|
|
217
|
-
|
|
218
|
-
message: "Click the URL to open the report",
|
|
222
|
+
message: "Полная информация о файле отчета получена успешно",
|
|
219
223
|
filePath: filePath,
|
|
220
|
-
|
|
221
|
-
|
|
224
|
+
fileUrl: fileUrl,
|
|
225
|
+
russianTitle: russianTitle,
|
|
226
|
+
fileContent: fileContent,
|
|
227
|
+
fileStats: {
|
|
228
|
+
size: fileStats.size,
|
|
229
|
+
created: fileStats.birthtime,
|
|
230
|
+
modified: fileStats.mtime
|
|
231
|
+
}
|
|
232
|
+
}, null, 2)
|
|
222
233
|
}
|
|
223
234
|
]
|
|
224
235
|
};
|
|
225
236
|
}
|
|
226
237
|
catch (error) {
|
|
227
|
-
throw new Error(
|
|
238
|
+
throw new Error(`Файл не найден: ${filePath}`);
|
|
228
239
|
}
|
|
229
240
|
});
|
|
230
241
|
async function main() {
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
{
|
|
2
|
+
"bar_chart": {
|
|
3
|
+
"type": "bar",
|
|
4
|
+
"config": {
|
|
5
|
+
"labels": ["Январь", "Февраль", "Март", "Апрель", "Май"],
|
|
6
|
+
"datasets": [
|
|
7
|
+
{
|
|
8
|
+
"label": "Продажи",
|
|
9
|
+
"data": [12, 19, 3, 5, 2],
|
|
10
|
+
"backgroundColor": ["rgba(54, 162, 235, 0.2)"],
|
|
11
|
+
"borderColor": ["rgba(54, 162, 235, 1)"],
|
|
12
|
+
"borderWidth": 1
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"options": {
|
|
16
|
+
"title": "Гистограмма продаж"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"line_chart": {
|
|
21
|
+
"type": "line",
|
|
22
|
+
"config": {
|
|
23
|
+
"labels": ["16.08.2025", "19.08.2025", "20.08.2025", "21.08.2025", "22.08.2025", "23.08.2025"],
|
|
24
|
+
"datasets": [
|
|
25
|
+
{
|
|
26
|
+
"label": "Курс USD/RUB",
|
|
27
|
+
"data": [80.0224, 80.4256, 80.3466, 80.1045, 80.2548, 80.7498],
|
|
28
|
+
"borderColor": ["rgba(54, 162, 235, 1)"],
|
|
29
|
+
"fill": false
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"options": {
|
|
33
|
+
"title": "Линейный график курса валют"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"pie_chart": {
|
|
38
|
+
"type": "pie",
|
|
39
|
+
"config": {
|
|
40
|
+
"labels": ["Красный", "Синий", "Желтый", "Зеленый", "Фиолетовый"],
|
|
41
|
+
"datasets": [
|
|
42
|
+
{
|
|
43
|
+
"data": [12, 19, 3, 5, 2],
|
|
44
|
+
"backgroundColor": [
|
|
45
|
+
"rgb(255, 99, 132)",
|
|
46
|
+
"rgb(54, 162, 235)",
|
|
47
|
+
"rgb(255, 205, 86)",
|
|
48
|
+
"rgb(75, 192, 192)",
|
|
49
|
+
"rgb(153, 102, 255)"
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"options": {
|
|
54
|
+
"title": "Круговая диаграмма долей рынка"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"doughnut_chart": {
|
|
59
|
+
"type": "doughnut",
|
|
60
|
+
"config": {
|
|
61
|
+
"labels": ["Красный", "Синий", "Желтый", "Зеленый", "Фиолетовый"],
|
|
62
|
+
"datasets": [
|
|
63
|
+
{
|
|
64
|
+
"data": [12, 19, 3, 5, 2],
|
|
65
|
+
"backgroundColor": [
|
|
66
|
+
"rgb(255, 99, 132)",
|
|
67
|
+
"rgb(54, 162, 235)",
|
|
68
|
+
"rgb(255, 205, 86)",
|
|
69
|
+
"rgb(75, 192, 192)",
|
|
70
|
+
"rgb(153, 102, 255)"
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
"options": {
|
|
75
|
+
"title": "Кольцевая диаграмма"
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"radar_chart": {
|
|
80
|
+
"type": "radar",
|
|
81
|
+
"config": {
|
|
82
|
+
"labels": ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"],
|
|
83
|
+
"datasets": [
|
|
84
|
+
{
|
|
85
|
+
"label": "Person 1",
|
|
86
|
+
"data": [65, 59, 90, 81, 56, 55, 40],
|
|
87
|
+
"backgroundColor": ["rgba(54, 162, 235, 0.2)"],
|
|
88
|
+
"borderColor": ["rgba(54, 162, 235, 1)"]
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
"options": {
|
|
92
|
+
"title": "Радарная диаграмма"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"polar_area_chart": {
|
|
97
|
+
"type": "polarArea",
|
|
98
|
+
"config": {
|
|
99
|
+
"labels": ["Red", "Green", "Yellow", "Grey", "Blue"],
|
|
100
|
+
"datasets": [
|
|
101
|
+
{
|
|
102
|
+
"data": [11, 16, 7, 3, 14],
|
|
103
|
+
"backgroundColor": [
|
|
104
|
+
"rgb(255, 99, 132)",
|
|
105
|
+
"rgb(75, 192, 192)",
|
|
106
|
+
"rgb(255, 205, 86)",
|
|
107
|
+
"rgb(201, 203, 207)",
|
|
108
|
+
"rgb(54, 162, 235)"
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
],
|
|
112
|
+
"options": {
|
|
113
|
+
"title": "Полярная диаграмма"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Тестовый отчет с несколькими типами диаграмм
|
|
2
|
+
|
|
3
|
+
Этот отчет демонстрирует различные типы диаграмм с измененными размерами.
|
|
4
|
+
|
|
5
|
+
## Гистограмма продаж
|
|
6
|
+
[[chart:bar_chart]]
|
|
7
|
+
|
|
8
|
+
## Линейный график курса валют
|
|
9
|
+
[[chart:line_chart]]
|
|
10
|
+
|
|
11
|
+
## Круговая диаграмма долей рынка
|
|
12
|
+
[[chart:pie_chart]]
|
|
13
|
+
|
|
14
|
+
## Кольцевая диаграмма
|
|
15
|
+
[[chart:doughnut_chart]]
|
|
16
|
+
|
|
17
|
+
## Радарная диаграмма
|
|
18
|
+
[[chart:radar_chart]]
|
|
19
|
+
|
|
20
|
+
## Полярная диаграмма
|
|
21
|
+
[[chart:polar_area_chart]]
|