Family Tree

描述:当前是关于Echarts图表中的 关系图 示例。
 
            var male_image = 'M321.778,95.024l30-0.049l-0.154-94.821L256.802,0l-0.049,30l43.741,0.071l-58.583,58.583  c-26.385-21.595-59.13-33.339-93.68-33.339c-39.594,0-76.817,15.419-104.814,43.417C15.419,126.729,0,163.953,0,203.547  s15.419,76.818,43.416,104.815s65.221,43.416,104.814,43.416s76.818-15.419,104.815-43.416  c54.215-54.215,57.572-140.324,10.073-198.49l58.588-58.588L321.778,95.024z M231.833,287.149  c-22.331,22.331-52.021,34.629-83.603,34.629S86.96,309.48,64.629,287.149C42.298,264.818,30,235.128,30,203.547  s12.298-61.271,34.629-83.602s52.021-34.629,83.602-34.629c31.581,0,61.271,12.298,83.603,34.629  C277.931,166.044,277.931,241.051,231.833,287.149z';
var female_image = 'M355.578,148.231C355.578,66.496,289.082,0,207.347,0S59.115,66.496,59.115,148.231  c0,76.672,58.514,139.933,133.231,147.476v47.601h-41.568v30h41.568v41.385h30v-41.385h41.568v-30h-41.568v-47.601  C297.064,288.164,355.578,224.903,355.578,148.231z M89.115,148.231C89.115,83.038,142.153,30,207.347,30  s118.231,53.038,118.231,118.231S272.54,266.462,207.347,266.462S89.115,213.424,89.115,148.231z';
var nodes = [];
var links = [];
var legend_data = [];

// root node self
var mouse_gender = "M";
var image_path = "";
var image_mate_path = "";
if (mouse_gender == "F") {
    image_path = 'path://' + female_image + '';
    image_mate_path = 'path://' + male_image + '';
} else {
    image_path = 'path://' + male_image + '';
    image_mate_path = 'path://' + female_image + '';
}
var root_x = 15;
var root_y = 30;
nodes.push({
    x: root_x,
    y: root_y,
    symbol: image_path,
    label: {
        normal: {
            position: 'bottom',
            color: 'red',
            fontweight: 'bold'
        }
    },
    itemStyle: {
        normal: {
            color: 'blue', //圆点的颜色
            label: {
                position: 'bottom',
                textStyle: {
                    color: 'blue'
                }
            }
        }
    },
    name: "self",
    value: "self"
});
legend_data.push("self");

nodes.push({
    x: root_x - 10,
    y: root_y - 10,
    symbol: 'path://' + male_image + '',
    label: {
        normal: {
            position: 'bottom',
            color: 'black',
        }
    },
    itemStyle: {
        normal: {
            color: 'blue'
        }
    },
    name: "father",
    value: "father"
});

nodes.push({
    x: root_x + 10,
    y: root_y - 10,
    symbol: 'path://' + female_image + '',
    label: {
        normal: {
            position: 'bottom',
            color: 'black',
        }
    },
    itemStyle: {
        normal: {
            color: 'red'
        }
    },
    name: "mother",
    value: "mother"
});

//generate the nodes between father and mother
nodes.push({
    x: root_x,
    y: root_y - 10,
    itemStyle: {
        normal: {
            opacity: 0
        }
    },
    name: "parent_node"
});
//generate the node that between parent_node and self
nodes.push({
    x: root_x,
    y: root_y - 5,
    itemStyle: {
        normal: {
            opacity: 0
        }
    },
    name: "parent_brage"
});
//generate the mate node
nodes.push({
    x: root_x + 15,
    y: root_y,
    symbol: image_mate_path,
    label: {
        normal: {
            position: 'bottom',
            color: 'red',
            fontweight: 'bold'
        }
    },
    name: "wife",
    value: "wife",
    type: "wife"
});
legend_data.push("wife");
//generate the node between self and mate node
nodes.push({
    x: root_x + 7.5,
    y: root_y,
    itemStyle: {
        normal: {
            opacity: 0
        }
    },
    name: "mate_node"
});

var litter_temp_left = -10;
var litter_with_mate_right = 25;
//var litter_temp_right=10;
for (var i = 0; i < 4; i++) {
    // && has_mate
    if (i % 2 === 0) {
        nodes.push({
            x: root_x + litter_temp_left,
            y: root_y,
            symbol: "M" == "M" ? 'path://' + male_image + '' : 'path://' + female_image + '',
            label: {
                normal: {
                    position: 'bottom',
                    color: 'black',
                }
            },
            itemStyle: {
                normal: {
                    color: 'blue'
                }
            },
            name: "brother" + i.toString(),
            value: "brother" + i.toString()
        });
        nodes.push({
            x: root_x + litter_temp_left,
            y: root_y - 5,
            //symbol: data.mouse_litter_info[i].gender == "M" ? 'image://'+male_image+'' : 'image://'+female_image+'',
            itemStyle: {
                normal: {
                    opacity: 0
                }
            },
            name: "litter" + i.toString()
        });
        links.push({
            source: "litter" + i.toString(),
            target: 'parent_brage'
        });
        links.push({
            source: "litter" + i.toString(),
            target: "brother" + i.toString()
        });
        litter_temp_left -= 10;
    }
    if (i % 2 !== 0) {
        nodes.push({
            x: root_x + litter_with_mate_right,
            y: root_y,
            symbol: "F" == "M" ? 'path://' + male_image + '' : 'path://' + female_image + '',
            label: {
                normal: {
                    position: 'bottom',
                    color: 'black',
                }
            },
            itemStyle: {
                normal: {
                    color: 'red'
                }
            },
            name: "sister" + i.toString(),
            value: "sister" + i.toString()
        });
        nodes.push({
            x: root_x + litter_with_mate_right,
            y: root_y - 5,
            itemStyle: {
                normal: {
                    opacity: 0
                }
            },
            name: "litter" + i.toString()
        });
        links.push({
            source: "litter" + i.toString(),
            target: 'parent_brage'
        });
        links.push({
            source: "litter" + i.toString(),
            target: "sister" + i.toString()
        });

        litter_with_mate_right += 10;
    }
}

var temp_left = -5;
var temp_right = 15;
for (var i = 0; i < 5; i++) {
    if (i === 0) {
        nodes.push({
            x: root_x + 7.5,
            y: root_y + 10,
            symbol: "M" == "M" ? 'path://' + male_image + '' : 'path://' + female_image + '',
            label: {
                normal: {
                    position: 'bottom',
                    color: 'black',
                }
            },
            itemStyle: {
                normal: {
                    color: 'blue'
                }
            },
            name: "children" + i.toString(),
            value: "children" + i.toString()
        });
    } else {
        nodes.push({
            x: i % 2 === 0 ? root_x + temp_right : root_x + temp_left,
            y: root_y + 10,
            symbol: "F" == "M" ? 'path://' + male_image + '' : 'path://' + female_image + '',
            label: {
                normal: {
                    position: 'bottom',
                    color: 'black',
                }
            },
            itemStyle: {
                normal: {
                    color: 'red'
                }
            },
            name: "children" + i.toString(),
            value: "children" + i.toString()
        });
        temp_left -= 5;
        temp_right += 5;
    }
}

//generate the linkers
links.push({
    source: "self",
    target: 'parent_node'
});
links.push({
    source: "father",
    target: 'parent_node'
});
links.push({
    source: "mother",
    target: 'parent_node'
});

links.push({
    source: "self",
    target: "wife"
});

for (var i = 0; i < 5; i++) {
    if (i === 0) {
        links.push({
            source: "mate_node",
            target: "children0"
        });
    } else {
        links.push({
            source: "children0",
            target: "children" + i.toString()
        });
    }
}

option = {
    title: {
        text: 'Family Tree'
    },
    tooltip: {
        trigger: 'item',
        formatter: "{b}"
    },
    legend: {
        orient: 'vertical',
        data: legend_data
    },
    series: [{
        type: 'graph',
        layout: 'none',
        symbolSize: 24,
        label: {
            normal: {
                show: true
            }
        },
        data: nodes,
        links: links,
        lineStyle: {
            normal: {
                opacity: 0.9,
                width: 1
            }
        }
    }]
};