英文:
How do i set the apex (intercept) when scaling
问题
this.y = d3
.scalePow()
.exponent(2)
.domain([2000, 10000])
.range([600, 0]);
这段代码的作用是将2000映射到600,将10000映射到0,而介于两者之间的值会按照某个二次方程进行缩放,该二次方程的顶点位于2000。现在问题很简单,如何将顶点设置为例如6000?我想在6000处有大间隔的详细值,而在外边缘有窄间隔的步进值。
我添加了一张我用手绘制的图片以进行说明。我可能会稍后添加一张更好的图片
我不确定"parabola apex"是否是正确的词汇,德语中它被称为"Scheitelpunkt"。
英文:
Lets assume this is the d3 code
this.y = d3
.scalePow()
.exponent(2)
.domain([2000, 10000])
.range([600, 0]);
What it does is mapping 2000 to 600, 10000 to 0, and everything inbetween is scaled by some quadratic formula which has its apex at 2000. Now the question is easy, how to i set the apex to say 6000? i want detailed values (big gaps) in the 6000 and narrow steps in the outer rim.
I added a picture i drew with my fingers for clarificarion. I might add a better pic later
I am not sure if parabola apex is the right word, in german its called Scheitelpunkt
答案1
得分: 0
简单地,将.exponent(2)
更改为.exponent(1/2)
:
这与x^2
和sqrt(x)
是反函数有关。
英文:
Simply, change the .exponent(2)
to .exponent(1/2)
:
This has everything to do with the fact that x^2
and sqrt(x)
are inverse functions.
答案2
得分: 0
可以使用Symlog比例尺来实现您想要的效果,它提供了双对数变换。
为了使其工作,您所称之为apex(即6000
)将成为比例尺上的零点,域将为[-4000, 4000]
(因为2000 = 6000 - 4000
,而10000 = 6000 + 4000
)。
此外,请不要忘记格式化刻度线,添加6000
,当然也要格式化传递给比例尺的值。
这是演示:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
const svg = d3.select("svg")
.attr("width", 600);
const scale = d3.scaleSymlog()
.constant(500)
.range([20, 580])
.domain([-4000, 4000]);
const axis = d3.axisBottom(scale).tickFormat(d => d + 6000);
svg.append("g").attr("transform", `translate(0,)`).call(axis)
<!-- language: lang-html -->
<script src="https://d3js.org/d3.v7.min.js"></script>
<svg></svg>
<!-- end snippet -->
英文:
What you want can be done using a Symlog scale, which provides a bi-symmetric log transformation.
For that to work, what you call the apex (that is, 6000
) will be the zero in the scale, and the domain will be [-4000, 4000]
(since 2000 = 6000 - 4000
, and 10000 = 6000 + 4000
).
Also, don't forget to format the ticks, adding 6000
, and obviously the values you pass to the scale as well.
Here's the demo:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
const svg = d3.select("svg")
.attr("width", 600);
const scale = d3.scaleSymlog()
.constant(500)
.range([20, 580])
.domain([-4000, 4000]);
const axis = d3.axisBottom(scale).tickFormat(d => d + 6000);
svg.append("g").attr("transform", `translate(0,)`).call(axis)
<!-- language: lang-html -->
<script src="https://d3js.org/d3.v7.min.js"></script>
<svg></svg>
<!-- end snippet -->
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论