Facet 分面

    总结起来,分面其实提供了两个功能:

    • 按照指定的维度划分数据集;
    • 对图表进行排版。
      对于探索型数据分析来说,分面是一个强大有力的工具,能帮你迅速地分析出数据各个子集模式的异同。

    说明:

    • 第一个参数 type 用于指定分面的类型;
    • fileds 属性用于指定数据集划分依据的字段;
    • eachView 回调函数中创建各个视图的图表类型;
      也可以设置每个分面之间的间距 padding
    1. chart.facet('list', {
    2. fileds: [ 'cut', 'carat' ],
    3. padding: 20 // 各个分面之间的间距,也可以是数组 [top, right, bottom, left]
    4. });

    更多配置信息,请查阅 。

    分面的类型

    G2 支持的分面类型如下表所示:

    rect 矩形分面是 G2 的默认分面类型。支持按照一个或者两个维度的数据划分,按照先列后行的顺序。

    1. chart.facet('rect', {
    2. fields: [ 'cut', 'clarity' ],
    3. eachView(view) {
    4. view.point().position('carat*price').color('cut');
    5. }
    6. });

    说明:

    • 可以将 fields 字段中表示行和列的字段名时,可以设置行或者列为 null,会变成单行或者单列的分面

    list 水平列表分面

    该类型分面可以通过设置 属性来指定每行可显示分面的个数,超出时会自动换行。

    1. $.getJSON('/assets/data/diamond.json', function(data) {
    2. const chart = new G2.Chart({
    3. container: 'c2',
    4. width: 800,
    5. height: 400,
    6. padding: [ 30, 90, 80, 80 ]
    7. });
    8. chart.source(data, {
    9. carat: {
    10. sync: true
    11. },
    12. price: {
    13. sync: true
    14. },
    15. cut: {
    16. sync: true
    17. }
    18. });
    19. chart.facet('list', {
    20. fields: [ 'cut' ],
    21. cols: 3, // 超过3个换行
    22. padding: 30,
    23. eachView(view) {
    24. view.point().position('carat*price').color('cut');
    25. }
    26. });
    27. chart.render();
    28. });
    1. const DataView = DataSet.DataView;
    2. $.getJSON('/assets/data/diamond.json',function (data) {
    3. const chart = new G2.Chart({
    4. container: 'c3',
    5. width: 600,
    6. height: 600,
    7. animate: false,
    8. padding: [ 20, 20, 70, 20 ]
    9. });
    10. chart.source(data, {
    11. mean: {
    12. sync: true
    13. },
    14. cut: {
    15. sync: true
    16. }
    17. chart.coord('polar');
    18. chart.axis(false);
    19. chart.facet('circle', {
    20. fields: [ 'clarity' ],
    21. padding: 0,
    22. eachView(view, facet) {
    23. const data = facet.data;
    24. const dv = new DataView();
    25. dv.source(data).transform({
    26. type: 'aggregate',
    27. fields: [ 'price' ],
    28. operations: [ 'mean' ],
    29. as: [ 'mean' ],
    30. groupBy: [ 'cut' ]
    31. });
    32. view.source(dv);
    33. view.interval().position('cut*mean').color('cut');
    34. }
    35. }); // 分面设置
    36. chart.render();
    37. });

    tree 树形分面

    树形分面一般用于展示存在层次结构的数据,展示的是整体和部分之间的关系

    提供了 line 和 两个属性,用于配置连接各个分面的线的样式,其中:

    • line,用于配置线的显示属性。
    • lineSmooth,各个树节点的连接线是否是平滑的曲线,默认为 false。

    下图展示了树形多层级的分面。

    通过配置 transpose 属性为 true,可以将镜像分面翻转。

    1. $.getJSON('/assets/data/population.json', function(data) {
    2. const tmp = [];
    3. const dates = [];
    4. const selEl = $('#selYear');
    5. data.male.values.forEach(function(obj) {
    6. if (dates.indexOf(obj.date) === -1) {
    7. dates.push(obj.date);
    8. }
    9. obj.age_groups.forEach(function(subObject) {
    10. subObject.gender = 'male';
    11. subObject.date = obj.date;
    12. tmp.push(subObject);
    13. });
    14. });
    15. data.female.values.forEach(function(obj) {
    16. obj.age_groups.forEach(function(subObject) {
    17. subObject.gender = 'female';
    18. subObject.date = obj.date;
    19. tmp.push(subObject);
    20. });
    21. });
    22. dates.forEach(date => {
    23. $('<option value="' + date + '">' + new Date(date * 1000).getFullYear() + '</option>').appendTo(selEl);
    24. });
    25. const ds = new DataSet({
    26. state: {
    27. date: dates[0]
    28. }
    29. });
    30.  
    31. const dv = ds.createView()
    32. .source(tmp)
    33. .transform({
    34. type: 'filter',
    35. callback(row) { // 判断某一行是否保留,默认返回true
    36. return new Date(row.date * 1000).getFullYear() === new Date(ds.state.date * 1000).getFullYear();
    37. }
    38. });
    39.  
    40. const chart = new G2.Chart({
    41. container: 'c5',
    42. forceFit: true,
    43. height: 600
    44. });
    45.  
    46. age: {
    47. sync: true,
    48. tickCount: 11
    49. },
    50. total_percentage: {
    51. sync: true,
    52. formatter(v) {
    53. return v + '%';
    54. }
    55. },
    56. gender: {
    57. sync: true
    58. }
    59. });
    60. chart.facet('mirror', {
    61. fields: [ 'gender' ],
    62. transpose: true,
    63. eachView(view) {
    64. view.interval().position('age*total_percentage')
    65. .color('gender', [ 'rgb(113,192,235)', 'rgb(246,170,203)' ]);
    66. }
    67. });
    68. chart.render();
    69. selEl.on('change', function() {
    70. const val = selEl.val();
    71. const date = parseInt(val);
    72. ds.setState('date', date);
    73. });
    74. });

    matrix 矩阵分面

    矩阵分面主要对比数据中多个字段之间的关系,例如常见的散点矩阵图

    1. const DataView = DataSet.DataView;
    2. $.getJSON('/assets/data/iris.json', function(data) {
    3. const chart = new G2.Chart({
    4. container: 'c6',
    5. forceFit: true,
    6. height: 600
    7. });
    8.  
    9. chart.source(data, {
    10. Species: {
    11. sync: true
    12. }
    13. });
    14. chart.facet('matrix', {
    15. fields: [ 'SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth' ],
    16. eachView(view, facet) {
    17. if (facet.rowIndex === facet.colIndex) {
    18. const dv = new DataView();
    19. dv.source(facet.data)
    20. .transform({
    21. type: 'bin.histogram',
    22. field: facet.colField, // 对应数轴上的一个点
    23. bins: 30, // 分箱个数
    24. as: [ facet.colField, 'count' ],
    25. groupBy: [ 'Species' ]
    26. });
    27. view.source(dv.rows);
    28. view.intervalStack()
    29. .position(facet.colField + '*count')
    30. .color('Species', [ '#880000', '#008800', '#000088' ]);
    31. } else {
    32. view.point()
    33. .position([ facet.colField, facet.rowField ])
    34. .color('Species', [ '#880000', '#008800', '#000088' ]);
    35. }
    36. }
    37. });
    38. chart.render();
    39. });

    Guide 辅助元素