Ich möchte eine Skala erstellen, die einen Bereich aufeinanderfolgender Ganzzahlen (Indizes von Zeichen in einer Zeichenfolge) zu regelmäßigen Intervallen in einem anderen Bereich von ganzen Zahlen (Pixel, sagen 0-600). Das heißt, ich möchte den Pixeln Zeichen und umgekehrt so regelmäßig wie möglich zuweisen, wobei die Länge von Eins nicht notwendigerweise ein Vielfaches des anderen ist.Beste d3 Skalierung für Mapping Integer Bereich
Zum Beispiel Mapping [0,1,2,3] auf 400 Pixel, würde ich
0 -> 0-99
1 -> 100-199
2 -> 200-299
3 -> 300-399
erwarten und umgekehrt
0-99 -> 0
100-199 -> 1
200-299 -> 2
300-399 -> 3
während für die Zuordnung von 0-4000 auf 400 Pixel, Ich würde erwarten
0-9 -> 0
10-19 -> 1
etc.
Was ist die beste Skala für diese in d3 verwenden?
Auf der einen Seite habe ich Angst, dass diskrete Skalen nicht die Tatsache verwenden, dass die Domäne gleichmäßig getrennt ist und eine große switch-Anweisung generiert, wenn die Anzahl der Elemente groß ist. Da ich die Skala für jedes Element verwenden werde, um ein Bild zu zeichnen, mache ich mir Sorgen um die Leistung.
Auf der anderen Seite wird eine lineare Skala wie
d3.scaleLinear()
.domain([0,399]) // 400 pixels
.rangeRound([0,3]) // 4 elements
mir
0 0
66 0 // 1st interval has 66 pixels
67 1
199 1 // other intervals have 132 pixels
200 2
332 2
333 3 // last interval has 66 pixels
400 3
(fiddle)
so der Interpolator gibt ungleiche Intervalle (kürzer an dem Enden) gibt.
Edit: nicht d3 verwenden, ist es nicht schwer zu implementieren:
function coordinateFromSeqIndex(index, seqlength, canvasSize) {
return Math.floor(index * (canvasSize/seqlength));
}
function seqIndexFromCoordinate(px, seqlength, canvasSize) {
return Math.floor((seqlength/canvasSize) * px);
}
Schade nur, wenn es nicht mit d3 Waage kommt, da es viel besser lesbar werden würde.
Ich bin ein wenig unklar, was Ihre Eingabe und ausgegeben. In dem Teil "while for mapping 0-4000 to 400 pixels" haben Sie sich von der Abbildung eines Intervalls auf eine ganze Zahl entfernt, im Gegensatz zur Abbildung einer Ganzzahl auf ein Intervall wie im ersten Beispiel. –
Ich meinte das, wenn Ich muss 4000 Objekte auf 400 Boxen verteilen, ich erwarte 10 davon in jeder Box, oder stell dir vor, du willst Zeichen in einer 4000 Zeichen langen Zeichenkette mit verschiedenen Farben darstellen und sie in eine Leinwand von 400x400 px zeichnen die Eingabe als Ganzzahlen, Sie müssen nur die Ausgabe der Skala runden, das ist kein Problem. – JulienD