javascript - 根据数据点强制面积图的 X 轴刻度线

标签 javascript d3.js charts

我正在使用 D3 的面积图来构建具有以下结构的数据图表:

data = [
  {
    date: "2019-02-01", 
    value: 100
  }, {
    date: "2019-03-01", 
    value: 1
  }
]

当我使用D3's Area Chart Example时他们将 X 轴设置为:

const x = d3.scaleTime()
    .domain(d3.extent(data, d => Date.parse(d.date)))
    .range([margin.left, width - margin.right])
const xAxis = g => g
    .attr("transform", `translate(0,${height - margin.bottom})`)
    .call(d3.axisBottom(x).ticks(width / 80).tickSizeOuter(0));

但是,这会在整个 X 轴上均匀地添加刻度线。我尝试过类似的事情:

const xAxis = g => g
    .attr("transform", 'translate(0,' + (height + data.length) + ')')
    .call(d3.axisBottom(x).ticks(data.length).tickSizeOuter(0));

但 X 轴上没有出现任何内容。如何让 X 轴仅在我的数据中的给定日期值上显示刻度线(即对于上面的示例数据,我只想在 X 轴上看到 2019-02-012019-03-01)。

更好的是只显示这些日期的月份和年份(即 2019-02-01 将在图表上显示为 2019 年 2 月)。

最佳答案

您可以通过向 axis.tickValues() 提供包含所需刻度值的数组来指定哪些值应为刻度。如果您的刻度应该是数据数组中的值,那么您只需要循环遍历数组并挑选出值。在你的情况下,这可能看起来像:

var axis = d3.axisBottom()
  .scale(x)
  .tickValues(
     data.map(function(d) { return timeParse(d.date); })
  )

如果您的刻度是时间刻度,则值必须是日期对象,因此我们无法传递格式化日期。但是,如果我们想指定如何显示刻度,那么我们还可以将格式传递给 axis.tickFormat,这将让您设置日期的显示方式。我们一起得到:

var svg = d3.select("svg");

var data = data = [
  {
    date: "2019-02-01", 
    value: 100
  },
  {
    date: "2019-03-1", 
    value: 50
  },
  {
    date: "2019-05-01", 
    value: 1
  }

];

var timeParse = d3.timeParse("%Y-%m-%d");
var timeFormat = d3.timeFormat("%B %Y");

var x = d3.scaleTime()
  .domain(d3.extent(data,function(d) { return timeParse(d.date); }))
  .range([20,300]);
  
var y = d3.scaleLinear()
  .domain([0,100])
  .range([10,100]);
  
var line = d3.line()
  .x(function(d) { return x(timeParse(d.date)); })
  .y(function(d) { return y(d.value); })
  
svg.append("path")
  .datum(data)
  .attr("d", line);
  
// Axis:
var axisBottom = d3.axisBottom()
  .scale(x)
  .tickValues(data.map(function(d) {
    return timeParse(d.date); // specify which values should be ticks.
  }))
  .tickFormat(timeFormat);
  
svg.append("g")
  .attr("transform","translate(0,100)")
  .call(axisBottom);
  
  
  
svg.selectAll("text")
  .attr("text-anchor","start")
  .attr("transform","rotate(90)translate(10,-13)");
path {
  fill: none;
  stroke: black;
  stroke-width: 1px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg width="400" height="400"></svg>

关于javascript - 根据数据点强制面积图的 X 轴刻度线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55128693/

相关文章:

javascript - 在 vue.js 中更改文件输入

javascript - Gulp BrowserSync 在终端中显示 "reloading browsers",但没有重新加载实际的浏览器。

java - 在 Java 中将数据表示为图表

javascript - Chart.js,更改最大高度(不带 Canvas )或向上舍入规则?

javascript - Here API - 删除 map

javascript - d3js Enter().exit().remove()后追加

d3.js - d3 : force directed graph: node filtering

javascript - 使用交叉过滤器将 dc.js 绑定(bind)到 Google map

javascript - 如何创建带有最小值、最大值和平均值的 Chart.JS 条形图

javascript - 使用ajax在后台上传照片