photor hat geschrieben: Mo 15. Feb 2021, 19:42Dafür muss ich mir die Bedeutung der Parameter mal genau ansehen.
Die Achsenbeschriftung spielt sich hier in der Property "Intervals" der Achse ab.
Um die Option "aipGraphCoords" zu verstehen, musst du wissen, dass TAChart mehrere Koordinatensystem verwendet. Zunächst das Koordinatensystem der direkten Eingabedaten, also der Werte vor dem Logarithmieren --> Achsen-Koordinaten, weil das die Zahlen sind, die an der Achse stehen. Dann das Koordinatensystem der logarithmierten Werte --> Graph-Koordinaten, weil das die Einheiten sind, in denen gezeichnet wird. Und die Bildschirmkoordinaten nach Umrechnung der Graph-Koordinaten --> Image-Koordinaten. Nimmt man nun die Option aipGraphCoordinates zu den Interval.Options hinzu, dann versucht die Beschriftungsroutine "schöne" Werte für die logarithmierten Werte zu finden, also z.B. -1, 0, 1, 2 - die Achse wird dann aber mit 10^-1=0.1, 10^0 = 1, 10^1 = 10 und 10^2 =100 beschriftet.
Intervals.MaxLength ist der maximale Abstand der Ticks (in Pixeln). In der Regel sind die Ticks eines Log-Plots weiter voneinander entfernt als die Ticks eines Lin-Plots (weil sie im Idealfall ganze Dekaden überdecken). Daher muss man MaxLength für die Log-Achse vergrößern, sonst ist der Algorithmus gezwungen einen Zwischenwert zu suchen bevor die nächste Dekade erreicht wird.
Intervals.MinLength wäre entsprechend der minimale Abstand zwischen Ticks, auch hiermit kannst du beeinflussen, welche Werte als Labels gefunden werden
Intervals.Tolerance erlaubt, dem Algorithmus um maximal soviele Pixel von einem gefundenen Label abzuweichen, um "schönere" Werte zu finden, wenn die anderen Parameter das nicht zulassen würden. Alexander S.Klenin, der das alles geschrieben hat, meinte, in vielen Fällen wären ein paar Pixel ausreichend. Ich habe jedoch gesehen, dass man für eine logarithmische Achse die Tolerance sehr groß machen muss (über 100), sonst kommen zuviele krumme Werte rein, statt die vollen Dekaden.
Das ganze ist sehr kompliziert ausgefallen, und hat man eine schöne Beschriftung gefunden, so können doch wieder Zwischenwerte auftauchen, wenn man die Größe des Chart verändert.
Wenn du nur Ticks an den vollen Dekaden haben willst (0.001, 0.01, 0.1, 1, 10, 100, 1000 usw.) dann solltest du eine TListChartSource aufs Formular klicken. Im Property DataPoints schreibst du in die X und Y Spalte die gewünschten Werte. Die ListChartSource verbindest du dann mit Marks.Source der betreffenden Achse. Das sieht schick aus, hat aber ein Problem, wenn der User in den Chart hineinzoomt und plötzlich keine Markierungen mehr sieht...
Das ganze ist nicht trivial...