OK, wir können sie anfangen zu lernen, mit der Verwendung sowohl mit den gleichen Daten Unterschiede zu sehen (ich verwende d3 v4), stellen wir die Daten unter Verwendung von mit ordinal
und linear
Skalen haben:
const data = [1, 2, 3, 4, 5];
const scaleLinear = d3.scaleLinear()
.domain([0, Math.max(...data)]).range([1, 100]);
const scaleOrdinal = d3.scaleOrdinal()
.domain(data).range(['one', 'two', 'three', 'four', 'five']);
jetzt beginnen wir fordern sie das Ergebnis zu sehen:
scaleLinear(1); //20
scaleOrdinal(1); //one
scaleLinear(2); //40
scaleOrdinal(2); //two
scaleLinear(5); //100
scaleOrdinal(5); //five
Blick auf die Funktionen und die Ergebnisse, die wir erhalten, wie Sie in der Ordnungs man sehen wir die Daten in unserem Bereich abzubilden, während im linearen man wir strecken der Bereich, so in diesen Fällen zum Beispiel scaleLinear (1) wird wieder 20 ... unsere Domain max 100 und 100 geteilt durch 5 ist gleich 20 ist, so scaleLinear (1) ist und scaleLinear (2) ist .. .
Aber wie Sie sehen, scaleOrdinal (1) ist Karte auf dem Feld im Bereich, es ist so gleich ein und scaleOrdinal (2) es ist gleich zwei ...
Also das ist, wie Sie diese Waage verwenden können, scaleLinear für viele Dinge nützlich ist, einschließlich vorhanden, um die Skala auf Seite, aber scaleOrdinal nützlicher für die Daten, um bekommen, das ist, wie es in der Dokumentation erklärt hat:
# d3.scaleLinear() <>
Konstruiert eine neue kontinuierliche Skala mit dem Einheitsbereich [0, 1], der Einheit Bereich [0, 1], das Standardwert-Interpolator und Klemm deaktiviert. Lineare Skalen sind eine gute Standardauswahl für kontinuierliche quantitative Daten, da sie proportionale Unterschiede beibehalten. Jeder Bereichswert y kann als eine Funktion des Domänenwerts x ausgedrückt werden: y = mx + b.
d3.scaleOrdinal ([Bereich]) <>
Konstruiert eine neue Ordinalskala mit einem leeren Bereich und dem angegebenen Bereich . Wenn kein Bereich angegeben ist, wird standardmäßig das leere Array verwendet. Eine Ordinalskala liefert immer undefined, bis ein nicht leerer Bereich definiert ist.
Auch dies ist ein gutes Beispiel von d3 in der Tiefen sowohl ordinal und lineare Skalen zur gleichen Zeit unter Verwendung von:
var myData = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
var linearScale = d3.scaleLinear()
.domain([0, 11])
.range([0, 600]);
var ordinalScale = d3.scaleOrdinal()
.domain(myData)
.range(['black', '#ccc', '#ccc']);
d3.select('#wrapper')
.selectAll('text')
.data(myData)
.enter()
.append('text')
.attr('x', function(d, i) {
return linearScale(i);
})
.text(function(d) {
return d;
})
.style('fill', function(d) {
return ordinalScale(d);
});
body {
font-family: "Helvetica Neue", Helvetica, sans-serif;
font-size: 14px;
color: #333;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.2/d3.min.js"></script>
<svg width="800" height="60">
\t <g id="wrapper" transform="translate(100, 40)">
\t </g>
</svg>
Die lineare Skala zwischen Eingangswerten interpoliert werden, wohingegen die ordinale Skala wird nicht. –
@LarsKotthoff können Sie bitte ein Beispiel geben? – Bruce
Es gibt tatsächlich ein Beispiel dafür in der Dokumentation, das 'lineare (0.5)'. –