diff --git a/README.md b/README.md index 5f754761..dd2de173 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,13 @@ GoView 是一个高效的拖拽式低代码数据可视化开发平台,将图 - 封装:项目进行了详细的工具类封装如:路由、存储、加/解密、文件处理、主题、NaiveUI 全局方法、组件等 +- 可视化:基于开源图表库[ECharts](https://echarts.apache.org/zh/index.html) 和 [VChart](https://www.visactor.io/vchart) 编写,具有丰富的图表类型和适配大屏的主题效果; + +- 入选 NaiveUI 社区精选资源推荐:[查看 NaiveUI 推荐列表](https://www.naiveui.com/zh-CN/light/docs/community) + +说明文档: +![说明文档](readme/go-view-doc.png) + 工作台: ![项目截图](readme/go-view-canvas.png) diff --git a/src/assets/images/chart/vchart/vchart_area.png b/src/assets/images/chart/vchart/vchart_area.png new file mode 100644 index 00000000..e1c5b137 Binary files /dev/null and b/src/assets/images/chart/vchart/vchart_area.png differ diff --git a/src/assets/images/chart/vchart/vchart_funnel.png b/src/assets/images/chart/vchart/vchart_funnel.png new file mode 100644 index 00000000..bdb2dfeb Binary files /dev/null and b/src/assets/images/chart/vchart/vchart_funnel.png differ diff --git a/src/assets/images/chart/vchart/vchart_line.png b/src/assets/images/chart/vchart/vchart_line.png new file mode 100644 index 00000000..980f81f5 Binary files /dev/null and b/src/assets/images/chart/vchart/vchart_line.png differ diff --git a/src/assets/images/chart/vchart/vchart_percent_area.png b/src/assets/images/chart/vchart/vchart_percent_area.png new file mode 100644 index 00000000..af7ccbed Binary files /dev/null and b/src/assets/images/chart/vchart/vchart_percent_area.png differ diff --git a/src/assets/images/chart/vchart/vchart_pie.png b/src/assets/images/chart/vchart/vchart_pie.png new file mode 100644 index 00000000..130ccdc8 Binary files /dev/null and b/src/assets/images/chart/vchart/vchart_pie.png differ diff --git a/src/assets/images/chart/vchart/vchart_scatter.png b/src/assets/images/chart/vchart/vchart_scatter.png new file mode 100644 index 00000000..f96060ad Binary files /dev/null and b/src/assets/images/chart/vchart/vchart_scatter.png differ diff --git a/src/assets/images/chart/vchart/vchart_word_cloud.png b/src/assets/images/chart/vchart/vchart_word_cloud.png new file mode 100644 index 00000000..63a117de Binary files /dev/null and b/src/assets/images/chart/vchart/vchart_word_cloud.png differ diff --git a/src/components/GoVChart/transformProps/areas.ts b/src/components/GoVChart/transformProps/areas.ts new file mode 100644 index 00000000..2489598e --- /dev/null +++ b/src/components/GoVChart/transformProps/areas.ts @@ -0,0 +1,32 @@ +import { cloneDeep } from "lodash" + +export default (chartProps: any) => { + const spec = cloneDeep(chartProps) + delete spec.category + + // tooltip + const keyFill = spec.tooltip.style.keyLabel.fill + const valueFill = spec.tooltip.style.valueLabel.fill + const titleFill = spec.tooltip.style.titleLabel.keyFill + delete spec.tooltip.style.keyLabel.fill + delete spec.tooltip.style.valueLabel.fill + delete spec.tooltip.style.titleLabel.keyFill + spec.tooltip.style.keyLabel.fontColor = keyFill + spec.tooltip.style.valueLabel.fontColor = valueFill + spec.tooltip.style.titleLabel.fontColor = titleFill + + // axis + const { name: xAxisName, ...restXAxisProps } = chartProps.xAxis + const { name: yAxisName, ...restYAxisProps } = chartProps.yAxis + spec.axes = [{ + orient: 'bottom', + ...restXAxisProps + }, { + orient: 'left', + ...restYAxisProps + }] + delete spec.xAxis + delete spec.yAxis + // console.log('spec-area-transform', spec) + return spec +} \ No newline at end of file diff --git a/src/components/GoVChart/transformProps/bars.ts b/src/components/GoVChart/transformProps/bars.ts index 92bdb22c..4c1ef91a 100644 --- a/src/components/GoVChart/transformProps/bars.ts +++ b/src/components/GoVChart/transformProps/bars.ts @@ -20,13 +20,15 @@ export default (chartProps: any) => { const { name: yAxisName, ...restYAxisProps } = chartProps.yAxis spec.axes = [{ orient: 'bottom', - ...restXAxisProps + ...restXAxisProps, + // paddingInner: 0.5 }, { orient: 'left', ...restYAxisProps }] + delete spec.xAxis delete spec.yAxis - console.log('spec-transform', spec) + // console.log('spec-bar-transform', spec) return spec } \ No newline at end of file diff --git a/src/components/GoVChart/transformProps/funnels.ts b/src/components/GoVChart/transformProps/funnels.ts new file mode 100644 index 00000000..86846502 --- /dev/null +++ b/src/components/GoVChart/transformProps/funnels.ts @@ -0,0 +1,28 @@ +import { Datum } from "@visactor/vchart/esm/typings" +import { cloneDeep } from "lodash" +const INNER_RADIUS = 0.75 +const OUTER_RADIUS = 0.68 + +export default (chartProps: any) => { + const spec = cloneDeep(chartProps) + + + // tooltip + const keyFill = spec.tooltip.style.keyLabel.fill + const valueFill = spec.tooltip.style.valueLabel.fill + const titleFill = spec.tooltip.style.titleLabel.keyFill + delete spec.tooltip.style.keyLabel.fill + delete spec.tooltip.style.valueLabel.fill + delete spec.tooltip.style.titleLabel.keyFill + spec.tooltip.style.keyLabel.fontColor = keyFill + spec.tooltip.style.valueLabel.fontColor = valueFill + spec.tooltip.style.titleLabel.fontColor = titleFill + + // label + spec.label = { + visible: true, + } + + // console.log('spec-funnel-transform', spec) + return spec +} \ No newline at end of file diff --git a/src/components/GoVChart/transformProps/index.ts b/src/components/GoVChart/transformProps/index.ts index 63ec6a97..50f4f294 100644 --- a/src/components/GoVChart/transformProps/index.ts +++ b/src/components/GoVChart/transformProps/index.ts @@ -1,8 +1,20 @@ import { ChatCategoryEnum, IOption } from "@/packages/components/VChart/index.d"; import bars from './bars' +import pies from './pies' +import lines from './lines' +import areas from './areas' +import funnels from "./funnels"; +import wordClouds from "./wordClouds"; +import scatters from "./scatters"; export const transformHandler: { [key: string]: (args: IOption) => any } = { [ChatCategoryEnum.BAR]: bars, + [ChatCategoryEnum.PIE]: pies, + [ChatCategoryEnum.LINE]: lines, + [ChatCategoryEnum.AREA]: areas, + [ChatCategoryEnum.FUNNEL]: funnels, + [ChatCategoryEnum.WORDCLOUD]: wordClouds, + [ChatCategoryEnum.SCATTER]: scatters, // todo: more charts handler } \ No newline at end of file diff --git a/src/components/GoVChart/transformProps/lines.ts b/src/components/GoVChart/transformProps/lines.ts new file mode 100644 index 00000000..5faa9e7b --- /dev/null +++ b/src/components/GoVChart/transformProps/lines.ts @@ -0,0 +1,32 @@ +import { cloneDeep } from "lodash" + +export default (chartProps: any) => { + const spec = cloneDeep(chartProps) + delete spec.category + + // tooltip + const keyFill = spec.tooltip.style.keyLabel.fill + const valueFill = spec.tooltip.style.valueLabel.fill + const titleFill = spec.tooltip.style.titleLabel.keyFill + delete spec.tooltip.style.keyLabel.fill + delete spec.tooltip.style.valueLabel.fill + delete spec.tooltip.style.titleLabel.keyFill + spec.tooltip.style.keyLabel.fontColor = keyFill + spec.tooltip.style.valueLabel.fontColor = valueFill + spec.tooltip.style.titleLabel.fontColor = titleFill + + // axis + const { name: xAxisName, ...restXAxisProps } = chartProps.xAxis + const { name: yAxisName, ...restYAxisProps } = chartProps.yAxis + spec.axes = [{ + orient: 'bottom', + ...restXAxisProps + }, { + orient: 'left', + ...restYAxisProps + }] + delete spec.xAxis + delete spec.yAxis + // console.log('spec-line-transform', spec) + return spec +} \ No newline at end of file diff --git a/src/components/GoVChart/transformProps/pies.ts b/src/components/GoVChart/transformProps/pies.ts new file mode 100644 index 00000000..c6bb19c3 --- /dev/null +++ b/src/components/GoVChart/transformProps/pies.ts @@ -0,0 +1,139 @@ +import { Datum } from "@visactor/vchart/esm/typings" +import { cloneDeep } from "lodash" +const INNER_RADIUS = 0.75 +const OUTER_RADIUS = 0.68 + +export default (chartProps: any) => { + const spec = cloneDeep(chartProps) + delete spec.category + + spec.innerRadius = INNER_RADIUS + spec.outerRadius = OUTER_RADIUS + + // tooltip + const keyFill = spec.tooltip.style.keyLabel.fill + const valueFill = spec.tooltip.style.valueLabel.fill + const titleFill = spec.tooltip.style.titleLabel.keyFill + delete spec.tooltip.style.keyLabel.fill + delete spec.tooltip.style.valueLabel.fill + delete spec.tooltip.style.titleLabel.keyFill + spec.tooltip.style.keyLabel.fontColor = keyFill + spec.tooltip.style.valueLabel.fontColor = valueFill + spec.tooltip.style.titleLabel.fontColor = titleFill + + // extensionMark + spec.extensionMark = [ + { + name: 'arc_inner_shadow', + type: 'arc', + dataId: 'id0', + style: { + interactive: false, + startAngle: (datum: Datum) => { + console.log('startAngle', datum) + return datum['__VCHART_ARC_START_ANGLE']; + }, + endAngle: (datum: Datum) => { + return datum['__VCHART_ARC_END_ANGLE']; + }, + innerRadius: (datum: Datum, context: any) => { + return context.getLayoutRadius() * spec.innerRadius - 30; + }, + outerRadius: (datum: Datum, context: any) => { + return context.getLayoutRadius() * spec.innerRadius; + }, + fillOpacity: 0.3, + fill: (datum: Datum, context: any) => { + console.log('context', context.seriesColor(datum[spec.seriesField])) + return context.seriesColor(datum[spec.seriesField]); + }, + visible: true, + x: (datum: Datum, context: any) => { + return context.getCenter().x(); + }, + y: (datum: Datum, context: any) => { + return context.getCenter().y(); + } + } + }, + { + name: 'arc_inner', + type: 'symbol', + // dataId: 'id0', + style: { + interactive: false, + size: (datum: Datum, context: any) => { + return context.getLayoutRadius() * 2 * spec.innerRadius - 100; + }, + fillOpacity: 0, + lineWidth: 1, + strokeOpacity: 0.5, + stroke: { + gradient: 'conical', + startAngle: 0, + endAngle: Math.PI * 2, + stops: [ + { + offset: 0, + color: '#FFF', + opacity: 0 + }, + { + offset: 1, + color: '#FFF', + opacity: 1 + } + ] + }, + visible: true, + x: (datum: Datum, context: any) => { + return context.getCenter().x(); + }, + y: (datum: Datum, context: any) => { + return context.getCenter().y(); + } + } + }, + { + name: 'arc_outer', + type: 'symbol', + // dataId: 'id0', + style: { + interactive: false, + size: (datum: Datum, context: any) => { + return context.getLayoutRadius() * 2 * spec.outerRadius + 50; + }, + fillOpacity: 0, + lineWidth: 1, + strokeOpacity: 0.5, + stroke: { + gradient: 'conical', + startAngle: 0, + endAngle: Math.PI * 2, + stops: [ + { + offset: 0, + color: '#FFF', + opacity: 0 + }, + { + offset: 1, + color: '#FFF', + opacity: 1 + } + ] + }, + visible: true, + x: (datum: Datum, context: any) => { + return context.getCenter().x(); + }, + y: (datum: Datum, context: any) => { + return context.getCenter().y(); + } + } + } + ] + + // console.log('spec-pie-transform', spec) + return spec +} \ No newline at end of file diff --git a/src/components/GoVChart/transformProps/scatters.ts b/src/components/GoVChart/transformProps/scatters.ts new file mode 100644 index 00000000..a74f8d67 --- /dev/null +++ b/src/components/GoVChart/transformProps/scatters.ts @@ -0,0 +1,35 @@ +import { cloneDeep } from "lodash" + +export default (chartProps: any) => { + const spec = cloneDeep(chartProps) + + // tooltip + const keyFill = spec.tooltip.style.keyLabel.fill + const valueFill = spec.tooltip.style.valueLabel.fill + const titleFill = spec.tooltip.style.titleLabel.keyFill + delete spec.tooltip.style.keyLabel.fill + delete spec.tooltip.style.valueLabel.fill + delete spec.tooltip.style.titleLabel.keyFill + spec.tooltip.style.keyLabel.fontColor = keyFill + spec.tooltip.style.valueLabel.fontColor = valueFill + spec.tooltip.style.titleLabel.fontColor = titleFill + + // axis + const { name: xAxisName, ...restXAxisProps } = chartProps.xAxis + const { name: yAxisName, ...restYAxisProps } = chartProps.yAxis + spec.axes = [{ + orient: 'bottom', + ...restXAxisProps, + label: { + formatMethod: (value: string) => Number(value).toFixed(2) + } + }, { + orient: 'left', + ...restYAxisProps + }] + + delete spec.xAxis + delete spec.yAxis + // console.log('spec-scatter-transform', spec) + return spec +} \ No newline at end of file diff --git a/src/components/GoVChart/transformProps/wordClouds.ts b/src/components/GoVChart/transformProps/wordClouds.ts new file mode 100644 index 00000000..a4b57777 --- /dev/null +++ b/src/components/GoVChart/transformProps/wordClouds.ts @@ -0,0 +1,21 @@ +import { Datum } from "@visactor/vchart/esm/typings" +import { cloneDeep } from "lodash" + +export default (chartProps: any) => { + const spec = cloneDeep(chartProps) + + // tooltip + const keyFill = spec.tooltip.style.keyLabel.fill + const valueFill = spec.tooltip.style.valueLabel.fill + const titleFill = spec.tooltip.style.titleLabel.keyFill + delete spec.tooltip.style.keyLabel.fill + delete spec.tooltip.style.valueLabel.fill + delete spec.tooltip.style.titleLabel.keyFill + spec.tooltip.style.keyLabel.fontColor = keyFill + spec.tooltip.style.valueLabel.fontColor = valueFill + spec.tooltip.style.titleLabel.fontColor = titleFill + + + // console.log('spec-word-cloud-transform', spec) + return spec +} \ No newline at end of file diff --git a/src/packages/components/VChart/Areas/VChartArea/config.ts b/src/packages/components/VChart/Areas/VChartArea/config.ts new file mode 100644 index 00000000..78bf1ee4 --- /dev/null +++ b/src/packages/components/VChart/Areas/VChartArea/config.ts @@ -0,0 +1,47 @@ +import { PublicConfigClass } from '@/packages/public' +import { VChartAreaConfig } from './index' +import { CreateComponentType } from '@/packages/index.d' +import { vChartOptionPrefixHandle } from '@/packages/public/vChart' +import data from './data.json' +import cloneDeep from 'lodash/cloneDeep' +import axisThemeJson from '@/settings/vchartThemes/axis.theme.json' +import { IAreaOption } from '../../index.d' + +export const includes = ['legends', 'tooltip'] +export const option: IAreaOption & { dataset?: any } = { + // 图表配置 + type: 'area', + dataset: data, + xField: 'type', + yField: 'value', + seriesField: 'country', + stack: true, + // 业务配置(后续会被转换为图表spec) + category: VChartAreaConfig.category, + xAxis: { + name: 'x轴', + ...axisThemeJson, + grid: { + ...axisThemeJson.grid, + visible: false + } + }, + yAxis: { + name: 'y轴', + ...axisThemeJson, + grid: { + ...axisThemeJson.grid, + style: { + ...axisThemeJson.grid.style, + lineDash: [3, 3] + } + } + } +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = VChartAreaConfig.key + public chartConfig = cloneDeep(VChartAreaConfig) + // 图表配置项 + public option = vChartOptionPrefixHandle(option, includes) +} diff --git a/src/packages/components/VChart/Areas/VChartArea/config.vue b/src/packages/components/VChart/Areas/VChartArea/config.vue new file mode 100644 index 00000000..9f15a51a --- /dev/null +++ b/src/packages/components/VChart/Areas/VChartArea/config.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/packages/components/VChart/Areas/VChartArea/data.json b/src/packages/components/VChart/Areas/VChartArea/data.json new file mode 100644 index 00000000..9ba2b574 --- /dev/null +++ b/src/packages/components/VChart/Areas/VChartArea/data.json @@ -0,0 +1,16 @@ +{ + "values": [ + { "type": "Nail polish", "country": "China", "value": 3054 }, + { "type": "Nail polish", "country": "USA", "value": 12814 }, + { "type": "Eyebrow pencil", "country": "China", "value": 5067 }, + { "type": "Eyebrow pencil", "country": "USA", "value": 13012 }, + { "type": "Rouge", "country": "China", "value": 7004 }, + { "type": "Rouge", "country": "USA", "value": 11624 }, + { "type": "Lipstick", "country": "China", "value": 9054 }, + { "type": "Lipstick", "country": "USA", "value": 8814 }, + { "type": "Eyeshadows", "country": "China", "value": 12043 }, + { "type": "Eyeshadows", "country": "USA", "value": 12998 }, + { "type": "Eyeliner", "country": "China", "value": 15067 }, + { "type": "Eyeliner", "country": "USA", "value": 12321 } + ] +} diff --git a/src/packages/components/VChart/Areas/VChartArea/index.ts b/src/packages/components/VChart/Areas/VChartArea/index.ts new file mode 100644 index 00000000..60894264 --- /dev/null +++ b/src/packages/components/VChart/Areas/VChartArea/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const VChartAreaConfig: ConfigType = { + key: 'VChartArea', + chartKey: 'VVChartArea', + conKey: 'VCVChartArea', + title: 'VChart面积图', + category: ChatCategoryEnum.AREA, + categoryName: ChatCategoryEnumName.AREA, + package: PackagesCategoryEnum.VCHART, + chartFrame: ChartFrameEnum.VCHART, + image: 'vchart_area.png' +} diff --git a/src/packages/components/VChart/Areas/VChartArea/index.vue b/src/packages/components/VChart/Areas/VChartArea/index.vue new file mode 100644 index 00000000..c70c6676 --- /dev/null +++ b/src/packages/components/VChart/Areas/VChartArea/index.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/packages/components/VChart/Areas/VChartPercentArea/config.ts b/src/packages/components/VChart/Areas/VChartPercentArea/config.ts new file mode 100644 index 00000000..d2e46b78 --- /dev/null +++ b/src/packages/components/VChart/Areas/VChartPercentArea/config.ts @@ -0,0 +1,48 @@ +import { PublicConfigClass } from '@/packages/public' +import { VChartPercentAreaConfig } from './index' +import { CreateComponentType } from '@/packages/index.d' +import { vChartOptionPrefixHandle } from '@/packages/public/vChart' +import data from './data.json' +import cloneDeep from 'lodash/cloneDeep' +import axisThemeJson from '@/settings/vchartThemes/axis.theme.json' +import { IAreaOption } from '../../index.d' + +export const includes = ['legends', 'tooltip'] +export const option: IAreaOption & { dataset?: any } = { + // 图表配置 + type: 'area', + dataset: data, + xField: 'type', + yField: 'value', + seriesField: 'country', + stack: true, + percent: true, + // 业务配置(后续会被转换为图表spec) + category: VChartPercentAreaConfig.category, + xAxis: { + name: 'x轴', + ...axisThemeJson, + grid: { + ...axisThemeJson.grid, + visible: false + } + }, + yAxis: { + name: 'y轴', + ...axisThemeJson, + grid: { + ...axisThemeJson.grid, + style: { + ...axisThemeJson.grid.style, + lineDash: [3, 3] + } + } + } +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = VChartPercentAreaConfig.key + public chartConfig = cloneDeep(VChartPercentAreaConfig) + // 图表配置项 + public option = vChartOptionPrefixHandle(option, includes) +} diff --git a/src/packages/components/VChart/Areas/VChartPercentArea/config.vue b/src/packages/components/VChart/Areas/VChartPercentArea/config.vue new file mode 100644 index 00000000..9f15a51a --- /dev/null +++ b/src/packages/components/VChart/Areas/VChartPercentArea/config.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/packages/components/VChart/Areas/VChartPercentArea/data.json b/src/packages/components/VChart/Areas/VChartPercentArea/data.json new file mode 100644 index 00000000..9ba2b574 --- /dev/null +++ b/src/packages/components/VChart/Areas/VChartPercentArea/data.json @@ -0,0 +1,16 @@ +{ + "values": [ + { "type": "Nail polish", "country": "China", "value": 3054 }, + { "type": "Nail polish", "country": "USA", "value": 12814 }, + { "type": "Eyebrow pencil", "country": "China", "value": 5067 }, + { "type": "Eyebrow pencil", "country": "USA", "value": 13012 }, + { "type": "Rouge", "country": "China", "value": 7004 }, + { "type": "Rouge", "country": "USA", "value": 11624 }, + { "type": "Lipstick", "country": "China", "value": 9054 }, + { "type": "Lipstick", "country": "USA", "value": 8814 }, + { "type": "Eyeshadows", "country": "China", "value": 12043 }, + { "type": "Eyeshadows", "country": "USA", "value": 12998 }, + { "type": "Eyeliner", "country": "China", "value": 15067 }, + { "type": "Eyeliner", "country": "USA", "value": 12321 } + ] +} diff --git a/src/packages/components/VChart/Areas/VChartPercentArea/index.ts b/src/packages/components/VChart/Areas/VChartPercentArea/index.ts new file mode 100644 index 00000000..743e9aa4 --- /dev/null +++ b/src/packages/components/VChart/Areas/VChartPercentArea/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const VChartPercentAreaConfig: ConfigType = { + key: 'VChartPercentArea', + chartKey: 'VVChartPercentArea', + conKey: 'VCVChartPercentArea', + title: 'VChart百分比面积图', + category: ChatCategoryEnum.AREA, + categoryName: ChatCategoryEnumName.AREA, + package: PackagesCategoryEnum.VCHART, + chartFrame: ChartFrameEnum.VCHART, + image: 'vchart_percent_area.png' +} diff --git a/src/packages/components/VChart/Areas/VChartPercentArea/index.vue b/src/packages/components/VChart/Areas/VChartPercentArea/index.vue new file mode 100644 index 00000000..c70c6676 --- /dev/null +++ b/src/packages/components/VChart/Areas/VChartPercentArea/index.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/packages/components/VChart/Areas/index.ts b/src/packages/components/VChart/Areas/index.ts new file mode 100644 index 00000000..7125be10 --- /dev/null +++ b/src/packages/components/VChart/Areas/index.ts @@ -0,0 +1,4 @@ +import { VChartAreaConfig } from './VChartArea/index' +import { VChartPercentAreaConfig } from './VChartPercentArea/index' + +export default [VChartAreaConfig, VChartPercentAreaConfig] diff --git a/src/packages/components/VChart/Bars/VChartBarCommon/index.ts b/src/packages/components/VChart/Bars/VChartBarCommon/index.ts index 8e8a1533..968350b9 100644 --- a/src/packages/components/VChart/Bars/VChartBarCommon/index.ts +++ b/src/packages/components/VChart/Bars/VChartBarCommon/index.ts @@ -5,7 +5,7 @@ export const VChartBarCommonConfig: ConfigType = { key: 'VChartBarCommon', chartKey: 'VVChartBarCommon', conKey: 'VCVChartBarCommon', - title: 'VChart柱状图', + title: 'VChart并列柱状图', category: ChatCategoryEnum.BAR, categoryName: ChatCategoryEnumName.BAR, package: PackagesCategoryEnum.VCHART, diff --git a/src/packages/components/VChart/Bars/VChartBarStack/index.ts b/src/packages/components/VChart/Bars/VChartBarStack/index.ts index 860c0d02..a584dac2 100644 --- a/src/packages/components/VChart/Bars/VChartBarStack/index.ts +++ b/src/packages/components/VChart/Bars/VChartBarStack/index.ts @@ -5,7 +5,7 @@ export const VChartBarStackConfig: ConfigType = { key: 'VChartBarStack', chartKey: 'VVChartBarStack', conKey: 'VCVChartBarStack', - title: 'VChart柱状图', + title: 'VChart堆叠柱状图', category: ChatCategoryEnum.BAR, categoryName: ChatCategoryEnumName.BAR, package: PackagesCategoryEnum.VCHART, diff --git a/src/packages/components/VChart/Funnels/VChartFunnel/config.ts b/src/packages/components/VChart/Funnels/VChartFunnel/config.ts new file mode 100644 index 00000000..a0ec081a --- /dev/null +++ b/src/packages/components/VChart/Funnels/VChartFunnel/config.ts @@ -0,0 +1,25 @@ +import { PublicConfigClass } from '@/packages/public' +import { VChartFunnelConfig } from './index' +import { CreateComponentType } from '@/packages/index.d' +import { vChartOptionPrefixHandle } from '@/packages/public/vChart' +import data from './data.json' +import cloneDeep from 'lodash/cloneDeep' +import { IFunnelOption } from '../../index.d' + +export const includes = ['legends', 'tooltip'] +export const option: IFunnelOption & { dataset?: any } = { + // 图表配置 + type: 'funnel', + dataset: data, + categoryField: 'name', + valueField: 'value', + // 业务配置(后续会被转换为图表spec) + category: VChartFunnelConfig.category, +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = VChartFunnelConfig.key + public chartConfig = cloneDeep(VChartFunnelConfig) + // 图表配置项 + public option = vChartOptionPrefixHandle(option, includes) +} diff --git a/src/packages/components/VChart/Funnels/VChartFunnel/config.vue b/src/packages/components/VChart/Funnels/VChartFunnel/config.vue new file mode 100644 index 00000000..48a2470f --- /dev/null +++ b/src/packages/components/VChart/Funnels/VChartFunnel/config.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/packages/components/VChart/Funnels/VChartFunnel/data.json b/src/packages/components/VChart/Funnels/VChartFunnel/data.json new file mode 100644 index 00000000..8b605d5e --- /dev/null +++ b/src/packages/components/VChart/Funnels/VChartFunnel/data.json @@ -0,0 +1,24 @@ +{ + "values": [ + { + "value": 100, + "name": "Step1" + }, + { + "value": 80, + "name": "Step2" + }, + { + "value": 60, + "name": "Step3" + }, + { + "value": 40, + "name": "Step4" + }, + { + "value": 20, + "name": "Step5" + } + ] +} diff --git a/src/packages/components/VChart/Funnels/VChartFunnel/index.ts b/src/packages/components/VChart/Funnels/VChartFunnel/index.ts new file mode 100644 index 00000000..1c8bdd1d --- /dev/null +++ b/src/packages/components/VChart/Funnels/VChartFunnel/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const VChartFunnelConfig: ConfigType = { + key: 'VChartFunnel', + chartKey: 'VVChartFunnel', + conKey: 'VCVChartFunnel', + title: 'VChart漏斗图', + category: ChatCategoryEnum.FUNNEL, + categoryName: ChatCategoryEnumName.FUNNEL, + package: PackagesCategoryEnum.VCHART, + chartFrame: ChartFrameEnum.VCHART, + image: 'vchart_funnel.png' +} diff --git a/src/packages/components/VChart/Funnels/VChartFunnel/index.vue b/src/packages/components/VChart/Funnels/VChartFunnel/index.vue new file mode 100644 index 00000000..c70c6676 --- /dev/null +++ b/src/packages/components/VChart/Funnels/VChartFunnel/index.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/packages/components/VChart/Funnels/index.ts b/src/packages/components/VChart/Funnels/index.ts new file mode 100644 index 00000000..3da01d4b --- /dev/null +++ b/src/packages/components/VChart/Funnels/index.ts @@ -0,0 +1,3 @@ +import { VChartFunnelConfig } from './VChartFunnel/index' + +export default [VChartFunnelConfig] diff --git a/src/packages/components/VChart/Lines/VChartLine/config.ts b/src/packages/components/VChart/Lines/VChartLine/config.ts new file mode 100644 index 00000000..12ce684f --- /dev/null +++ b/src/packages/components/VChart/Lines/VChartLine/config.ts @@ -0,0 +1,47 @@ +import { PublicConfigClass } from '@/packages/public' +import { VChartLineConfig } from './index' +import { CreateComponentType } from '@/packages/index.d' +import { vChartOptionPrefixHandle } from '@/packages/public/vChart' +import data from './data.json' +import cloneDeep from 'lodash/cloneDeep' +import axisThemeJson from '@/settings/vchartThemes/axis.theme.json' +import { ILineOption } from '../../index.d' + +export const includes = ['legends', 'tooltip'] +export const option: ILineOption & { dataset?: any } = { + // 图表配置 + type: 'line', + dataset: data, + xField: 'type', + yField: 'value', + seriesField: 'country', + stack: true, + // 业务配置(后续会被转换为图表spec) + category: VChartLineConfig.category, + xAxis: { + name: 'x轴', + ...axisThemeJson, + grid: { + ...axisThemeJson.grid, + visible: false + } + }, + yAxis: { + name: 'y轴', + ...axisThemeJson, + grid: { + ...axisThemeJson.grid, + style: { + ...axisThemeJson.grid.style, + lineDash: [3, 3] + } + } + } +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = VChartLineConfig.key + public chartConfig = cloneDeep(VChartLineConfig) + // 图表配置项 + public option = vChartOptionPrefixHandle(option, includes) +} diff --git a/src/packages/components/VChart/Lines/VChartLine/config.vue b/src/packages/components/VChart/Lines/VChartLine/config.vue new file mode 100644 index 00000000..9f15a51a --- /dev/null +++ b/src/packages/components/VChart/Lines/VChartLine/config.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/packages/components/VChart/Lines/VChartLine/data.json b/src/packages/components/VChart/Lines/VChartLine/data.json new file mode 100644 index 00000000..9ba2b574 --- /dev/null +++ b/src/packages/components/VChart/Lines/VChartLine/data.json @@ -0,0 +1,16 @@ +{ + "values": [ + { "type": "Nail polish", "country": "China", "value": 3054 }, + { "type": "Nail polish", "country": "USA", "value": 12814 }, + { "type": "Eyebrow pencil", "country": "China", "value": 5067 }, + { "type": "Eyebrow pencil", "country": "USA", "value": 13012 }, + { "type": "Rouge", "country": "China", "value": 7004 }, + { "type": "Rouge", "country": "USA", "value": 11624 }, + { "type": "Lipstick", "country": "China", "value": 9054 }, + { "type": "Lipstick", "country": "USA", "value": 8814 }, + { "type": "Eyeshadows", "country": "China", "value": 12043 }, + { "type": "Eyeshadows", "country": "USA", "value": 12998 }, + { "type": "Eyeliner", "country": "China", "value": 15067 }, + { "type": "Eyeliner", "country": "USA", "value": 12321 } + ] +} diff --git a/src/packages/components/VChart/Lines/VChartLine/index.ts b/src/packages/components/VChart/Lines/VChartLine/index.ts new file mode 100644 index 00000000..95cb94cb --- /dev/null +++ b/src/packages/components/VChart/Lines/VChartLine/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const VChartLineConfig: ConfigType = { + key: 'VChartLine', + chartKey: 'VVChartLine', + conKey: 'VCVChartLine', + title: 'VChart折线图', + category: ChatCategoryEnum.LINE, + categoryName: ChatCategoryEnumName.LINE, + package: PackagesCategoryEnum.VCHART, + chartFrame: ChartFrameEnum.VCHART, + image: 'vchart_line.png' +} diff --git a/src/packages/components/VChart/Lines/VChartLine/index.vue b/src/packages/components/VChart/Lines/VChartLine/index.vue new file mode 100644 index 00000000..c70c6676 --- /dev/null +++ b/src/packages/components/VChart/Lines/VChartLine/index.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/packages/components/VChart/Lines/index.ts b/src/packages/components/VChart/Lines/index.ts new file mode 100644 index 00000000..99b4ae8f --- /dev/null +++ b/src/packages/components/VChart/Lines/index.ts @@ -0,0 +1,3 @@ +import { VChartLineConfig } from './VChartLine/index' + +export default [VChartLineConfig] diff --git a/src/packages/components/VChart/Pies/VChartPie/config.ts b/src/packages/components/VChart/Pies/VChartPie/config.ts new file mode 100644 index 00000000..423796cc --- /dev/null +++ b/src/packages/components/VChart/Pies/VChartPie/config.ts @@ -0,0 +1,26 @@ +import { PublicConfigClass } from '@/packages/public' +import { VChartPieConfig } from './index' +import { CreateComponentType } from '@/packages/index.d' +import { vChartOptionPrefixHandle } from '@/packages/public/vChart' +import data from './data.json' +import cloneDeep from 'lodash/cloneDeep' +import { IPieOption } from '../../index.d' + +export const includes = ['legends', 'tooltip'] +export const option: IPieOption & { dataset?: any } = { + // 图表配置 + type: 'pie', + dataset: data, + categoryField: 'year', + valueField: 'value', + seriesField: 'year', + // 业务配置(后续会被转换为图表spec) + category: VChartPieConfig.category, +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = VChartPieConfig.key + public chartConfig = cloneDeep(VChartPieConfig) + // 图表配置项 + public option = vChartOptionPrefixHandle(option, includes) +} diff --git a/src/packages/components/VChart/Pies/VChartPie/config.vue b/src/packages/components/VChart/Pies/VChartPie/config.vue new file mode 100644 index 00000000..48a2470f --- /dev/null +++ b/src/packages/components/VChart/Pies/VChartPie/config.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/packages/components/VChart/Pies/VChartPie/data.json b/src/packages/components/VChart/Pies/VChartPie/data.json new file mode 100644 index 00000000..d71a1e6b --- /dev/null +++ b/src/packages/components/VChart/Pies/VChartPie/data.json @@ -0,0 +1,14 @@ +{ + "values": [ + { "type": "Autocracies", "year": "1930", "value": 129 }, + { "type": "Autocracies", "year": "1940", "value": 133 }, + { "type": "Autocracies", "year": "1950", "value": 130 }, + { "type": "Autocracies", "year": "1960", "value": 126 }, + { "type": "Autocracies", "year": "1970", "value": 117 }, + { "type": "Autocracies", "year": "1980", "value": 114 }, + { "type": "Autocracies", "year": "1990", "value": 111 }, + { "type": "Autocracies", "year": "2000", "value": 89 }, + { "type": "Autocracies", "year": "2010", "value": 80 }, + { "type": "Autocracies", "year": "2018", "value": 80 } + ] +} diff --git a/src/packages/components/VChart/Pies/VChartPie/index.ts b/src/packages/components/VChart/Pies/VChartPie/index.ts new file mode 100644 index 00000000..532e6154 --- /dev/null +++ b/src/packages/components/VChart/Pies/VChartPie/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const VChartPieConfig: ConfigType = { + key: 'VChartPie', + chartKey: 'VVChartPie', + conKey: 'VCVChartPie', + title: 'VChart饼图', + category: ChatCategoryEnum.PIE, + categoryName: ChatCategoryEnumName.PIE, + package: PackagesCategoryEnum.VCHART, + chartFrame: ChartFrameEnum.VCHART, + image: 'vchart_pie.png' +} diff --git a/src/packages/components/VChart/Pies/VChartPie/index.vue b/src/packages/components/VChart/Pies/VChartPie/index.vue new file mode 100644 index 00000000..c70c6676 --- /dev/null +++ b/src/packages/components/VChart/Pies/VChartPie/index.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/packages/components/VChart/Pies/index.ts b/src/packages/components/VChart/Pies/index.ts new file mode 100644 index 00000000..fc58b881 --- /dev/null +++ b/src/packages/components/VChart/Pies/index.ts @@ -0,0 +1,3 @@ +import { VChartPieConfig } from './VChartPie/index' + +export default [VChartPieConfig] diff --git a/src/packages/components/VChart/Scatters/VChartScatter/config.ts b/src/packages/components/VChart/Scatters/VChartScatter/config.ts new file mode 100644 index 00000000..7d1216e8 --- /dev/null +++ b/src/packages/components/VChart/Scatters/VChartScatter/config.ts @@ -0,0 +1,47 @@ +import { PublicConfigClass } from '@/packages/public' +import { VChartScatterConfig } from './index' +import { CreateComponentType } from '@/packages/index.d' +import { vChartOptionPrefixHandle } from '@/packages/public/vChart' +import data from './data.json' +import cloneDeep from 'lodash/cloneDeep' +import axisThemeJson from '@/settings/vchartThemes/axis.theme.json' +import { IAreaOption } from '../../index.d' + +export const includes = ['legends', 'tooltip'] +export const option: IAreaOption & { dataset?: any } = { + // 图表配置 + type: 'scatter', + dataset: data, + stack: true, + xField: 'x', + yField: 'horsepower', + seriesField: 'cylinders', + // 业务配置(后续会被转换为图表spec) + category: VChartScatterConfig.category, + xAxis: { + name: 'x轴', + ...axisThemeJson, + grid: { + ...axisThemeJson.grid, + visible: false + } + }, + yAxis: { + name: 'y轴', + ...axisThemeJson, + grid: { + ...axisThemeJson.grid, + style: { + ...axisThemeJson.grid.style, + lineDash: [3, 3] + } + } + } +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = VChartScatterConfig.key + public chartConfig = cloneDeep(VChartScatterConfig) + // 图表配置项 + public option = vChartOptionPrefixHandle(option, includes) +} diff --git a/src/packages/components/VChart/Scatters/VChartScatter/config.vue b/src/packages/components/VChart/Scatters/VChartScatter/config.vue new file mode 100644 index 00000000..9f15a51a --- /dev/null +++ b/src/packages/components/VChart/Scatters/VChartScatter/config.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/packages/components/VChart/Scatters/VChartScatter/data.json b/src/packages/components/VChart/Scatters/VChartScatter/data.json new file mode 100644 index 00000000..fbb1862d --- /dev/null +++ b/src/packages/components/VChart/Scatters/VChartScatter/data.json @@ -0,0 +1,2846 @@ +{ + "values": [ + { + "name": "chevrolet chevelle malibu", + "milesPerGallon": 18, + "cylinders": 8, + "horsepower": 130, + "x": 8.369035799207357 + }, + { + "name": "buick skylark 320", + "milesPerGallon": 15, + "cylinders": 8, + "horsepower": 165, + "x": 7.650029728786544 + }, + { + "name": "plymouth satellite", + "milesPerGallon": 18, + "cylinders": 8, + "horsepower": 150, + "x": 7.968503221959899 + }, + { + "name": "amc rebel sst", + "milesPerGallon": 16, + "cylinders": 8, + "horsepower": 150, + "x": 7.8561560094781955 + }, + { + "name": "ford torino", + "milesPerGallon": 17, + "cylinders": 8, + "horsepower": 140, + "x": 7.864427335458599 + }, + { + "name": "ford galaxie 500", + "milesPerGallon": 15, + "cylinders": 8, + "horsepower": 198, + "x": 7.795269144672034 + }, + { + "name": "chevrolet impala", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 220, + "x": 8.093918960889592 + }, + { + "name": "plymouth fury iii", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 215, + "x": 8.096790572779447 + }, + { + "name": "pontiac catalina", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 225, + "x": 8.280421990443992 + }, + { + "name": "amc ambassador dpl", + "milesPerGallon": 15, + "cylinders": 8, + "horsepower": 190, + "x": 7.812477402825842 + }, + { + "name": "citroen ds-21 pallas", + "milesPerGallon": 0, + "cylinders": 4, + "horsepower": 115, + "x": 4.350254126743262 + }, + { + "name": "chevrolet chevelle concours (sw)", + "milesPerGallon": 0, + "cylinders": 8, + "horsepower": 165, + "x": 8.336047282481855 + }, + { + "name": "ford torino (sw)", + "milesPerGallon": 0, + "cylinders": 8, + "horsepower": 153, + "x": 8.302128751564197 + }, + { + "name": "plymouth satellite (sw)", + "milesPerGallon": 0, + "cylinders": 8, + "horsepower": 175, + "x": 8.061597332557989 + }, + { + "name": "amc rebel sst (sw)", + "milesPerGallon": 0, + "cylinders": 8, + "horsepower": 175, + "x": 7.664837196380818 + }, + { + "name": "dodge challenger se", + "milesPerGallon": 15, + "cylinders": 8, + "horsepower": 170, + "x": 8.275147641122178 + }, + { + "name": "plymouth 'cuda 340", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 160, + "x": 8.258530083217627 + }, + { + "name": "ford mustang boss 302", + "milesPerGallon": 0, + "cylinders": 8, + "horsepower": 140, + "x": 7.645170928170343 + }, + { + "name": "chevrolet monte carlo", + "milesPerGallon": 15, + "cylinders": 8, + "horsepower": 150, + "x": 7.89039684982018 + }, + { + "name": "buick estate wagon (sw)", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 225, + "x": 7.76227513980753 + }, + { + "name": "toyota corona mark ii", + "milesPerGallon": 24, + "cylinders": 4, + "horsepower": 95, + "x": 4.240267871288519 + }, + { + "name": "plymouth duster", + "milesPerGallon": 22, + "cylinders": 6, + "horsepower": 95, + "x": 5.815333283103814 + }, + { + "name": "amc hornet", + "milesPerGallon": 18, + "cylinders": 6, + "horsepower": 97, + "x": 6.199722230971187 + }, + { + "name": "ford maverick", + "milesPerGallon": 21, + "cylinders": 6, + "horsepower": 85, + "x": 5.84155599489376 + }, + { + "name": "datsun pl510", + "milesPerGallon": 27, + "cylinders": 4, + "horsepower": 88, + "x": 3.644534398133687 + }, + { + "name": "volkswagen 1131 deluxe sedan", + "milesPerGallon": 26, + "cylinders": 4, + "horsepower": 46, + "x": 3.652329499162354 + }, + { + "name": "peugeot 504", + "milesPerGallon": 25, + "cylinders": 4, + "horsepower": 87, + "x": 3.6921618966402843 + }, + { + "name": "audi 100 ls", + "milesPerGallon": 24, + "cylinders": 4, + "horsepower": 90, + "x": 4.027217142848164 + }, + { + "name": "saab 99e", + "milesPerGallon": 25, + "cylinders": 4, + "horsepower": 95, + "x": 3.9415947155959774 + }, + { + "name": "bmw 2002", + "milesPerGallon": 26, + "cylinders": 4, + "horsepower": 113, + "x": 4.050221722279534 + }, + { + "name": "amc gremlin", + "milesPerGallon": 21, + "cylinders": 6, + "horsepower": 90, + "x": 6.261381817520874 + }, + { + "name": "ford f250", + "milesPerGallon": 10, + "cylinders": 8, + "horsepower": 215, + "x": 7.695684729213842 + }, + { + "name": "chevy c20", + "milesPerGallon": 10, + "cylinders": 8, + "horsepower": 200, + "x": 8.209748747255345 + }, + { + "name": "dodge d200", + "milesPerGallon": 11, + "cylinders": 8, + "horsepower": 210, + "x": 7.846867016987405 + }, + { + "name": "hi 1200d", + "milesPerGallon": 9, + "cylinders": 8, + "horsepower": 193, + "x": 7.828846703882448 + }, + { + "name": "datsun pl510", + "milesPerGallon": 27, + "cylinders": 4, + "horsepower": 88, + "x": 3.859449508889943 + }, + { + "name": "chevrolet vega 2300", + "milesPerGallon": 28, + "cylinders": 4, + "horsepower": 90, + "x": 3.8718649080786602 + }, + { + "name": "toyota corona", + "milesPerGallon": 25, + "cylinders": 4, + "horsepower": 95, + "x": 3.6787061470327425 + }, + { + "name": "ford pinto", + "milesPerGallon": 25, + "cylinders": 4, + "horsepower": 0, + "x": 4.0187293963215724 + }, + { + "name": "volkswagen super beetle 117", + "milesPerGallon": 0, + "cylinders": 4, + "horsepower": 48, + "x": 3.943328407800161 + }, + { + "name": "amc gremlin", + "milesPerGallon": 19, + "cylinders": 6, + "horsepower": 100, + "x": 5.999494813289073 + }, + { + "name": "plymouth satellite custom", + "milesPerGallon": 16, + "cylinders": 6, + "horsepower": 105, + "x": 6.290208822990809 + }, + { + "name": "chevrolet chevelle malibu", + "milesPerGallon": 17, + "cylinders": 6, + "horsepower": 100, + "x": 5.823164098366052 + }, + { + "name": "ford torino 500", + "milesPerGallon": 19, + "cylinders": 6, + "horsepower": 88, + "x": 6.116011353863191 + }, + { + "name": "amc matador", + "milesPerGallon": 18, + "cylinders": 6, + "horsepower": 100, + "x": 5.865571771104295 + }, + { + "name": "chevrolet impala", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 165, + "x": 7.80322981951277 + }, + { + "name": "pontiac catalina brougham", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 175, + "x": 7.712942520435072 + }, + { + "name": "ford galaxie 500", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 153, + "x": 8.030269860470632 + }, + { + "name": "plymouth fury iii", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 150, + "x": 7.8959396584543855 + }, + { + "name": "dodge monaco (sw)", + "milesPerGallon": 12, + "cylinders": 8, + "horsepower": 180, + "x": 8.15167511088829 + }, + { + "name": "ford country squire (sw)", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 170, + "x": 7.642988316347062 + }, + { + "name": "pontiac safari (sw)", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 175, + "x": 7.837391703481973 + }, + { + "name": "amc hornet sportabout (sw)", + "milesPerGallon": 18, + "cylinders": 6, + "horsepower": 110, + "x": 6.287237197746149 + }, + { + "name": "chevrolet vega (sw)", + "milesPerGallon": 22, + "cylinders": 4, + "horsepower": 72, + "x": 4.201240369620046 + }, + { + "name": "pontiac firebird", + "milesPerGallon": 19, + "cylinders": 6, + "horsepower": 100, + "x": 6.091165935264614 + }, + { + "name": "ford mustang", + "milesPerGallon": 18, + "cylinders": 6, + "horsepower": 88, + "x": 6.36195718874336 + }, + { + "name": "mercury capri 2000", + "milesPerGallon": 23, + "cylinders": 4, + "horsepower": 86, + "x": 3.8411851683678155 + }, + { + "name": "opel 1900", + "milesPerGallon": 28, + "cylinders": 4, + "horsepower": 90, + "x": 4.080202623672469 + }, + { + "name": "peugeot 304", + "milesPerGallon": 30, + "cylinders": 4, + "horsepower": 70, + "x": 3.8607928613726648 + }, + { + "name": "fiat 124b", + "milesPerGallon": 30, + "cylinders": 4, + "horsepower": 76, + "x": 3.7969976315564606 + }, + { + "name": "toyota corolla 1200", + "milesPerGallon": 31, + "cylinders": 4, + "horsepower": 65, + "x": 4.363211116247065 + }, + { + "name": "datsun 1200", + "milesPerGallon": 35, + "cylinders": 4, + "horsepower": 69, + "x": 4.316312298201062 + }, + { + "name": "volkswagen model 111", + "milesPerGallon": 27, + "cylinders": 4, + "horsepower": 60, + "x": 3.711432044472396 + }, + { + "name": "plymouth cricket", + "milesPerGallon": 26, + "cylinders": 4, + "horsepower": 70, + "x": 3.9609923230640787 + }, + { + "name": "toyota corona hardtop", + "milesPerGallon": 24, + "cylinders": 4, + "horsepower": 95, + "x": 4.263784859264984 + }, + { + "name": "dodge colt hardtop", + "milesPerGallon": 25, + "cylinders": 4, + "horsepower": 80, + "x": 3.8871854792281146 + }, + { + "name": "volkswagen type 3", + "milesPerGallon": 23, + "cylinders": 4, + "horsepower": 54, + "x": 3.8360975201282663 + }, + { + "name": "chevrolet vega", + "milesPerGallon": 20, + "cylinders": 4, + "horsepower": 90, + "x": 4.172708392435074 + }, + { + "name": "ford pinto runabout", + "milesPerGallon": 21, + "cylinders": 4, + "horsepower": 86, + "x": 3.9673857263272256 + }, + { + "name": "chevrolet impala", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 165, + "x": 7.633164000543357 + }, + { + "name": "pontiac catalina", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 175, + "x": 7.886678205550053 + }, + { + "name": "plymouth fury iii", + "milesPerGallon": 15, + "cylinders": 8, + "horsepower": 150, + "x": 8.275671856536176 + }, + { + "name": "ford galaxie 500", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 153, + "x": 7.951195410494355 + }, + { + "name": "amc ambassador sst", + "milesPerGallon": 17, + "cylinders": 8, + "horsepower": 150, + "x": 7.882820449295332 + }, + { + "name": "mercury marquis", + "milesPerGallon": 11, + "cylinders": 8, + "horsepower": 208, + "x": 7.849390788382628 + }, + { + "name": "buick lesabre custom", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 155, + "x": 7.948201490604689 + }, + { + "name": "oldsmobile delta 88 royale", + "milesPerGallon": 12, + "cylinders": 8, + "horsepower": 160, + "x": 8.210635205663252 + }, + { + "name": "chrysler newport royal", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 190, + "x": 7.641036004573681 + }, + { + "name": "mazda rx2 coupe", + "milesPerGallon": 19, + "cylinders": 3, + "horsepower": 97, + "x": 2.891821199642409 + }, + { + "name": "amc matador (sw)", + "milesPerGallon": 15, + "cylinders": 8, + "horsepower": 150, + "x": 8.336629003944669 + }, + { + "name": "chevrolet chevelle concours (sw)", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 130, + "x": 7.9219881116886475 + }, + { + "name": "ford gran torino (sw)", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 140, + "x": 7.8934726533849435 + }, + { + "name": "plymouth satellite custom (sw)", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 150, + "x": 8.057706267563129 + }, + { + "name": "volvo 145e (sw)", + "milesPerGallon": 18, + "cylinders": 4, + "horsepower": 112, + "x": 3.635290276575149 + }, + { + "name": "volkswagen 411 (sw)", + "milesPerGallon": 22, + "cylinders": 4, + "horsepower": 76, + "x": 3.8028229183447957 + }, + { + "name": "peugeot 504 (sw)", + "milesPerGallon": 21, + "cylinders": 4, + "horsepower": 87, + "x": 4.118577741767033 + }, + { + "name": "renault 12 (sw)", + "milesPerGallon": 26, + "cylinders": 4, + "horsepower": 69, + "x": 4.198450953513762 + }, + { + "name": "ford pinto (sw)", + "milesPerGallon": 22, + "cylinders": 4, + "horsepower": 86, + "x": 4.329784358153141 + }, + { + "name": "datsun 510 (sw)", + "milesPerGallon": 28, + "cylinders": 4, + "horsepower": 92, + "x": 3.9435403382828396 + }, + { + "name": "toyouta corona mark ii (sw)", + "milesPerGallon": 23, + "cylinders": 4, + "horsepower": 97, + "x": 4.35540238583771 + }, + { + "name": "dodge colt (sw)", + "milesPerGallon": 28, + "cylinders": 4, + "horsepower": 80, + "x": 4.037920811568482 + }, + { + "name": "toyota corolla 1600 (sw)", + "milesPerGallon": 27, + "cylinders": 4, + "horsepower": 88, + "x": 3.7599084399512606 + }, + { + "name": "buick century 350", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 175, + "x": 8.326745745776993 + }, + { + "name": "amc matador", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 150, + "x": 8.062835335606577 + }, + { + "name": "chevrolet malibu", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 145, + "x": 8.361171737905769 + }, + { + "name": "ford gran torino", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 137, + "x": 7.837847425105593 + }, + { + "name": "dodge coronet custom", + "milesPerGallon": 15, + "cylinders": 8, + "horsepower": 150, + "x": 7.939600483693272 + }, + { + "name": "mercury marquis brougham", + "milesPerGallon": 12, + "cylinders": 8, + "horsepower": 198, + "x": 7.644723815901321 + }, + { + "name": "chevrolet caprice classic", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 150, + "x": 7.973438719478234 + }, + { + "name": "ford ltd", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 158, + "x": 7.7188754660438414 + }, + { + "name": "plymouth fury gran sedan", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 150, + "x": 8.11850643108697 + }, + { + "name": "chrysler new yorker brougham", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 215, + "x": 8.205134389394614 + }, + { + "name": "buick electra 225 custom", + "milesPerGallon": 12, + "cylinders": 8, + "horsepower": 225, + "x": 7.923409436249858 + }, + { + "name": "amc ambassador brougham", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 175, + "x": 8.228936770225731 + }, + { + "name": "plymouth valiant", + "milesPerGallon": 18, + "cylinders": 6, + "horsepower": 105, + "x": 5.674149489224827 + }, + { + "name": "chevrolet nova custom", + "milesPerGallon": 16, + "cylinders": 6, + "horsepower": 100, + "x": 6.031504541773996 + }, + { + "name": "amc hornet", + "milesPerGallon": 18, + "cylinders": 6, + "horsepower": 100, + "x": 5.9503616396021055 + }, + { + "name": "ford maverick", + "milesPerGallon": 18, + "cylinders": 6, + "horsepower": 88, + "x": 5.976960416158603 + }, + { + "name": "plymouth duster", + "milesPerGallon": 23, + "cylinders": 6, + "horsepower": 95, + "x": 6.089505720521723 + }, + { + "name": "volkswagen super beetle", + "milesPerGallon": 26, + "cylinders": 4, + "horsepower": 46, + "x": 3.7303981874150773 + }, + { + "name": "chevrolet impala", + "milesPerGallon": 11, + "cylinders": 8, + "horsepower": 150, + "x": 7.976213436545324 + }, + { + "name": "ford country", + "milesPerGallon": 12, + "cylinders": 8, + "horsepower": 167, + "x": 8.268475314508438 + }, + { + "name": "plymouth custom suburb", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 170, + "x": 8.173854895547144 + }, + { + "name": "oldsmobile vista cruiser", + "milesPerGallon": 12, + "cylinders": 8, + "horsepower": 180, + "x": 7.9615284565949125 + }, + { + "name": "amc gremlin", + "milesPerGallon": 18, + "cylinders": 6, + "horsepower": 100, + "x": 6.35906036490087 + }, + { + "name": "toyota carina", + "milesPerGallon": 20, + "cylinders": 4, + "horsepower": 88, + "x": 3.6830139107575413 + }, + { + "name": "chevrolet vega", + "milesPerGallon": 21, + "cylinders": 4, + "horsepower": 72, + "x": 3.777266668178489 + }, + { + "name": "datsun 610", + "milesPerGallon": 22, + "cylinders": 4, + "horsepower": 94, + "x": 3.8773818726423626 + }, + { + "name": "maxda rx3", + "milesPerGallon": 18, + "cylinders": 3, + "horsepower": 90, + "x": 3.0856590246125553 + }, + { + "name": "ford pinto", + "milesPerGallon": 19, + "cylinders": 4, + "horsepower": 85, + "x": 4.145398212616298 + }, + { + "name": "mercury capri v6", + "milesPerGallon": 21, + "cylinders": 6, + "horsepower": 107, + "x": 5.801479613628054 + }, + { + "name": "fiat 124 sport coupe", + "milesPerGallon": 26, + "cylinders": 4, + "horsepower": 90, + "x": 4.204130436361175 + }, + { + "name": "chevrolet monte carlo s", + "milesPerGallon": 15, + "cylinders": 8, + "horsepower": 145, + "x": 7.789089747321902 + }, + { + "name": "pontiac grand prix", + "milesPerGallon": 16, + "cylinders": 8, + "horsepower": 230, + "x": 8.368666947054 + }, + { + "name": "fiat 128", + "milesPerGallon": 29, + "cylinders": 4, + "horsepower": 49, + "x": 3.9641028087660763 + }, + { + "name": "opel manta", + "milesPerGallon": 24, + "cylinders": 4, + "horsepower": 75, + "x": 4.194627460567969 + }, + { + "name": "audi 100ls", + "milesPerGallon": 20, + "cylinders": 4, + "horsepower": 91, + "x": 3.7428576589745863 + }, + { + "name": "volvo 144ea", + "milesPerGallon": 19, + "cylinders": 4, + "horsepower": 112, + "x": 3.8261790588724116 + }, + { + "name": "dodge dart custom", + "milesPerGallon": 15, + "cylinders": 8, + "horsepower": 150, + "x": 8.261908833153957 + }, + { + "name": "saab 99le", + "milesPerGallon": 24, + "cylinders": 4, + "horsepower": 110, + "x": 3.8923861779764803 + }, + { + "name": "toyota mark ii", + "milesPerGallon": 20, + "cylinders": 6, + "horsepower": 122, + "x": 6.023305090318881 + }, + { + "name": "oldsmobile omega", + "milesPerGallon": 11, + "cylinders": 8, + "horsepower": 180, + "x": 7.916533566730453 + }, + { + "name": "plymouth duster", + "milesPerGallon": 20, + "cylinders": 6, + "horsepower": 95, + "x": 5.815183875829537 + }, + { + "name": "ford maverick", + "milesPerGallon": 21, + "cylinders": 6, + "horsepower": 0, + "x": 6.087079591635942 + }, + { + "name": "amc hornet", + "milesPerGallon": 19, + "cylinders": 6, + "horsepower": 100, + "x": 6.132976630768644 + }, + { + "name": "chevrolet nova", + "milesPerGallon": 15, + "cylinders": 6, + "horsepower": 100, + "x": 5.77587112911776 + }, + { + "name": "datsun b210", + "milesPerGallon": 31, + "cylinders": 4, + "horsepower": 67, + "x": 3.7957431353944884 + }, + { + "name": "ford pinto", + "milesPerGallon": 26, + "cylinders": 4, + "horsepower": 80, + "x": 4.231979588309825 + }, + { + "name": "toyota corolla 1200", + "milesPerGallon": 32, + "cylinders": 4, + "horsepower": 65, + "x": 3.7452757830244146 + }, + { + "name": "chevrolet vega", + "milesPerGallon": 25, + "cylinders": 4, + "horsepower": 75, + "x": 4.36199952209112 + }, + { + "name": "chevrolet chevelle malibu classic", + "milesPerGallon": 16, + "cylinders": 6, + "horsepower": 100, + "x": 6.132102235992026 + }, + { + "name": "amc matador", + "milesPerGallon": 16, + "cylinders": 6, + "horsepower": 110, + "x": 6.244358407543402 + }, + { + "name": "plymouth satellite sebring", + "milesPerGallon": 18, + "cylinders": 6, + "horsepower": 105, + "x": 5.9669018127491755 + }, + { + "name": "ford gran torino", + "milesPerGallon": 16, + "cylinders": 8, + "horsepower": 140, + "x": 7.8345110901907615 + }, + { + "name": "buick century luxus (sw)", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 150, + "x": 8.243711758447686 + }, + { + "name": "dodge coronet custom (sw)", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 150, + "x": 7.6391122249741805 + }, + { + "name": "ford gran torino (sw)", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 140, + "x": 8.149220531713828 + }, + { + "name": "amc matador (sw)", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 150, + "x": 8.257730279738169 + }, + { + "name": "audi fox", + "milesPerGallon": 29, + "cylinders": 4, + "horsepower": 83, + "x": 3.7204948906649604 + }, + { + "name": "volkswagen dasher", + "milesPerGallon": 26, + "cylinders": 4, + "horsepower": 67, + "x": 4.044604283879304 + }, + { + "name": "opel manta", + "milesPerGallon": 26, + "cylinders": 4, + "horsepower": 78, + "x": 4.1329159747108735 + }, + { + "name": "toyota corona", + "milesPerGallon": 31, + "cylinders": 4, + "horsepower": 52, + "x": 3.763628636444657 + }, + { + "name": "datsun 710", + "milesPerGallon": 32, + "cylinders": 4, + "horsepower": 61, + "x": 4.108614905428027 + }, + { + "name": "dodge colt", + "milesPerGallon": 28, + "cylinders": 4, + "horsepower": 75, + "x": 3.829343093554908 + }, + { + "name": "fiat 128", + "milesPerGallon": 24, + "cylinders": 4, + "horsepower": 75, + "x": 3.992179538347937 + }, + { + "name": "fiat 124 tc", + "milesPerGallon": 26, + "cylinders": 4, + "horsepower": 75, + "x": 4.021045930602439 + }, + { + "name": "honda civic", + "milesPerGallon": 24, + "cylinders": 4, + "horsepower": 97, + "x": 4.01260776755379 + }, + { + "name": "subaru", + "milesPerGallon": 26, + "cylinders": 4, + "horsepower": 93, + "x": 4.080818944944528 + }, + { + "name": "fiat x1.9", + "milesPerGallon": 31, + "cylinders": 4, + "horsepower": 67, + "x": 4.081015454309478 + }, + { + "name": "plymouth valiant custom", + "milesPerGallon": 19, + "cylinders": 6, + "horsepower": 95, + "x": 5.7450311922420685 + }, + { + "name": "chevrolet nova", + "milesPerGallon": 18, + "cylinders": 6, + "horsepower": 105, + "x": 5.810482491296187 + }, + { + "name": "mercury monarch", + "milesPerGallon": 15, + "cylinders": 6, + "horsepower": 72, + "x": 5.911705207459032 + }, + { + "name": "ford maverick", + "milesPerGallon": 15, + "cylinders": 6, + "horsepower": 72, + "x": 6.033276990213819 + }, + { + "name": "pontiac catalina", + "milesPerGallon": 16, + "cylinders": 8, + "horsepower": 170, + "x": 7.718068536346503 + }, + { + "name": "chevrolet bel air", + "milesPerGallon": 15, + "cylinders": 8, + "horsepower": 145, + "x": 8.317758125572004 + }, + { + "name": "plymouth grand fury", + "milesPerGallon": 16, + "cylinders": 8, + "horsepower": 150, + "x": 7.7703271590264125 + }, + { + "name": "ford ltd", + "milesPerGallon": 14, + "cylinders": 8, + "horsepower": 148, + "x": 7.786061816063091 + }, + { + "name": "buick century", + "milesPerGallon": 17, + "cylinders": 6, + "horsepower": 110, + "x": 5.687539285829092 + }, + { + "name": "chevroelt chevelle malibu", + "milesPerGallon": 16, + "cylinders": 6, + "horsepower": 105, + "x": 5.846163100863938 + }, + { + "name": "amc matador", + "milesPerGallon": 15, + "cylinders": 6, + "horsepower": 110, + "x": 6.149551566435133 + }, + { + "name": "plymouth fury", + "milesPerGallon": 18, + "cylinders": 6, + "horsepower": 95, + "x": 5.7026529649245346 + }, + { + "name": "buick skyhawk", + "milesPerGallon": 21, + "cylinders": 6, + "horsepower": 110, + "x": 6.030710322304106 + }, + { + "name": "chevrolet monza 2+2", + "milesPerGallon": 20, + "cylinders": 8, + "horsepower": 110, + "x": 8.337542628333226 + }, + { + "name": "ford mustang ii", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 129, + "x": 7.726720573831461 + }, + { + "name": "toyota corolla", + "milesPerGallon": 29, + "cylinders": 4, + "horsepower": 75, + "x": 3.899423379967887 + }, + { + "name": "ford pinto", + "milesPerGallon": 23, + "cylinders": 4, + "horsepower": 83, + "x": 3.981411220984986 + }, + { + "name": "amc gremlin", + "milesPerGallon": 20, + "cylinders": 6, + "horsepower": 100, + "x": 6.220606678835218 + }, + { + "name": "pontiac astro", + "milesPerGallon": 23, + "cylinders": 4, + "horsepower": 78, + "x": 3.921476707741298 + }, + { + "name": "toyota corona", + "milesPerGallon": 24, + "cylinders": 4, + "horsepower": 96, + "x": 3.929493199649912 + }, + { + "name": "volkswagen dasher", + "milesPerGallon": 25, + "cylinders": 4, + "horsepower": 71, + "x": 3.967731010447716 + }, + { + "name": "datsun 710", + "milesPerGallon": 24, + "cylinders": 4, + "horsepower": 97, + "x": 3.6434570923586773 + }, + { + "name": "ford pinto", + "milesPerGallon": 18, + "cylinders": 6, + "horsepower": 97, + "x": 5.657146585274514 + }, + { + "name": "volkswagen rabbit", + "milesPerGallon": 29, + "cylinders": 4, + "horsepower": 70, + "x": 4.360660460667372 + }, + { + "name": "amc pacer", + "milesPerGallon": 19, + "cylinders": 6, + "horsepower": 90, + "x": 6.279042915974931 + }, + { + "name": "audi 100ls", + "milesPerGallon": 23, + "cylinders": 4, + "horsepower": 95, + "x": 3.729205521651694 + }, + { + "name": "peugeot 504", + "milesPerGallon": 23, + "cylinders": 4, + "horsepower": 88, + "x": 4.172579879270223 + }, + { + "name": "volvo 244dl", + "milesPerGallon": 22, + "cylinders": 4, + "horsepower": 98, + "x": 3.6460892812911494 + }, + { + "name": "saab 99le", + "milesPerGallon": 25, + "cylinders": 4, + "horsepower": 115, + "x": 4.099480817622986 + }, + { + "name": "honda civic cvcc", + "milesPerGallon": 33, + "cylinders": 4, + "horsepower": 53, + "x": 3.686699184979733 + }, + { + "name": "fiat 131", + "milesPerGallon": 28, + "cylinders": 4, + "horsepower": 86, + "x": 3.8906568823168275 + }, + { + "name": "opel 1900", + "milesPerGallon": 25, + "cylinders": 4, + "horsepower": 81, + "x": 4.163213309864342 + }, + { + "name": "capri ii", + "milesPerGallon": 25, + "cylinders": 4, + "horsepower": 92, + "x": 4.041695420795337 + }, + { + "name": "dodge colt", + "milesPerGallon": 26, + "cylinders": 4, + "horsepower": 79, + "x": 4.025099995007562 + }, + { + "name": "renault 12tl", + "milesPerGallon": 27, + "cylinders": 4, + "horsepower": 83, + "x": 3.757853046507196 + }, + { + "name": "chevrolet chevelle malibu classic", + "milesPerGallon": 17.5, + "cylinders": 8, + "horsepower": 140, + "x": 7.699522918782513 + }, + { + "name": "dodge coronet brougham", + "milesPerGallon": 16, + "cylinders": 8, + "horsepower": 150, + "x": 7.83205495307041 + }, + { + "name": "amc matador", + "milesPerGallon": 15.5, + "cylinders": 8, + "horsepower": 120, + "x": 8.048915250032099 + }, + { + "name": "ford gran torino", + "milesPerGallon": 14.5, + "cylinders": 8, + "horsepower": 152, + "x": 8.011651456551443 + }, + { + "name": "plymouth valiant", + "milesPerGallon": 22, + "cylinders": 6, + "horsepower": 100, + "x": 5.70198208409958 + }, + { + "name": "chevrolet nova", + "milesPerGallon": 22, + "cylinders": 6, + "horsepower": 105, + "x": 5.920907645277557 + }, + { + "name": "ford maverick", + "milesPerGallon": 24, + "cylinders": 6, + "horsepower": 81, + "x": 5.773924675854247 + }, + { + "name": "amc hornet", + "milesPerGallon": 22.5, + "cylinders": 6, + "horsepower": 90, + "x": 6.34431039995742 + }, + { + "name": "chevrolet chevette", + "milesPerGallon": 29, + "cylinders": 4, + "horsepower": 52, + "x": 4.277594873300891 + }, + { + "name": "chevrolet woody", + "milesPerGallon": 24.5, + "cylinders": 4, + "horsepower": 60, + "x": 3.765335591263168 + }, + { + "name": "vw rabbit", + "milesPerGallon": 29, + "cylinders": 4, + "horsepower": 70, + "x": 4.278770224425459 + }, + { + "name": "honda civic", + "milesPerGallon": 33, + "cylinders": 4, + "horsepower": 53, + "x": 4.161027157987546 + }, + { + "name": "dodge aspen se", + "milesPerGallon": 20, + "cylinders": 6, + "horsepower": 100, + "x": 6.152268187897024 + }, + { + "name": "ford granada ghia", + "milesPerGallon": 18, + "cylinders": 6, + "horsepower": 78, + "x": 5.913324809422544 + }, + { + "name": "pontiac ventura sj", + "milesPerGallon": 18.5, + "cylinders": 6, + "horsepower": 110, + "x": 5.828381858640106 + }, + { + "name": "amc pacer d/l", + "milesPerGallon": 17.5, + "cylinders": 6, + "horsepower": 95, + "x": 5.8683320093177365 + }, + { + "name": "volkswagen rabbit", + "milesPerGallon": 29.5, + "cylinders": 4, + "horsepower": 71, + "x": 3.8792962359719265 + }, + { + "name": "datsun b-210", + "milesPerGallon": 32, + "cylinders": 4, + "horsepower": 70, + "x": 3.911427860622622 + }, + { + "name": "toyota corolla", + "milesPerGallon": 28, + "cylinders": 4, + "horsepower": 75, + "x": 3.8125207839889685 + }, + { + "name": "ford pinto", + "milesPerGallon": 26.5, + "cylinders": 4, + "horsepower": 72, + "x": 3.9382401967362717 + }, + { + "name": "volvo 245", + "milesPerGallon": 20, + "cylinders": 4, + "horsepower": 102, + "x": 3.9172891932003227 + }, + { + "name": "plymouth volare premier v8", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 150, + "x": 7.730584368976243 + }, + { + "name": "peugeot 504", + "milesPerGallon": 19, + "cylinders": 4, + "horsepower": 88, + "x": 3.6829066868121823 + }, + { + "name": "toyota mark ii", + "milesPerGallon": 19, + "cylinders": 6, + "horsepower": 108, + "x": 5.767576399045697 + }, + { + "name": "mercedes-benz 280s", + "milesPerGallon": 16.5, + "cylinders": 6, + "horsepower": 120, + "x": 5.944834766302336 + }, + { + "name": "cadillac seville", + "milesPerGallon": 16.5, + "cylinders": 8, + "horsepower": 180, + "x": 7.945298420556104 + }, + { + "name": "chevy c10", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 145, + "x": 7.74325655312382 + }, + { + "name": "ford f108", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 130, + "x": 7.641011022203554 + }, + { + "name": "dodge d100", + "milesPerGallon": 13, + "cylinders": 8, + "horsepower": 150, + "x": 8.205664448591063 + }, + { + "name": "honda Accelerationord cvcc", + "milesPerGallon": 31.5, + "cylinders": 4, + "horsepower": 68, + "x": 3.9260572773144036 + }, + { + "name": "buick opel isuzu deluxe", + "milesPerGallon": 30, + "cylinders": 4, + "horsepower": 80, + "x": 4.234095373803297 + }, + { + "name": "renault 5 gtl", + "milesPerGallon": 36, + "cylinders": 4, + "horsepower": 58, + "x": 3.915485542037537 + }, + { + "name": "plymouth arrow gs", + "milesPerGallon": 25.5, + "cylinders": 4, + "horsepower": 96, + "x": 3.711987497789524 + }, + { + "name": "datsun f-10 hatchback", + "milesPerGallon": 33.5, + "cylinders": 4, + "horsepower": 70, + "x": 4.275556352197315 + }, + { + "name": "chevrolet caprice classic", + "milesPerGallon": 17.5, + "cylinders": 8, + "horsepower": 145, + "x": 8.179625793921783 + }, + { + "name": "oldsmobile cutlass supreme", + "milesPerGallon": 17, + "cylinders": 8, + "horsepower": 110, + "x": 8.3516900485701 + }, + { + "name": "dodge monaco brougham", + "milesPerGallon": 15.5, + "cylinders": 8, + "horsepower": 145, + "x": 7.8297250571128885 + }, + { + "name": "mercury cougar brougham", + "milesPerGallon": 15, + "cylinders": 8, + "horsepower": 130, + "x": 7.944278879464085 + }, + { + "name": "chevrolet concours", + "milesPerGallon": 17.5, + "cylinders": 6, + "horsepower": 110, + "x": 6.150894070023309 + }, + { + "name": "buick skylark", + "milesPerGallon": 20.5, + "cylinders": 6, + "horsepower": 105, + "x": 5.723840786618133 + }, + { + "name": "plymouth volare custom", + "milesPerGallon": 19, + "cylinders": 6, + "horsepower": 100, + "x": 6.200854899011364 + }, + { + "name": "ford granada", + "milesPerGallon": 18.5, + "cylinders": 6, + "horsepower": 98, + "x": 5.767027512175655 + }, + { + "name": "pontiac grand prix lj", + "milesPerGallon": 16, + "cylinders": 8, + "horsepower": 180, + "x": 7.7585751577480035 + }, + { + "name": "chevrolet monte carlo landau", + "milesPerGallon": 15.5, + "cylinders": 8, + "horsepower": 170, + "x": 8.045977852201142 + }, + { + "name": "chrysler cordoba", + "milesPerGallon": 15.5, + "cylinders": 8, + "horsepower": 190, + "x": 8.192486708372897 + }, + { + "name": "ford thunderbird", + "milesPerGallon": 16, + "cylinders": 8, + "horsepower": 149, + "x": 8.201223481449942 + }, + { + "name": "volkswagen rabbit custom", + "milesPerGallon": 29, + "cylinders": 4, + "horsepower": 78, + "x": 4.057195298815751 + }, + { + "name": "pontiac sunbird coupe", + "milesPerGallon": 24.5, + "cylinders": 4, + "horsepower": 88, + "x": 4.185384444111024 + }, + { + "name": "toyota corolla liftback", + "milesPerGallon": 26, + "cylinders": 4, + "horsepower": 75, + "x": 3.7552968862230323 + }, + { + "name": "ford mustang ii 2+2", + "milesPerGallon": 25.5, + "cylinders": 4, + "horsepower": 89, + "x": 3.803025515743171 + }, + { + "name": "chevrolet chevette", + "milesPerGallon": 30.5, + "cylinders": 4, + "horsepower": 63, + "x": 3.7005952927648225 + }, + { + "name": "dodge colt m/m", + "milesPerGallon": 33.5, + "cylinders": 4, + "horsepower": 83, + "x": 4.250604683713029 + }, + { + "name": "subaru dl", + "milesPerGallon": 30, + "cylinders": 4, + "horsepower": 67, + "x": 4.155205977408221 + }, + { + "name": "volkswagen dasher", + "milesPerGallon": 30.5, + "cylinders": 4, + "horsepower": 78, + "x": 3.794347823856479 + }, + { + "name": "datsun 810", + "milesPerGallon": 22, + "cylinders": 6, + "horsepower": 97, + "x": 5.748505859329592 + }, + { + "name": "bmw 320i", + "milesPerGallon": 21.5, + "cylinders": 4, + "horsepower": 110, + "x": 3.691939355771659 + }, + { + "name": "mazda rx-4", + "milesPerGallon": 21.5, + "cylinders": 3, + "horsepower": 110, + "x": 2.81777818404469 + }, + { + "name": "volkswagen rabbit custom diesel", + "milesPerGallon": 43.1, + "cylinders": 4, + "horsepower": 48, + "x": 3.7220555062656944 + }, + { + "name": "ford fiesta", + "milesPerGallon": 36.1, + "cylinders": 4, + "horsepower": 66, + "x": 3.6682376054304378 + }, + { + "name": "mazda glc deluxe", + "milesPerGallon": 32.8, + "cylinders": 4, + "horsepower": 52, + "x": 4.012845248275688 + }, + { + "name": "datsun b210 gx", + "milesPerGallon": 39.4, + "cylinders": 4, + "horsepower": 70, + "x": 3.8904807400804913 + }, + { + "name": "honda civic cvcc", + "milesPerGallon": 36.1, + "cylinders": 4, + "horsepower": 60, + "x": 4.349667176249244 + }, + { + "name": "oldsmobile cutlass salon brougham", + "milesPerGallon": 19.9, + "cylinders": 8, + "horsepower": 110, + "x": 8.218646383633754 + }, + { + "name": "dodge diplomat", + "milesPerGallon": 19.4, + "cylinders": 8, + "horsepower": 140, + "x": 8.061011909911953 + }, + { + "name": "mercury monarch ghia", + "milesPerGallon": 20.2, + "cylinders": 8, + "horsepower": 139, + "x": 8.09467688137649 + }, + { + "name": "pontiac phoenix lj", + "milesPerGallon": 19.2, + "cylinders": 6, + "horsepower": 105, + "x": 5.848027241639671 + }, + { + "name": "chevrolet malibu", + "milesPerGallon": 20.5, + "cylinders": 6, + "horsepower": 95, + "x": 6.1706073883547505 + }, + { + "name": "ford fairmont (auto)", + "milesPerGallon": 20.2, + "cylinders": 6, + "horsepower": 85, + "x": 5.74555866766249 + }, + { + "name": "ford fairmont (man)", + "milesPerGallon": 25.1, + "cylinders": 4, + "horsepower": 88, + "x": 4.004711038383785 + }, + { + "name": "plymouth volare", + "milesPerGallon": 20.5, + "cylinders": 6, + "horsepower": 100, + "x": 5.874273239748711 + }, + { + "name": "amc concord", + "milesPerGallon": 19.4, + "cylinders": 6, + "horsepower": 90, + "x": 6.3572316328228835 + }, + { + "name": "buick century special", + "milesPerGallon": 20.6, + "cylinders": 6, + "horsepower": 105, + "x": 6.326290929100672 + }, + { + "name": "mercury zephyr", + "milesPerGallon": 20.8, + "cylinders": 6, + "horsepower": 85, + "x": 6.090315657803135 + }, + { + "name": "dodge aspen", + "milesPerGallon": 18.6, + "cylinders": 6, + "horsepower": 110, + "x": 6.09127717604979 + }, + { + "name": "amc concord d/l", + "milesPerGallon": 18.1, + "cylinders": 6, + "horsepower": 120, + "x": 6.178803092678216 + }, + { + "name": "chevrolet monte carlo landau", + "milesPerGallon": 19.2, + "cylinders": 8, + "horsepower": 145, + "x": 7.8831426332006025 + }, + { + "name": "buick regal sport coupe (turbo)", + "milesPerGallon": 17.7, + "cylinders": 6, + "horsepower": 165, + "x": 6.266611150726625 + }, + { + "name": "ford futura", + "milesPerGallon": 18.1, + "cylinders": 8, + "horsepower": 139, + "x": 7.939586988821181 + }, + { + "name": "dodge magnum xe", + "milesPerGallon": 17.5, + "cylinders": 8, + "horsepower": 140, + "x": 7.6749842730690325 + }, + { + "name": "chevrolet chevette", + "milesPerGallon": 30, + "cylinders": 4, + "horsepower": 68, + "x": 4.026094223323545 + }, + { + "name": "toyota corona", + "milesPerGallon": 27.5, + "cylinders": 4, + "horsepower": 95, + "x": 3.989114871371014 + }, + { + "name": "datsun 510", + "milesPerGallon": 27.2, + "cylinders": 4, + "horsepower": 97, + "x": 3.919495603121351 + }, + { + "name": "dodge omni", + "milesPerGallon": 30.9, + "cylinders": 4, + "horsepower": 75, + "x": 3.634310672481856 + }, + { + "name": "toyota celica gt liftback", + "milesPerGallon": 21.1, + "cylinders": 4, + "horsepower": 95, + "x": 4.2362951679593 + }, + { + "name": "plymouth sapporo", + "milesPerGallon": 23.2, + "cylinders": 4, + "horsepower": 105, + "x": 4.03418952324368 + }, + { + "name": "oldsmobile starfire sx", + "milesPerGallon": 23.8, + "cylinders": 4, + "horsepower": 85, + "x": 4.021497535176559 + }, + { + "name": "datsun 200-sx", + "milesPerGallon": 23.9, + "cylinders": 4, + "horsepower": 97, + "x": 3.6549753868403414 + }, + { + "name": "audi 5000", + "milesPerGallon": 20.3, + "cylinders": 5, + "horsepower": 103, + "x": 5.1890073392770635 + }, + { + "name": "volvo 264gl", + "milesPerGallon": 17, + "cylinders": 6, + "horsepower": 125, + "x": 5.981745305757347 + }, + { + "name": "saab 99gle", + "milesPerGallon": 21.6, + "cylinders": 4, + "horsepower": 115, + "x": 4.065826343090008 + }, + { + "name": "peugeot 604sl", + "milesPerGallon": 16.2, + "cylinders": 6, + "horsepower": 133, + "x": 5.810027165541005 + }, + { + "name": "volkswagen scirocco", + "milesPerGallon": 31.5, + "cylinders": 4, + "horsepower": 71, + "x": 4.0664857253021145 + }, + { + "name": "honda Accelerationord lx", + "milesPerGallon": 29.5, + "cylinders": 4, + "horsepower": 68, + "x": 4.274887214970657 + }, + { + "name": "pontiac lemans v6", + "milesPerGallon": 21.5, + "cylinders": 6, + "horsepower": 115, + "x": 6.230492727989444 + }, + { + "name": "mercury zephyr 6", + "milesPerGallon": 19.8, + "cylinders": 6, + "horsepower": 85, + "x": 5.948144807434942 + }, + { + "name": "ford fairmont 4", + "milesPerGallon": 22.3, + "cylinders": 4, + "horsepower": 88, + "x": 3.849531643650541 + }, + { + "name": "amc concord dl 6", + "milesPerGallon": 20.2, + "cylinders": 6, + "horsepower": 90, + "x": 5.904143705146815 + }, + { + "name": "dodge aspen 6", + "milesPerGallon": 20.6, + "cylinders": 6, + "horsepower": 110, + "x": 6.287468249670606 + }, + { + "name": "chevrolet caprice classic", + "milesPerGallon": 17, + "cylinders": 8, + "horsepower": 130, + "x": 8.006794146856944 + }, + { + "name": "ford ltd landau", + "milesPerGallon": 17.6, + "cylinders": 8, + "horsepower": 129, + "x": 7.915576220737707 + }, + { + "name": "mercury grand marquis", + "milesPerGallon": 16.5, + "cylinders": 8, + "horsepower": 138, + "x": 7.836955099770109 + }, + { + "name": "dodge st. regis", + "milesPerGallon": 18.2, + "cylinders": 8, + "horsepower": 135, + "x": 7.893805841233058 + }, + { + "name": "buick estate wagon (sw)", + "milesPerGallon": 16.9, + "cylinders": 8, + "horsepower": 155, + "x": 7.7080254609954215 + }, + { + "name": "ford country squire (sw)", + "milesPerGallon": 15.5, + "cylinders": 8, + "horsepower": 142, + "x": 7.765267134267947 + }, + { + "name": "chevrolet malibu classic (sw)", + "milesPerGallon": 19.2, + "cylinders": 8, + "horsepower": 125, + "x": 7.638579920680975 + }, + { + "name": "chrysler lebaron town @ country (sw)", + "milesPerGallon": 18.5, + "cylinders": 8, + "horsepower": 150, + "x": 8.145775610523001 + }, + { + "name": "vw rabbit custom", + "milesPerGallon": 31.9, + "cylinders": 4, + "horsepower": 71, + "x": 3.9398826540339784 + }, + { + "name": "maxda glc deluxe", + "milesPerGallon": 34.1, + "cylinders": 4, + "horsepower": 65, + "x": 3.6455722629575598 + }, + { + "name": "dodge colt hatchback custom", + "milesPerGallon": 35.7, + "cylinders": 4, + "horsepower": 80, + "x": 4.12193427440282 + }, + { + "name": "amc spirit dl", + "milesPerGallon": 27.4, + "cylinders": 4, + "horsepower": 80, + "x": 3.9716265958716166 + }, + { + "name": "mercedes benz 300d", + "milesPerGallon": 25.4, + "cylinders": 5, + "horsepower": 77, + "x": 5.068023081278515 + }, + { + "name": "cadillac eldorado", + "milesPerGallon": 23, + "cylinders": 8, + "horsepower": 125, + "x": 7.6675868574290735 + }, + { + "name": "peugeot 504", + "milesPerGallon": 27.2, + "cylinders": 4, + "horsepower": 71, + "x": 3.764605555949112 + }, + { + "name": "oldsmobile cutlass salon brougham", + "milesPerGallon": 23.9, + "cylinders": 8, + "horsepower": 90, + "x": 7.766308790449926 + }, + { + "name": "plymouth horizon", + "milesPerGallon": 34.2, + "cylinders": 4, + "horsepower": 70, + "x": 4.149160207292371 + }, + { + "name": "plymouth horizon tc3", + "milesPerGallon": 34.5, + "cylinders": 4, + "horsepower": 70, + "x": 4.229858902045439 + }, + { + "name": "datsun 210", + "milesPerGallon": 31.8, + "cylinders": 4, + "horsepower": 65, + "x": 4.271534379641972 + }, + { + "name": "fiat strada custom", + "milesPerGallon": 37.3, + "cylinders": 4, + "horsepower": 69, + "x": 4.035466279399953 + }, + { + "name": "buick skylark limited", + "milesPerGallon": 28.4, + "cylinders": 4, + "horsepower": 90, + "x": 3.71364184991431 + }, + { + "name": "chevrolet citation", + "milesPerGallon": 28.8, + "cylinders": 6, + "horsepower": 115, + "x": 5.899054957490579 + }, + { + "name": "oldsmobile omega brougham", + "milesPerGallon": 26.8, + "cylinders": 6, + "horsepower": 115, + "x": 5.946006433464216 + }, + { + "name": "pontiac phoenix", + "milesPerGallon": 33.5, + "cylinders": 4, + "horsepower": 90, + "x": 3.7396113356866927 + }, + { + "name": "vw rabbit", + "milesPerGallon": 41.5, + "cylinders": 4, + "horsepower": 76, + "x": 4.097550325478324 + }, + { + "name": "toyota corolla tercel", + "milesPerGallon": 38.1, + "cylinders": 4, + "horsepower": 60, + "x": 3.9054338799025206 + }, + { + "name": "chevrolet chevette", + "milesPerGallon": 32.1, + "cylinders": 4, + "horsepower": 70, + "x": 3.9370906275391677 + }, + { + "name": "datsun 310", + "milesPerGallon": 37.2, + "cylinders": 4, + "horsepower": 65, + "x": 3.6568656488791245 + }, + { + "name": "chevrolet citation", + "milesPerGallon": 28, + "cylinders": 4, + "horsepower": 90, + "x": 3.821088266512798 + }, + { + "name": "ford fairmont", + "milesPerGallon": 26.4, + "cylinders": 4, + "horsepower": 88, + "x": 3.70449435635481 + }, + { + "name": "amc concord", + "milesPerGallon": 24.3, + "cylinders": 4, + "horsepower": 90, + "x": 4.253594061102482 + }, + { + "name": "dodge aspen", + "milesPerGallon": 19.1, + "cylinders": 6, + "horsepower": 90, + "x": 6.282076136405616 + }, + { + "name": "audi 4000", + "milesPerGallon": 34.3, + "cylinders": 4, + "horsepower": 78, + "x": 4.3216508497895045 + }, + { + "name": "toyota corona liftback", + "milesPerGallon": 29.8, + "cylinders": 4, + "horsepower": 90, + "x": 3.888781518516995 + }, + { + "name": "mazda 626", + "milesPerGallon": 31.3, + "cylinders": 4, + "horsepower": 75, + "x": 3.8457499134604682 + }, + { + "name": "datsun 510 hatchback", + "milesPerGallon": 37, + "cylinders": 4, + "horsepower": 92, + "x": 4.0894687976157 + }, + { + "name": "toyota corolla", + "milesPerGallon": 32.2, + "cylinders": 4, + "horsepower": 75, + "x": 3.9309708244265096 + }, + { + "name": "mazda glc", + "milesPerGallon": 46.6, + "cylinders": 4, + "horsepower": 65, + "x": 4.254203956657513 + }, + { + "name": "dodge colt", + "milesPerGallon": 27.9, + "cylinders": 4, + "horsepower": 105, + "x": 4.294719995760485 + }, + { + "name": "datsun 210", + "milesPerGallon": 40.8, + "cylinders": 4, + "horsepower": 65, + "x": 3.6320715714960423 + }, + { + "name": "vw rabbit c (diesel)", + "milesPerGallon": 44.3, + "cylinders": 4, + "horsepower": 48, + "x": 4.26867037171047 + }, + { + "name": "vw dasher (diesel)", + "milesPerGallon": 43.4, + "cylinders": 4, + "horsepower": 48, + "x": 4.093809229966266 + }, + { + "name": "audi 5000s (diesel)", + "milesPerGallon": 36.4, + "cylinders": 5, + "horsepower": 67, + "x": 5.192007249064847 + }, + { + "name": "mercedes-benz 240d", + "milesPerGallon": 30, + "cylinders": 4, + "horsepower": 67, + "x": 3.9310267304450868 + }, + { + "name": "honda civic 1500 gl", + "milesPerGallon": 44.6, + "cylinders": 4, + "horsepower": 67, + "x": 4.203679390882783 + }, + { + "name": "renault lecar deluxe", + "milesPerGallon": 40.9, + "cylinders": 4, + "horsepower": 0, + "x": 4.071898955902105 + }, + { + "name": "subaru dl", + "milesPerGallon": 33.8, + "cylinders": 4, + "horsepower": 67, + "x": 4.174518278318266 + }, + { + "name": "vokswagen rabbit", + "milesPerGallon": 29.8, + "cylinders": 4, + "horsepower": 62, + "x": 3.8658063508922753 + }, + { + "name": "datsun 280-zx", + "milesPerGallon": 32.7, + "cylinders": 6, + "horsepower": 132, + "x": 5.859511410469771 + }, + { + "name": "mazda rx-7 gs", + "milesPerGallon": 23.7, + "cylinders": 3, + "horsepower": 100, + "x": 3.2086989971664353 + }, + { + "name": "triumph tr7 coupe", + "milesPerGallon": 35, + "cylinders": 4, + "horsepower": 88, + "x": 4.227487744729735 + }, + { + "name": "ford mustang cobra", + "milesPerGallon": 23.6, + "cylinders": 4, + "horsepower": 0, + "x": 4.068513150549568 + }, + { + "name": "honda Accelerationord", + "milesPerGallon": 32.4, + "cylinders": 4, + "horsepower": 72, + "x": 3.6676526960088136 + }, + { + "name": "plymouth reliant", + "milesPerGallon": 27.2, + "cylinders": 4, + "horsepower": 84, + "x": 4.132367927382765 + }, + { + "name": "buick skylark", + "milesPerGallon": 26.6, + "cylinders": 4, + "horsepower": 84, + "x": 3.6896256544908237 + }, + { + "name": "dodge aries wagon (sw)", + "milesPerGallon": 25.8, + "cylinders": 4, + "horsepower": 92, + "x": 4.050868913470094 + }, + { + "name": "chevrolet citation", + "milesPerGallon": 23.5, + "cylinders": 6, + "horsepower": 110, + "x": 5.785153063704189 + }, + { + "name": "plymouth reliant", + "milesPerGallon": 30, + "cylinders": 4, + "horsepower": 84, + "x": 3.815100124717885 + }, + { + "name": "toyota starlet", + "milesPerGallon": 39.1, + "cylinders": 4, + "horsepower": 58, + "x": 4.1983073095232495 + }, + { + "name": "plymouth champ", + "milesPerGallon": 39, + "cylinders": 4, + "horsepower": 64, + "x": 4.191097759552514 + }, + { + "name": "honda civic 1300", + "milesPerGallon": 35.1, + "cylinders": 4, + "horsepower": 60, + "x": 4.131654681105934 + }, + { + "name": "subaru", + "milesPerGallon": 32.3, + "cylinders": 4, + "horsepower": 67, + "x": 4.025765200961957 + }, + { + "name": "datsun 210", + "milesPerGallon": 37, + "cylinders": 4, + "horsepower": 65, + "x": 4.035308658219122 + }, + { + "name": "toyota tercel", + "milesPerGallon": 37.7, + "cylinders": 4, + "horsepower": 62, + "x": 4.095695463627345 + }, + { + "name": "mazda glc 4", + "milesPerGallon": 34.1, + "cylinders": 4, + "horsepower": 68, + "x": 4.012140452105604 + }, + { + "name": "plymouth horizon 4", + "milesPerGallon": 34.7, + "cylinders": 4, + "horsepower": 63, + "x": 3.6939202725344633 + }, + { + "name": "ford escort 4w", + "milesPerGallon": 34.4, + "cylinders": 4, + "horsepower": 65, + "x": 4.0109200831843665 + }, + { + "name": "ford escort 2h", + "milesPerGallon": 29.9, + "cylinders": 4, + "horsepower": 65, + "x": 4.17830102083104 + }, + { + "name": "volkswagen jetta", + "milesPerGallon": 33, + "cylinders": 4, + "horsepower": 74, + "x": 4.2853561819076145 + }, + { + "name": "renault 18i", + "milesPerGallon": 34.5, + "cylinders": 4, + "horsepower": 0, + "x": 4.359020127809212 + }, + { + "name": "honda prelude", + "milesPerGallon": 33.7, + "cylinders": 4, + "horsepower": 75, + "x": 4.1543248596235935 + }, + { + "name": "toyota corolla", + "milesPerGallon": 32.4, + "cylinders": 4, + "horsepower": 75, + "x": 3.769115939419314 + }, + { + "name": "datsun 200sx", + "milesPerGallon": 32.9, + "cylinders": 4, + "horsepower": 100, + "x": 4.295307133805183 + }, + { + "name": "mazda 626", + "milesPerGallon": 31.6, + "cylinders": 4, + "horsepower": 74, + "x": 3.7903396720903535 + }, + { + "name": "peugeot 505s turbo diesel", + "milesPerGallon": 28.1, + "cylinders": 4, + "horsepower": 80, + "x": 4.054656115599271 + }, + { + "name": "saab 900s", + "milesPerGallon": 0, + "cylinders": 4, + "horsepower": 110, + "x": 4.326379710931227 + }, + { + "name": "volvo diesel", + "milesPerGallon": 30.7, + "cylinders": 6, + "horsepower": 76, + "x": 6.197529382540965 + }, + { + "name": "toyota cressida", + "milesPerGallon": 25.4, + "cylinders": 6, + "horsepower": 116, + "x": 5.765034468301705 + }, + { + "name": "datsun 810 maxima", + "milesPerGallon": 24.2, + "cylinders": 6, + "horsepower": 120, + "x": 5.640796772821185 + }, + { + "name": "buick century", + "milesPerGallon": 22.4, + "cylinders": 6, + "horsepower": 110, + "x": 6.110410054807138 + }, + { + "name": "oldsmobile cutlass ls", + "milesPerGallon": 26.6, + "cylinders": 8, + "horsepower": 105, + "x": 7.644788144403992 + }, + { + "name": "ford granada gl", + "milesPerGallon": 20.2, + "cylinders": 6, + "horsepower": 88, + "x": 5.768702707154798 + }, + { + "name": "chrysler lebaron salon", + "milesPerGallon": 17.6, + "cylinders": 6, + "horsepower": 85, + "x": 6.2313844239860385 + }, + { + "name": "chevrolet cavalier", + "milesPerGallon": 28, + "cylinders": 4, + "horsepower": 88, + "x": 3.7847688007736187 + }, + { + "name": "chevrolet cavalier wagon", + "milesPerGallon": 27, + "cylinders": 4, + "horsepower": 88, + "x": 4.243022635523257 + }, + { + "name": "chevrolet cavalier 2-door", + "milesPerGallon": 34, + "cylinders": 4, + "horsepower": 88, + "x": 4.26214795455118 + }, + { + "name": "pontiac j2000 se hatchback", + "milesPerGallon": 31, + "cylinders": 4, + "horsepower": 85, + "x": 4.294681781593013 + }, + { + "name": "dodge aries se", + "milesPerGallon": 29, + "cylinders": 4, + "horsepower": 84, + "x": 4.3612227239547865 + }, + { + "name": "pontiac phoenix", + "milesPerGallon": 27, + "cylinders": 4, + "horsepower": 90, + "x": 3.987914895181706 + }, + { + "name": "ford fairmont futura", + "milesPerGallon": 24, + "cylinders": 4, + "horsepower": 92, + "x": 3.9060656314781035 + }, + { + "name": "amc concord dl", + "milesPerGallon": 23, + "cylinders": 4, + "horsepower": 0, + "x": 3.954666226885773 + }, + { + "name": "volkswagen rabbit l", + "milesPerGallon": 36, + "cylinders": 4, + "horsepower": 74, + "x": 4.30190674508643 + }, + { + "name": "mazda glc custom l", + "milesPerGallon": 37, + "cylinders": 4, + "horsepower": 68, + "x": 3.6280848611583063 + }, + { + "name": "mazda glc custom", + "milesPerGallon": 31, + "cylinders": 4, + "horsepower": 68, + "x": 3.6911419278159396 + }, + { + "name": "plymouth horizon miser", + "milesPerGallon": 38, + "cylinders": 4, + "horsepower": 63, + "x": 4.0011087888837595 + }, + { + "name": "mercury lynx l", + "milesPerGallon": 36, + "cylinders": 4, + "horsepower": 70, + "x": 4.183203830552381 + }, + { + "name": "nissan stanza xe", + "milesPerGallon": 36, + "cylinders": 4, + "horsepower": 88, + "x": 4.2272529260287275 + }, + { + "name": "honda Accelerationord", + "milesPerGallon": 36, + "cylinders": 4, + "horsepower": 75, + "x": 4.257656005997919 + }, + { + "name": "toyota corolla", + "milesPerGallon": 34, + "cylinders": 4, + "horsepower": 70, + "x": 4.275568077023029 + }, + { + "name": "honda civic", + "milesPerGallon": 38, + "cylinders": 4, + "horsepower": 67, + "x": 4.118475374376484 + }, + { + "name": "honda civic (auto)", + "milesPerGallon": 32, + "cylinders": 4, + "horsepower": 67, + "x": 3.9585950997318085 + }, + { + "name": "datsun 310 gx", + "milesPerGallon": 38, + "cylinders": 4, + "horsepower": 67, + "x": 3.8232069851508967 + }, + { + "name": "buick century limited", + "milesPerGallon": 25, + "cylinders": 6, + "horsepower": 110, + "x": 5.752982327423358 + }, + { + "name": "oldsmobile cutlass ciera (diesel)", + "milesPerGallon": 38, + "cylinders": 6, + "horsepower": 85, + "x": 6.189064501959804 + }, + { + "name": "chrysler lebaron medallion", + "milesPerGallon": 26, + "cylinders": 4, + "horsepower": 92, + "x": 4.2146513880184235 + }, + { + "name": "ford granada l", + "milesPerGallon": 22, + "cylinders": 6, + "horsepower": 112, + "x": 6.240598069909455 + }, + { + "name": "toyota celica gt", + "milesPerGallon": 32, + "cylinders": 4, + "horsepower": 96, + "x": 3.9204248039356773 + }, + { + "name": "dodge charger 2.2", + "milesPerGallon": 36, + "cylinders": 4, + "horsepower": 84, + "x": 4.150100620678576 + }, + { + "name": "chevrolet camaro", + "milesPerGallon": 27, + "cylinders": 4, + "horsepower": 90, + "x": 3.728501256342185 + }, + { + "name": "ford mustang gl", + "milesPerGallon": 27, + "cylinders": 4, + "horsepower": 86, + "x": 4.04286904218814 + }, + { + "name": "vw pickup", + "milesPerGallon": 44, + "cylinders": 4, + "horsepower": 52, + "x": 3.8382667209637664 + }, + { + "name": "dodge rampage", + "milesPerGallon": 32, + "cylinders": 4, + "horsepower": 84, + "x": 3.889031792685351 + }, + { + "name": "ford ranger", + "milesPerGallon": 28, + "cylinders": 4, + "horsepower": 79, + "x": 4.177096129854495 + }, + { + "name": "chevy s-10", + "milesPerGallon": 31, + "cylinders": 4, + "horsepower": 82, + "x": 3.698366552382896 + } + ] +} diff --git a/src/packages/components/VChart/Scatters/VChartScatter/index.ts b/src/packages/components/VChart/Scatters/VChartScatter/index.ts new file mode 100644 index 00000000..99c0f578 --- /dev/null +++ b/src/packages/components/VChart/Scatters/VChartScatter/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const VChartScatterConfig: ConfigType = { + key: 'VChartScatter', + chartKey: 'VVChartScatter', + conKey: 'VCVChartScatter', + title: 'VChart散点图', + category: ChatCategoryEnum.SCATTER, + categoryName: ChatCategoryEnumName.SCATTER, + package: PackagesCategoryEnum.VCHART, + chartFrame: ChartFrameEnum.VCHART, + image: 'vchart_scatter.png' +} diff --git a/src/packages/components/VChart/Scatters/VChartScatter/index.vue b/src/packages/components/VChart/Scatters/VChartScatter/index.vue new file mode 100644 index 00000000..c70c6676 --- /dev/null +++ b/src/packages/components/VChart/Scatters/VChartScatter/index.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/packages/components/VChart/Scatters/index.ts b/src/packages/components/VChart/Scatters/index.ts new file mode 100644 index 00000000..ea7959cb --- /dev/null +++ b/src/packages/components/VChart/Scatters/index.ts @@ -0,0 +1,3 @@ +import { VChartScatterConfig } from './VChartScatter/index' + +export default [VChartScatterConfig] diff --git a/src/packages/components/VChart/WordClouds/VChartWordCloud/config.ts b/src/packages/components/VChart/WordClouds/VChartWordCloud/config.ts new file mode 100644 index 00000000..38822e7b --- /dev/null +++ b/src/packages/components/VChart/WordClouds/VChartWordCloud/config.ts @@ -0,0 +1,26 @@ +import { PublicConfigClass } from '@/packages/public' +import { VChartWordCloudConfig } from './index' +import { CreateComponentType } from '@/packages/index.d' +import { vChartOptionPrefixHandle } from '@/packages/public/vChart' +import data from './data.json' +import cloneDeep from 'lodash/cloneDeep' +import { IWordCloudOption } from '../../index.d' + +export const includes = ['legends', 'tooltip'] +export const option: IWordCloudOption & { dataset?: any } = { + // 图表配置 + type: 'wordCloud', + dataset: data, + nameField: 'name', + valueField: 'value', + seriesField: 'name', + // 业务配置(后续会被转换为图表spec) + category: VChartWordCloudConfig.category, +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = VChartWordCloudConfig.key + public chartConfig = cloneDeep(VChartWordCloudConfig) + // 图表配置项 + public option = vChartOptionPrefixHandle(option, includes) +} diff --git a/src/packages/components/VChart/WordClouds/VChartWordCloud/config.vue b/src/packages/components/VChart/WordClouds/VChartWordCloud/config.vue new file mode 100644 index 00000000..48a2470f --- /dev/null +++ b/src/packages/components/VChart/WordClouds/VChartWordCloud/config.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/packages/components/VChart/WordClouds/VChartWordCloud/data.json b/src/packages/components/VChart/WordClouds/VChartWordCloud/data.json new file mode 100644 index 00000000..23b57b70 --- /dev/null +++ b/src/packages/components/VChart/WordClouds/VChartWordCloud/data.json @@ -0,0 +1,88 @@ +{ + "values": [ + { + "name": "数据可视化", + "value": 8000 + }, + { + "name": "GO VIEW", + "value": 6181 + }, + { + "name": "低代码", + "value": 4386 + }, + { + "name": "Vue3", + "value": 4055 + }, + { + "name": "TypeScript4", + "value": 2467 + }, + { + "name": "Vite2", + "value": 2244 + }, + { + "name": "NaiveUI", + "value": 1898 + }, + { + "name": "ECharts5", + "value": 1484 + }, + { + "name": "VChart", + "value": 600 + }, + { + "name": "Axios", + "value": 1112 + }, + { + "name": "Pinia2", + "value": 965 + }, + { + "name": "PlopJS", + "value": 847 + }, + { + "name": "sfc", + "value": 582 + }, + { + "name": "SCSS", + "value": 555 + }, + { + "name": "pnpm", + "value": 550 + }, + { + "name": "eslint", + "value": 462 + }, + { + "name": "json", + "value": 366 + }, + { + "name": "图表", + "value": 360 + }, + { + "name": "地图", + "value": 282 + }, + { + "name": "时钟", + "value": 273 + }, + { + "name": "标题", + "value": 265 + } + ] +} diff --git a/src/packages/components/VChart/WordClouds/VChartWordCloud/index.ts b/src/packages/components/VChart/WordClouds/VChartWordCloud/index.ts new file mode 100644 index 00000000..15fde742 --- /dev/null +++ b/src/packages/components/VChart/WordClouds/VChartWordCloud/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const VChartWordCloudConfig: ConfigType = { + key: 'VChartWordCloud', + chartKey: 'VVChartWordCloud', + conKey: 'VCVChartWordCloud', + title: 'VChart词云图', + category: ChatCategoryEnum.WORDCLOUD, + categoryName: ChatCategoryEnumName.WORDCLOUD, + package: PackagesCategoryEnum.VCHART, + chartFrame: ChartFrameEnum.VCHART, + image: 'vchart_word_cloud.png' +} diff --git a/src/packages/components/VChart/WordClouds/VChartWordCloud/index.vue b/src/packages/components/VChart/WordClouds/VChartWordCloud/index.vue new file mode 100644 index 00000000..c70c6676 --- /dev/null +++ b/src/packages/components/VChart/WordClouds/VChartWordCloud/index.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/packages/components/VChart/WordClouds/index.ts b/src/packages/components/VChart/WordClouds/index.ts new file mode 100644 index 00000000..acf8ea8b --- /dev/null +++ b/src/packages/components/VChart/WordClouds/index.ts @@ -0,0 +1,3 @@ +import { VChartWordCloudConfig } from './VChartWordCloud/index' + +export default [VChartWordCloudConfig] diff --git a/src/packages/components/VChart/index.d.ts b/src/packages/components/VChart/index.d.ts index d81841ef..4bff51fe 100644 --- a/src/packages/components/VChart/index.d.ts +++ b/src/packages/components/VChart/index.d.ts @@ -1,13 +1,25 @@ -import { IBarChartSpec } from '@visactor/vchart' +import { IBarChartSpec, ILineChartSpec, IAreaChartSpec, IPieChartSpec, IFunnelChartSpec, IWordCloudChartSpec } from '@visactor/vchart' import { ICartesianAxisCommonSpec } from '@visactor/vchart/esm/component/axis' export enum ChatCategoryEnum { BAR = 'Bars', + PIE = 'Pies', + LINE = 'Lines', + AREA = 'Areas', + FUNNEL = 'Funnels', + WORDCLOUD = 'WordClouds', + SCATTER = 'Scatters', } export enum ChatCategoryEnumName { BAR = '柱状图', + PIE = '饼图', + LINE = '折线图', + AREA = '面积图', + FUNNEL = '漏斗图', + WORDCLOUD = '词云图', + SCATTER = '散点图', } export interface IBarOption extends Omit { @@ -21,6 +33,54 @@ export interface IBarOption extends Omit { } & ICartesianAxisCommonSpec } +export interface ILineOption extends Omit { + category: ChatCategoryEnum.LINE + type: 'line' + xAxis?: { + name: string + } & ICartesianAxisCommonSpec + yAxis?: { + name: string + } & ICartesianAxisCommonSpec +} + +export interface IAreaOption extends Omit { + category: ChatCategoryEnum.AREA + type: 'area' + xAxis?: { + name: string + } & ICartesianAxisCommonSpec + yAxis?: { + name: string + } & ICartesianAxisCommonSpec +} + +export interface IPieOption extends IPieChartSpec { + category: ChatCategoryEnum.PIE + type: 'pie' +} + +export interface IFunnelOption extends IFunnelChartSpec { + category: ChatCategoryEnum.FUNNEL + type: 'funnel' +} + +export interface IWordCloudOption extends IWordCloudChartSpec { + category: ChatCategoryEnum.WORDCLOUD + type: 'wordCloud' +} + +export interface IScatterOption extends Omit { + category: ChatCategoryEnum.SCATTER + type: 'scatter' + xAxis?: { + name: string + } & ICartesianAxisCommonSpec + yAxis?: { + name: string + } & ICartesianAxisCommonSpec +} + // todo // export type IOption = IBarOption | ILineOption .... -export type IOption = IBarOption +export type IOption = IBarOption | IPieOption | ILineOption | IAreaOption | IFunnelOption | IScatterOption diff --git a/src/packages/components/VChart/index.ts b/src/packages/components/VChart/index.ts index cdc19c62..05fb97ca 100644 --- a/src/packages/components/VChart/index.ts +++ b/src/packages/components/VChart/index.ts @@ -1,3 +1,9 @@ import Bars from './Bars' +import Pies from './Pies' +import Lines from './Lines' +import Areas from './Areas' +import Funnels from './Funnels' +import WordClouds from './WordClouds' +import Scatters from './Scatters' -export const VChartList = [...Bars] +export const VChartList = [...Bars, ...Pies, ...Lines, ...Areas, ...Funnels, ...WordClouds, ...Scatters]