将文本放置在矩形的中心

2024-05-14

在下面的代码中,文本没有放置在矩形的中心,我使用的是

.attr("dx", x.bandwidth()/2)
 .attr("dy", y.bandwidth()/2)

有没有办法将文本中心放置在矩形中,而不是反复试验?

目前它看起来像这样(朝底部和朝右):

以下是我的代码:

<!DOCTYPE html>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.8/d3.min.js" type="text/JavaScript"></script>
<!--script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.9/d3.js" type="text/JavaScript"></script-->
<style>
    rect {
        stroke: #9A8B7A;
        stroke-width: 1px;
        fill: #CF7D1C;
        opacity:
    }
</style>
<body>
<svg width="500" height="500"></svg>

</body>
<script>
    var dataset = [[1,3,3,5,6,7],[3,5,8,3,2,6],[9,0,6,3,6,3],[3,4,4,5,6,8],[3,4,5,2,1,8]];



    var local = d3.local();

    var svg = d3.select("svg"),
            margin = {top: 20, right: 20, bottom: 30, left: 40},
            width = +svg.attr("width") - margin.left - margin.right,
            height = +svg.attr("height") - margin.top - margin.bottom;

    var x = d3.scaleBand().rangeRound([0, width]);
    var y = d3.scaleBand().rangeRound([0, height]);

    y.domain(dataset.map(function(d,i) { return i; }));

    var maxChildLength= d3.max(dataset, function(d) { return d.length; });
    var xArr=Array.apply(null, {length: maxChildLength}).map(Function.call, Number);
    x.domain(xArr);

    var maxNum = d3.max(dataset, function(array) {
        return d3.max(array);
    });

    var color=d3.scaleLinear().domain([0,maxNum]).range([0,1]);

    svg.append("g")
            .selectAll("g")
            .data(dataset)//use top-level data to join g
            .enter()
            .append("g")
            .selectAll("rect")
            .data(function(d, i) {//for each <g>, use the second-level data (return d) to join rect
                local.set(this, i);//this is the <g> parent
                return d;
            })
            .enter()
            .append("rect")

            .attr("x", function(d, i, j) {
               // return (i * 20) + 40;
                return x(i);
            })
            .attr("y", function(d) {
            //    return (local.get(this) * 20) + 40;
                return y(local.get(this));
            })
            //.attr("width",20)
            .attr("width", x.bandwidth())
            .attr("height", y.bandwidth())
            .attr("fill-opacity",function(d){console.log(color(+d));return color(+d);})



    svg.append("g")
            .selectAll("g")
            .data(dataset)
            .enter()
            .append("g")
            .selectAll("text")
            .data(function(d, i) {

                local.set(this, i)
                return d;
            })
            .enter()
            .append("text")
            .text(function(d, i, j) {
                return d;
            })
            .attr("x", function(d, i, j) {
                // return (i * 20) + 40;
                return x(i);
            })
            .attr("y", function(d) {
                return y(local.get(this));
                //return (local.get(this) * 20) + 40;
            })
            .attr("dx", x.bandwidth()/2)
            .attr("dy", y.bandwidth()/2)
            .attr("dominant-baseline", "text-before-edge")
            .attr("font-family", "sans-serif")
            .attr("font-size", "20px")







</script>

Use text-align: middle and dominant-baseline: central:

.attr("text-anchor", "middle")
.attr("dominant-baseline", "central") 

这是经过这些更改的代码:

<!DOCTYPE html>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.8/d3.min.js" type="text/JavaScript"></script>
<!--script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.9/d3.js" type="text/JavaScript"></script-->
<style>
  rect {
    stroke: #9A8B7A;
    stroke-width: 1px;
    fill: #CF7D1C;
    opacity:
  }

</style>

<body>
  <svg width="500" height="500"></svg>

</body>
<script>
  var dataset = [
    [1, 3, 3, 5, 6, 7],
    [3, 5, 8, 3, 2, 6],
    [9, 0, 6, 3, 6, 3],
    [3, 4, 4, 5, 6, 8],
    [3, 4, 5, 2, 1, 8]
  ];



  var local = d3.local();

  var svg = d3.select("svg"),
    margin = {
      top: 20,
      right: 20,
      bottom: 30,
      left: 40
    },
    width = +svg.attr("width") - margin.left - margin.right,
    height = +svg.attr("height") - margin.top - margin.bottom;

  var x = d3.scaleBand().rangeRound([0, width]);
  var y = d3.scaleBand().rangeRound([0, height]);

  y.domain(dataset.map(function(d, i) {
    return i;
  }));

  var maxChildLength = d3.max(dataset, function(d) {
    return d.length;
  });
  var xArr = Array.apply(null, {
    length: maxChildLength
  }).map(Function.call, Number);
  x.domain(xArr);

  var maxNum = d3.max(dataset, function(array) {
    return d3.max(array);
  });

  var color = d3.scaleLinear().domain([0, maxNum]).range([0, 1]);

  svg.append("g")
    .selectAll("g")
    .data(dataset) //use top-level data to join g
    .enter()
    .append("g")
    .selectAll("rect")
    .data(function(d, i) { //for each <g>, use the second-level data (return d) to join rect
      local.set(this, i); //this is the <g> parent
      return d;
    })
    .enter()
    .append("rect")

  .attr("x", function(d, i, j) {
      // return (i * 20) + 40;
      return x(i);
    })
    .attr("y", function(d) {
      //    return (local.get(this) * 20) + 40;
      return y(local.get(this));
    })
    //.attr("width",20)
    .attr("width", x.bandwidth())
    .attr("height", y.bandwidth())
    .attr("fill-opacity", function(d) {
      return color(+d);
    })



  svg.append("g")
    .selectAll("g")
    .data(dataset)
    .enter()
    .append("g")
    .selectAll("text")
    .data(function(d, i) {

      local.set(this, i)
      return d;
    })
    .enter()
    .append("text")
    .text(function(d, i, j) {
      return d;
    })
    .attr("x", function(d, i, j) {
      // return (i * 20) + 40;
      return x(i);
    })
    .attr("y", function(d) {
      return y(local.get(this));
      //return (local.get(this) * 20) + 40;
    })
    .attr("dx", x.bandwidth() / 2)
    .attr("dy", y.bandwidth() / 2)
    .attr("text-anchor", "middle")
    .attr("dominant-baseline", "central")
    .attr("font-family", "sans-serif")
    .attr("font-size", "20px")

</script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将文本放置在矩形的中心 的相关文章

  • d3.select 不适用于特殊字符

    我正在使用 d3 js 处理简单的图表 假设下面的 div 是我计划放置 d3 的 svg 容器的地方 div 但是当我使用 d3 select my div chart 我无法选择特定的 div 但是通过使用 java 脚本选择器 它可以
  • 为什么这个标题图形不随世界更新

    对于以下内容 我很高兴组合框默认为世界 但当收音机被点击时 我也希望标题移回 世界 我该怎么做 我有这个笨蛋 http plnkr co edit 9FXJXVqLZLPFdDrmVJez p preview http plnkr co e
  • 寻找一种重构 D3.js 风格的方法链接模式的方法

    在学习 D3 js 时 我遇到了博客文章 http bost ocks org mike chart 解释其可重用代码单元背后的主要设计模式 我复制了下面的相关代码 下面呈现的模式的方式正是在 D3 代码库和插件中使用的方式 example
  • D3:使用 d3-tile 缩放到边界框

    我已成功将 D3 矢量 地图分层到从 Mapbox 提取图块的 d3 tile 光栅 地图之上 手动缩放效果非常好 矢量和光栅都是同步的 我现在正在尝试实施迈克 博斯托克 缩放到边界框 https bl ocks org mbostock
  • 如何在 d3.scale.ordinal() 中指定域?

    var W 100 var H 200 var data v 4 v 8 v 15 v 16 v 23 v 42 var x d3 scale linear domain 0 max x range 0 W var y d3 scale o
  • d3 同步 2 个独立的缩放行为

    我有以下 d3 d3fc 图表 https codepen io parliament718 pen BaNQPXx https codepen io parliament718 pen BaNQPXx 该图表的主要区域有缩放行为 y 轴有
  • 使用 D3.js 解析时间序列数据

    是时候寻求帮助了 我已经学习 D3 js 几个星期了 我才开始觉得我理解了其中的 10 哈哈哈 我正在尝试生成一个非常简单的线图 只要数据非常简单 我就可以做到这一点 但我的原始数据源具有 UTC 时间戳和实数 小数 这会导致任何超出简单范
  • 将文本放置在矩形的中心

    在下面的代码中 文本没有放置在矩形的中心 我使用的是 attr dx x bandwidth 2 attr dy y bandwidth 2 有没有办法将文本中心放置在矩形中 而不是反复试验 目前它看起来像这样 朝底部和朝右 以下是我的代码
  • D3 v4 在同一元素上进行画笔和缩放(鼠标事件不冲突)

    我的目标是构建一个使用两者的 D3 v4 图表d3 zoom https github com d3 d3 zoom and d3 brush https github com d3 d3 brush一起 如下 当鼠标位于 x 轴上时 用户
  • 使圆圈与 d3.js 上的多线匹配相同的颜色过滤?

    我有一个多线图 当按每种水果过滤时会更新 每条线条颜色对应不同的销售年份 在 的帮助下Shashank https stackoverflow com users 5569282 shashank 每个数据点线上的圆圈已添加到组中 而不是直
  • 如何根据形状字段值将两个不同的形状添加到 D3 力向图?

    我是D3的新手 我正在使用力定向图 我想在节点的位置添加两种不同类型的形状 我的 json 如下 nodes name 00 00 00 00 00 00 00 01 group 0 shape 1 name 00 00 00 00 00
  • d3.event.translate 在触摸设备的缩放上包含 NaN

    我使用 d3 为我的 svg 编写了一个自定义缩放函数 如下所示 Zoom behavior function myzoom xpos d3 event translate 0 ypos d3 event translate 1 vis a
  • d3.js:修改树布局中的链接

    抱歉我的英语不好 我在这里使用这个例子 http bl ocks org mbostock 4339083 http bl ocks org mbostock 4339083构建树形图 但我用矩形更改了根的子级中的圆圈 现在该图有点混乱 因
  • D3 围绕一组圆圈绘制船体

    我想用 d3 围绕分组力定向图构建绘制一个船体 我已经用圆圈构建了图表 但我现在想将圆的交点与路径 船体 连接起来 如果不连接交叉点 画一个围绕这组圆的船体就足够了 我尝试过具有凸包的力导向布局 http bl ocks org 29205
  • 增加 D3 图中边缘的可点击区域

    我有一个由 d3 制作的图 dagre d3 位于其顶部用于绘制有向图 这给出了我对渲染图表的期望 要编辑构建图表的数据 每个元素都是可单击的 这对于使用标签渲染边缘的情况来说很好 但它们并不总是有标签 导致未标记的边缘很难单击进行编辑 分
  • d3 仅限整数刻度线

    我有一个 d3 条形图 其值范围为 0 3 我希望 y 轴仅显示整数值 我可以这样做 var yAxis d3 svg axis scale y orient right tickFormat d3 format d 但是 非整数标记处仍然
  • 平移/缩放顺序尺度?

    我正在使用 d3 渲染简化的甘特图 并使用 d3 behavior zoom 进行平移和缩放 x 刻度是一个时间刻度 稍微修改为列中的中心日历日等 并且工作得很好 但是我在决定如何缩放 平移 y 刻度时遇到问题 其域是通常会出现的任务列表图
  • 如何运行 Mike Bostock 的 D3 示例?

    我一直在尝试经营迈克博斯托克透视地球仪 http bl ocks org mbostock 6747043例如 但是如果您尝试在本地重现它 则对其 json 文件的引用是不正确的 问题来自于这行代码 d3 json mbostock raw
  • 使 D3 响应式:viewBox 与 resize()?

    我必须构建在平板电脑 桌面显示器以及某些情况下非常大的 4k 高分辨率影院尺寸显示器上都能正常运行的 d3 可视化效果 因此 我试图找出使用 SVG 的 viewBox 属性和 preserveaspectratio 与调用调整大小函数以在
  • D3js 从数组而不是文件中获取数据

    我发现了这个优秀的 d3js 图表here http bl ocks org Caged 6476579 但就我而言 我希望此图表从数组而不是 tsv 文件中获取值 我想让它从表 中获取值 我怎样才能做到这一点 因为它使用一个函数来实现这一

随机推荐