为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用对数(符号)刻度为 yAxis 设置刻度?

如何使用对数(符号)刻度为 yAxis 设置刻度?

动漫人物 2022-09-29 10:48:47
以下是使用d3.v5在我的图表上的yAxis代码:    let x = d3.scaleTime()        .domain(d3.extent(data, d => d.date))        .range([margin.left, width - margin.right])    let y = d3.scaleSymlog()        .domain([0, d3.max(data, d => d.Confirmed)]).nice()        .range([height - margin.bottom, margin.top])    let line = d3.line()        .defined(d => !isNaN(d.value))        .x(d => x(d.date))        .y(d => y(d.value))    let xAxis = g => g        .attr("transform", `translate(0,${height - margin.bottom})`)        .call(d3.axisBottom(x).ticks(width / 80).tickSizeOuter(0))    let yAxis = g => g        .attr("transform", `translate(${margin.left},0)`)        .call(d3.axisLeft(y))        .call(g => g.select(".domain").remove())        .call(g => g.select(".tick:last-of-type text").clone()            .attr("x", 3)            .attr("text-anchor", "start")            .attr("font-weight", "bold")            .text(data.y))    let svg = d3.select('#MultiLineLogChart').select("svg")    svg.attr("viewBox", [0, 0, width, height])        .attr("fill", "none")        .attr("stroke-linejoin", "round")        .attr("stroke-linecap", "round");    svg.append("g")        .call(xAxis);    svg.append("g")        .call(yAxis);这是我的对数图表的链接:https://covid19wiki.info/country/Canada
查看完整描述

1 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

您看到的问题是 Symlog 音阶的一个持续存在的问题:https://github.com/d3/d3-scale/issues/162

您可以在这个简单的演示中看到它:

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

const scale = d3.scaleSymlog()

  .domain([0, 100000])

  .range([140, 10]);

const axis = d3.axisLeft(scale).ticks(4)(svg.append("g").attr("transform", "translate(50,0)"));

<script src="https://d3js.org/d3.v5.min.js"></script>

<svg></svg>

以下是可能的解决方案:

  • 更改 D3 源代码,如 GitHub 链接中所述;

  • 为自己设置一个足够刻度值的数组,您将传递给axis.tickValues;

  • 使用 Log 刻度,其中域从 1 开始而不是从零开始。

最后一个选项似乎是一个黑客,但它是迄今为止最简单的,并且鉴于您的最高价值如此之大,从视觉上讲,它不会对dataviz产生任何影响。在这里:

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

const scale = d3.scaleLog()

  .domain([1, 100000])

  .range([140, 10]);

const axis = d3.axisLeft(scale).ticks(4).tickFormat(d => d3.format("")(d))(svg.append("g").attr("transform", "translate(50,0)"));

<script src="https://d3js.org/d3.v5.min.js"></script>

<svg></svg>


查看完整回答
反对 回复 2022-09-29
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信