前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >d3成神之路(二):第二个柱状图

d3成神之路(二):第二个柱状图

作者头像
拿我格子衫来
发布2022-01-24 15:00:19
2860
发布2022-01-24 15:00:19
举报
文章被收录于专栏:TopFETopFE

核心代码是理解 data(data) join("rect") .attr("height", d => yScale(0) - yScale(d.value))

代码语言:javascript
复制
const yScale = d3.scaleLinear()
                 .domain([0, d3.max(data, x => x.value)])
                 .range([innerHeight, 0])
代码语言:javascript
复制
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>先做一个柱状图</title>
    <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1" />
</head>

<body>
    <svg width="800" height="800" id="main" class="svg"></svg>

    <script src="https://cdn.jsdelivr.net/npm/d3@7.0.1/dist/d3.min.js"></script>
    <script>
        const data = [
            { name: 'a', value: 1 },
            { name: 'b', value: 2 },
            { name: 'c', value: 3 },
            { name: 'd', value: 4 },
            { name: 'e', value: 5 },
        ]

        const svg = d3.select('#main');
        const width = svg.attr('width');
        const height = svg.attr('height');
        const margin = { top: 60, right: 30, bottom: 60, left: 50 }
        const innerWidth = width - margin.right - margin.left
        const innerHeight = height - margin.top - margin.bottom

        const xScale = d3.scaleBand()
            .domain(data.map(x => x.name))
            .range([0, innerWidth])
            .padding(0.5)

        const yScale = d3.scaleLinear()
            .domain([0, d3.max(data, x => x.value)])
            .range([innerHeight, 0])


        const g = svg.append('g').attr('id', 'maingroup').attr('transform', `translate(${margin.left},${margin.top})`)
        const yAxis = d3.axisLeft(yScale)
        g.append('g').call(yAxis)

        const xAxis = d3.axisBottom(xScale)
        g.append('g').call(xAxis).attr('transform', `translate(0, ${innerHeight})`)


        const bar = g.append("g")
            .attr("fill", "steelblue")
            .selectAll("rect")
            .data(data)
            .join("rect")
            .style("mix-blend-mode", "multiply")
            .attr("x", d => xScale(d.name))
            .attr("y", d => yScale(d.value))
            .attr("height", d => yScale(0) - yScale(d.value))
            .attr("width", xScale.bandwidth());



    </script>
</body>

</html>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档