d3.js - d3 条形图刻度在 y 轴上反转,看起来不像经典问题,为什么它表现得很奇怪?
问题描述
在 d3(垂直条形图)中绘制直方图,除了 y 轴刻度反转外,效果很好。这是(几乎)有效的代码:
let maxFrequency = d3.max(histData, d=> d.length);
let yScale = d3.scaleLinear()
.range([0,config.height - config.margin.top - config.margin.bottom])
.domain([0,maxFrequency]); //<-- this is wrong, right? It should be [maxFrequency,0]
let xScale = d3.scaleBand()
.range([0, (config.width - config.margin.left - config.margin.right)])
.domain(histData.map(d => d.Name))
.padding(0.2);
//Draw the histogram bars
let bars = config.svgContainer.selectAll("rect")
.data(histData);
bars.enter()
.append("rect")
.attr("width", xScale.bandwidth())
.attr("height", (d)=> yScale(d.length))
.attr("x", (d) => xScale(d.Name) + config.margin.left)
.attr("y", (d)=> config.height - config.margin.bottom - yScale(d.length))
.attr("fill", "red");//"#2a5599");
let axisX = d3.axisBottom(xScale)
config.svgContainer.append("g")
.style("transform", `translate(${config.margin.left}px,${config.height -
config.margin.bottom}px)`)
.call(axisX)
let axisY = d3.axisLeft(yScale)
config.svgContainer.append("g")
.style('transform',`translate(${config.margin.left}px,${config.margin.top}px)`)
.call(axisY);
此代码生成此图。
通常,您需要反转 y 轴的域属性的顺序。这是我使用“.domain([maxFrequency,0])”代码时的图表,没有其他更改。
您可以看到 y 轴现在是正确的,但条形图看起来很不稳定。仔细观察,您可以看到数据 (1,9,40,80) 仍在显示,但条形图现在反转了。现在,条形高度为 79 (80-1)、71 (80-9)、40 (80-40) 和 0 (80-80)。
我希望这是我没有看到的简单的东西。对于听起来像这样的事情,我找不到任何已发布的解决方案。
解决方案
推荐阅读
- html - 将子 div 放在父级的外部和右侧(下拉菜单)
- serial-port - 全息 sim 和 sim800c 模块
- python - 完全相同的python3代码在shell中工作但不在脚本中?
- react-native - 滚动视图 onendreached 在本机反应中不起作用
- string - Delphi中大字符串的安全连接
- angular - 使用 ionic 4,尝试在应用程序关闭之前使用硬件后退按钮按下事件向用户发出退出警报消息
- javascript - Flask:如何让 POST 返回数据?
- xamarin.android - 如何在一个地方为整个 Xamarin.Android 应用程序设置 fontFamily?
- c# - VS Installer Projects - 安装后执行一些代码
- python - 如何修改/更新 Pydatatable 中某个条件的列值?