d3.js绘制饼状图,悬浮出现字以及点击事件
创始人
2024-05-31 09:58:57
0次

代码以及注释如下:

const width = 300; // 定义圆的宽度
const height = 300; // 定义圆的高度
const radius = Math.min(width, height) / 2; // 算出半径

const color = d3.scaleOrdinal()
    .range(["#98abc5", "#8a89a6", "#6b486b", "#a05d56", "#d0743c"]); // 配置颜色

const arc = d3.arc()
    .outerRadius(radius - 10) // 外圆半径
    .innerRadius(0)
; // 内圆半径,如果为零则为实心圆

const pie = d3.pie() // 定义饼图
    .sort(null)
    .value(d => d.population); // 通过以下data数据中的population来分配饼图所占空间

const svg = d3.select("#gb08fe") // 添加一个svg图
    .append("svg")
    .attr("width", width)
    .attr("height", height)
    .append("g")
    .attr("transform", `translate(${width / 2}, ${height / 2})`);

const data = [{ // 创建数据
        age: "<5",
        population: 2704659
    },
    {
        age: "5-13",
        population: 4499890
    },
    {
        age: "14-17",
        population: 2159981
    },
    {
        age: "18-24",
        population: 3853788
    },
    {
        age: "25-44",
        population: 14106543
    },
    {
        age: "45-64",
        population: 8819342
    },
];

const g = svg.selectAll(".arc") // 选择或创建类名为arc的元素
    .data(pie(data)) // 调用饼图并添加数据绑定
    .enter().append("g") // 筛入到元素中并添加g标签
    .attr("class", "arc"); // 设置样式名称为arc
// 这里的g则表示每一个标签g元素
g.append("path") // 添加path来绘制饼图
    .attr("d", arc) // 绘制路径d,路径为src
    .style("fill", d => color(d.data.age)); // 路径d的填充色

g.append("text") // 添加文本
    .attr("transform", d => `translate(${arc.centroid(d)})`)
    .attr("dy", ".35em")
    .text(d => d.data.age);


const tooltip = d3.select("#gb08fe")
    .append('div')
    .attr('class', 'tooltip');

// 注意:这里是g不是svg否则后续监听之后的d的值会获取不到。因为以上g.data()才是将数据绑定到元素中
g.on('mouseenter', (event,d) => { // 这里的d.data才是数组里的每条数据
        tooltip
            .style('opacity', 1)
            .html(`
          ${d.data.age}: ${d.data.population}
        `)
    })
    .on('mousemove', (event, d) => {
        tooltip
            .style('left', `${event.pageX + 20}px`)
               .style('top', `${event.pageY}px`)
            .style('position', 'absolute');
      
    })
    .on('mouseleave', () => {
        tooltip
            .style('opacity', 0);
    });
g.on('click',(event,d)=>{ // 添加点击事件
  alert(d.data.age)
})

 


 

相关内容

热门资讯

糖尿病早期无症状 出现5种表现... 今天是世界糖尿病日,今年的主题是“早发现,早行动”。这一主题强调了及早识别风险并采取行动的重要性。不...
于根伟口误把侯森说成侯震 搞笑... 11月14日,天津津门虎队主教练于根伟在接受采访时发生了一次口误。在谈到中超金手套时,他不小心将北京...
猪肉价格创10年新低 源头近乎... 2026年11月11日,一条消息刷屏:11月9日,全国外三元生猪均价跌至8.63元一公斤,创近10年...
大理雪后初晴美如画 冬日浪漫画... 初雪降临大理苍山,洱海风光焕然一新。碧绿的湖水与连绵的青山在皑皑白雪的映衬下,展现出独特的冬日浪漫。...
导演:作品没做好不能赖短剧和A... 导演刘家成在接受中新网专访时谈到了对短剧分流长剧市场的看法。他认为,不能把作品没做好归咎于短剧和AI...
U19国足战平塔吉克斯坦 彭子... 央视网消息:熊猫杯第二轮,U19国足对阵塔吉克斯坦U19。彭子鸣头球破门,巴赫塔利扳平比分。最终,U...
全美停飞 机场周边酒店爆满 航... 当地时间11月13日晚,美国联邦航空管理局宣布解除全美范围内的地面停飞指令。然而,航班恢复正常运行仍...
华为轮值董事长在《时代》撰文 ... 华为轮值董事长徐直军在《时代》美国版上发表了一篇题为《走进华为的创新之旅——见证、亲历、引领》的文章...
马斯克回应Cybercab自动... 埃隆·马斯克在11月14日于X平台发布推文,回应科技博主MKBHD关于Cybercab每月299美元...
蔡天凤前夫哥哥承认曾写信编案情... 蔡天凤案再次曝光新细节,前夫哥哥指认弟弟为真凶,方媛的言论终于得到验证。最讽刺的是,蔡天凤不仅资助前...
餐饮排队王为什么都爱开在高端商... 广州白鹅潭万象城在国庆期间吸引了大量顾客,一家餐饮店单日最高排号超过5465桌。郑州和呼和浩特等地的...
走散的友情为何成了大众情绪出口... 在综艺节目《后会友期》中,厉娜与许飞在断联十五年后重逢。两人见面时哭得说不出话,这一幕很快冲上了热搜...
金世佳回应拒上综艺 只留角色站... 在内娱圈,许多艺人为了增加曝光度,通过直播、综艺节目、偶遇图、朋友圈截图等方式,几乎将自己的私生活完...
女子因拒绝给HR带咖啡被取消面... 11月13日,江苏昆山的一位求职者在BOSS直聘上与一家公司对接面试。到达后,HR通过消息要求她先点...
全球资金抛售黄金买美债概率大吗... 用1000万美元购买30年期美国国债,每年可以获得53.75万美元的利息。没有手续费,也不受市场波动...
广东男篮新帅谈执教理念:崇尚防... 今天,广东男篮新任主帅贝罗卡尔接受了采访。他表示自己崇尚防守,认为他的球队一直是联赛里防守最好的队伍...
五大AI巨头被诉叫停开发新模型... 美国五家AI巨头因一边警告人工智能可能失控,一边加速研发更先进的模型而遭到法律挑战。11月12日,由...
“绘见”深圳:长卷上的魅力地标... 深圳,这座从边陲小镇成长为现代化国际大都市的城市,见证了中国改革开放的辉煌历程。蛇口轰鸣的“开山炮”...
波切蒂诺能救曼联吗 重建球员信... 里奥-费迪南德认为,如果卡里克从曼联下课,毛里西奥-波切蒂诺将是候选名单中非常突出的人选。他表示,波...
微信能看短剧了 小范围测试中 11月12日,有网友发现微信发现页的“看一看”功能中新增了“短剧”入口。目前该功能正处于小范围灰度测...