当前位置: 首页 > 面试题库 >

使d3.js可视化布局具有响应性的最佳方法是什么?

郗阳德
2023-03-14
问题内容

假设我有一个直方图脚本,可构建960 500 svg图形。如何使它响应,以便调整图形的宽度和高度是动态的?

<script>

var n = 10000, // number of trials
    m = 10,    // number of random variables
    data = [];

// Generate an Irwin-Hall distribution.
for (var i = 0; i < n; i++) {
  for (var s = 0, j = 0; j < m; j++) {
    s += Math.random();
  }
  data.push(s);
}

var histogram = d3.layout.histogram()
    (data);

var width = 960,
    height = 500;

var x = d3.scale.ordinal()
    .domain(histogram.map(function(d) { return d.x; }))
    .rangeRoundBands([0, width]);

var y = d3.scale.linear()
    .domain([0, d3.max(histogram.map(function(d) { return d.y; }))])
    .range([0, height]);

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height);

svg.selectAll("rect")
    .data(histogram)
  .enter().append("rect")
    .attr("width", x.rangeBand())
    .attr("x", function(d) { return x(d.x); })
    .attr("y", function(d) { return height - y(d.y); })
    .attr("height", function(d) { return y(d.y); });

svg.append("line")
    .attr("x1", 0)
    .attr("x2", width)
    .attr("y1", height)
    .attr("y2", height);

</script>

问题答案:

还有另一种方法,不需要重新绘制图形,它涉及修改元素上的viewBox和preserveAspectRatio属性<svg>

<svg id="chart" width="960" height="500"
  viewBox="0 0 960 500"
  preserveAspectRatio="xMidYMid meet">
</svg>

15年11月24日更新
:大多数现代浏览器都可以从推断出SVG元素的长宽比viewBox,因此您可能不需要保持图表的大小为最新。如果需要支持较旧的浏览器,可以在窗口调整大小时调整元素的大小,如下所示:

var aspect = width / height,
    chart = d3.select('#chart');
d3.select(window)
  .on("resize", function() {
    var targetWidth = chart.node().getBoundingClientRect().width;
    chart.attr("width", targetWidth);
    chart.attr("height", targetWidth / aspect);
  });

svg的内容将自动缩放。您可以在此处看到一个有效的示例(进行了一些修改):只需调整窗口或右下窗格的大小即可查看其反应。



 类似资料:
  • 问题内容: 我学到了几个区块。我已经借助jquery做出了响应式d3直方图。 现在,我想在使用ajax更新d3图表方面走得更远。 我刚进入jQuery。 并了解ajax的工作原理。 搜索了很长时间,但在官方d3网站或其他任何地方都找不到任何有效的示例。 任何帮助对我来说都是有益的,让我掌握了通过Ajax更新d3图表的基本功能。 提前致谢!! 问题答案: 您只需在ajax成功中调用d3函数:

  • 我想创建一个网格布局与响应方块。 我觉得我应该可以这样做与CSS网格布局,但有麻烦设置高度每个正方形等于宽度。 在每一个方块之间设置一条阴沟也有困难。 我用Flexbox会更好吗? 目前我的HTML看起来像这样,但将是动态的,所以更多的方块可能会被添加。当然,它需要具有响应性,因此理想情况下使用媒体查询将其折叠为一列。 使用css网格,这是我所得到的 我能够用flexbox做得更远一些,并且能够使

  • 问题内容: 我注意到我的代码具有响应性,事实上,如果我将其缩放到手机或平板电脑的大小,则所有文本,链接和社交图标都会相应缩放。 但是,唯一没有的是我在体内的形象。包裹在段落标签中…话虽如此,是否有一种简单的方法也可以使图像具有响应性? 这是我以前在体内显示图像的代码: 问题答案: 你可以尝试做 如果采用流畅的布局,则可以缩放图像。 为了响应(意味着布局对窗口的大小做出反应),您可以向图像添加一个类

  • 问题内容: 我想创建一个带有响应正方形的网格布局。 我觉得我应该可以使用CSS Grid布局来做到这一点,但是在将每个正方形的高度设置为等于宽度时遇到麻烦。 在每个正方形之间设置水槽时也遇到麻烦。 使用flexbox会更好吗? 目前,我的HTML看起来像这样,但是它将是动态的,因此可以添加更多的正方形。当然,它需要响应,因此理想情况下将使用媒体查询将其折叠到一列。 使用CSS网格,据我所知 我可以

  • 问题内容: 我有一个使用XML响应请求的服务器,我想在javascript中解析它。我真的很喜欢ActionScript XML解析器,它对我来说很容易使用。我在徘徊是否有一种非常简单/直接的方法来解析我从服务器获取的XML? 理想的用法应该是: fetchXML新的XMLParser。parser.parse访问文档。 顺便说一句,我计划使用jQuery。 问题答案: 一个普通的with 会解决

  • 为了让这个布局正常工作,我已经挣扎了好几个小时。 这是我的代码: 每个片段都是一个简单的RelativeLayout(都有相同的视图): 现在我想让它像这样工作: > 1) 无嵌套layout_weight 2)完全没有嵌套(例如嵌套2个第一个片段等) 3)在视图呈现后,不使用代码以编程方式完成。 在我看来,最简洁、可读性最强的方法是将片段1和片段2的方向设置为水平,将片段3设置为垂直,但它不起作