diff --git a/__tests__/unit/core/index-spec.ts b/__tests__/unit/core/index-spec.ts
index 3203c6bac62..9a7de8f8fc0 100644
--- a/__tests__/unit/core/index-spec.ts
+++ b/__tests__/unit/core/index-spec.ts
@@ -177,15 +177,17 @@ describe('core', () => {
});
it('getChartSize', () => {
- const line = new Line(createDiv(), {
+ createDiv('', document.body, 'changeSize');
+ document.getElementById('changeSize').style.width = '0px';
+ const line = new Line('changeSize', {
data: partySupport.filter((o) => o.type === 'FF'),
xField: 'date',
yField: 'value',
});
line.render();
- expect(line.chart.height).toBe(300);
-
+ expect(line.chart.width).toBe(400);
+ expect(line.chart.height).toBe(400);
line.destroy();
});
});
diff --git a/__tests__/utils/dom.ts b/__tests__/utils/dom.ts
index f611c0a515a..b652acb0752 100644
--- a/__tests__/utils/dom.ts
+++ b/__tests__/utils/dom.ts
@@ -2,6 +2,7 @@
* 创建一个 div 节点,并放到 container,默认放到 body 上
* @param title
* @param container
+ * @param id 容器 id
*/
export function createDiv(title: string = '', container: HTMLElement = document.body, id?: string): HTMLElement {
const div = document.createElement('div');
@@ -13,10 +14,6 @@ export function createDiv(title: string = '', container: HTMLElement = document.
container.appendChild(titleDiv);
}
- if (id) {
- div.setAttribute('id', id);
- }
-
container.appendChild(div);
return div;
diff --git a/docs/manual/plots/scatter.en.md b/docs/manual/plots/scatter.en.md
index b67034899a8..ba2dd7ddc7c 100644
--- a/docs/manual/plots/scatter.en.md
+++ b/docs/manual/plots/scatter.en.md
@@ -72,9 +72,9 @@ scatterPlot.render();
点大小映射对应的数据字段名。
-#### size
+#### size
-**optional** \_number | [number, number] | Function_
+**optional** \_number | [number, number] | Function\_
[**DEMO1**](../../scatter/basic#color-mapping)
@@ -106,7 +106,7 @@ scatterPlot.render();
点形状映射对应的数据字段名。
-#### shape
+#### shape
**optional** \_string | string[] | Function\_
@@ -139,7 +139,7 @@ scatterPlot.render();
}
```
-#### pointStyle
+#### pointStyle
**optional** _object_
@@ -192,6 +192,48 @@ scatterPlot.render();
`markdown:docs/common/component.en.md`
+#### quadrant
+
+[**DEMO**](../../scatter/basic#quadrant)
+
+**optional** _object_
+
+四象限组件。
+
+| 细分配置 | 类型 | 功能描述 |
+| ----------- | -------- | ------------------------------------------ |
+| xBaseline | number | x 方向上的象限分割基准线,默认为 0 |
+| yBaseline | number | y 方向上的象限分割基准线,默认为 0 |
+| lineStyle | object | 配置象限分割线的样式,详细配置参考绘图属性 |
+| regionStyle | object[] | 象限样式,详细配置参考绘图属性 |
+| labels | object[] | 象限文本配置,详细配置参考绘图属性 |
+
+#### regressionLine
+
+[**DEMO**](../../scatter/basic#line)
+
+**optional** _object_
+
+回归线。
+
+| 细分配置 | 类型 | 功能描述 |
+| --------- | ------------------------------------------------------------------- | ---------------------------------------------------------------- |
+| type | string | 回归线类型, exp \| linear \| loess \| log \| poly \| pow \| quad |
+| style | object | 配置回归线样式,详细配置参考绘图属性 |
+| algorithm | Array<[number, number]> \| ((data: any) => Array<[number, number]>) | 自定义算法,优先级高于 type |
+
+```ts
+regressionLine: {
+ algorithm: () => {
+ return [
+ [8, 6],
+ [16, 7],
+ [24, 7],
+ ];
+ },
+}
+```
+
### Event
`markdown:docs/common/events.en.md`
diff --git a/docs/manual/plots/scatter.zh.md b/docs/manual/plots/scatter.zh.md
index e8c9d321436..c45e7e1cf64 100644
--- a/docs/manual/plots/scatter.zh.md
+++ b/docs/manual/plots/scatter.zh.md
@@ -72,9 +72,9 @@ scatterPlot.render();
点大小映射对应的数据字段名。
-#### size
+#### size
-**optional** \_number | [number, number] | Function_
+**optional** \_number | [number, number] | Function\_
[**DEMO1**](../../scatter/basic#color-mapping)
@@ -106,7 +106,7 @@ scatterPlot.render();
点形状映射对应的数据字段名。
-#### shape
+#### shape
**optional** \_string | string[] | Function\_
@@ -139,7 +139,7 @@ scatterPlot.render();
}
```
-#### pointStyle
+#### pointStyle
**optional** _object_
@@ -192,6 +192,48 @@ scatterPlot.render();
`markdown:docs/common/component.zh.md`
+#### quadrant
+
+[**DEMO**](../../scatter/basic#quadrant)
+
+**optional** _object_
+
+四象限组件。
+
+| 细分配置 | 类型 | 功能描述 |
+| ----------- | -------- | ------------------------------------------ |
+| xBaseline | number | x 方向上的象限分割基准线,默认为 0 |
+| yBaseline | number | y 方向上的象限分割基准线,默认为 0 |
+| lineStyle | object | 配置象限分割线的样式,详细配置参考绘图属性 |
+| regionStyle | object[] | 象限样式,详细配置参考绘图属性 |
+| labels | object[] | 象限文本配置,详细配置参考绘图属性 |
+
+#### regressionLine
+
+[**DEMO**](../../scatter/basic#line)
+
+**optional** _object_
+
+回归线。
+
+| 细分配置 | 类型 | 功能描述 |
+| --------- | ------------------------------------------------------------------- | ---------------------------------------------------------------- |
+| type | string | 回归线类型, exp \| linear \| loess \| log \| poly \| pow \| quad |
+| style | object | 配置回归线样式,详细配置参考绘图属性 |
+| algorithm | Array<[number, number]> \| ((data: any) => Array<[number, number]>) | 自定义算法,优先级高于 type |
+
+```ts
+regressionLine: {
+ algorithm: () => {
+ return [
+ [8, 6],
+ [16, 7],
+ [24, 7],
+ ];
+ },
+}
+```
+
### 事件
`markdown:docs/common/events.zh.md`
diff --git a/examples/scatter/basic/demo/custom-shape.ts b/examples/scatter/basic/demo/custom-shape.ts
new file mode 100644
index 00000000000..5119940f6d1
--- /dev/null
+++ b/examples/scatter/basic/demo/custom-shape.ts
@@ -0,0 +1,61 @@
+import { Scatter, G2 } from '@antv/g2plot';
+
+// 注册主体有 point | interval | polygon | line 等,详细参考 G2: https://g2.antv.vision/
+G2.registerShape('point', 'custom-shape', {
+ draw(cfg, group) {
+ const cx = cfg.x;
+ const cy = cfg.y;
+ const radius = cfg.size || 5;
+ const polygon = group.addShape('path', {
+ attrs: {
+ path: [['M', cx - radius, cy - radius], ['L', cx + radius, cy - radius], ['L', cx, cy + radius], ['Z']],
+ ...cfg.defaultStyle,
+ ...cfg.style,
+ },
+ });
+ return polygon;
+ },
+});
+
+fetch('https://gw.alipayobjects.com/os/bmw-prod/3e4db10a-9da1-4b44-80d8-c128f42764a8.json')
+ .then((res) => res.json())
+ .then((data) => {
+ const scatterPlot = new Scatter('container', {
+ appendPadding: 30,
+ data,
+ xField: 'xG conceded',
+ yField: 'Shot conceded',
+ shape: 'custom-shape',
+ pointStyle: {
+ lineWidth: 2,
+ },
+ size: 6,
+ yAxis: {
+ nice: true,
+ line: {
+ style: {
+ stroke: '#aaa',
+ },
+ },
+ },
+ tooltip: {
+ showMarkers: false,
+ },
+ xAxis: {
+ grid: {
+ line: {
+ style: {
+ stroke: '#eee',
+ },
+ },
+ },
+ line: {
+ style: {
+ stroke: '#aaa',
+ },
+ },
+ },
+ label: {},
+ });
+ scatterPlot.render();
+ });
diff --git a/examples/scatter/basic/demo/meta.json b/examples/scatter/basic/demo/meta.json
index 1209a15acef..680c8bf65ca 100644
--- a/examples/scatter/basic/demo/meta.json
+++ b/examples/scatter/basic/demo/meta.json
@@ -43,6 +43,14 @@
"en": "Bubble plot yAxis on the right"
},
"screenshot": "https://gw.alipayobjects.com/mdn/rms_d314dd/afts/img/A*0luHTJODdMUAAAAAAAAAAAAAARQnAQ"
+ },
+ {
+ "filename": "custom-shape.ts",
+ "title": {
+ "zh": "散点图-自定义图形",
+ "en": "Scatter plot custom shape"
+ },
+ "screenshot": "https://gw.alipayobjects.com/mdn/rms_d314dd/afts/img/A*zfwOTZE7KwcAAAAAAAAAAAAAARQnAQ"
}
]
}
diff --git a/src/core/plot.ts b/src/core/plot.ts
index 37e144081fc..99677bc9a98 100644
--- a/src/core/plot.ts
+++ b/src/core/plot.ts
@@ -83,7 +83,7 @@ export abstract class Plot extends EE {
*/
private getChartSize(width: number, height: number): Size {
const chartSize = getContainerSize(this.container);
- return { width: width || chartSize.width, height: height || chartSize.height || 300 };
+ return { width: width || chartSize.width || 400, height: height || chartSize.height || 400 };
}
/**