2015-09-14 4 views
24

Ich möchte die wiederholten Werte und die -0 Werte in Y-Achse vermeiden, die Bildsituation zu vermeiden.mpandroidchart - Wie kann ich die wiederholten Werte in der Y-Achse vermeiden?

ich diese Ideen haben, diese zu lösen, aber keine Lösung:

  1. Grenze der Zoom vor wiederholten Werte in Y-Achse ist, stoppen daher die unendliche Zoom-in auf dem Chart
  2. Get YAchsenwerte und entfernen Sie die doppelten Werte.

YAxis with duplicate values

+0

eingestellten Grenzwert mit max Wert für x und y –

+0

ich in iOS denken ist in der letzten Version behoben, mit chart.getViewPortHandler(). setMaximumScaleX (4f); . chart.getViewPortHandler() setMaximumScaleY (4f); Aber es funktioniert immer noch nicht in Android – rguerra

Antwort

0

Ich habe MPAndroidCharts nie benutzt, aber nur ein wenig suchen hier und da hat mich diese Methode, die ich denke, nützlich wäre.

Die Beschreibung besagt, dass "genau angegebene Anzahl von Etiketten gezeichnet und gleichmäßig entlang der Achse verteilt wird". Wenn Sie es zu Ihren Gunsten arbeiten lassen, können Sie den Zoom möglicherweise einschränken.

Auch gibt es eine weitere Methoden-

public int getLabelCount() { 
     return mLabelCount; 
    } 

Dadurch wird die Anzahl der Etiketten auf der Achse zurückkehrt. Hoffe das hilft.

https://github.com/PhilJay/MPAndroidChart/blob/5a15715b25991e3d61d27d552f9eba45975d65e7/MPChartLib/src/com/github/mikephil/charting/components/YAxis.java

2

Code wie folgt:

mchart.setAutoScaleMinMaxEnabled(false); 
    mchart.getAxisLeft().setAxisMaxValue(10); 
    mchart.getAxisLeft().setAxisMinValue(5); 
    mchart.getAxisRight().setAxisMaxValue(10); 
    mchart.getAxisRight().setAxisMinValue(5); 

oder:

boolean a = isReady; 
mchart.getAxisLeft().setFormater(new format(float b){ return "" ;}) 

Wenn u Daten erhalten:

mchart.setAutoScaleMinMaxEnabled(true); 
    mchart.getAxisLeft().resetAxisMaxValue(); 
    mchart.getAxisLeft().resetAxisMinValue(); 
    mchart.getAxisRight().resetAxisMaxValue(); 
    mchart.getAxisRight().resetAxisMinValue(5); 

Ich habe keinen Code durch meine Hand.

+0

Das ändere meine viewPorter und wenn ich versuche zu zoomen, bewegen Sie den View-Port nach rechts – rguerra

+0

kein Code wil ändern ur viewPorter –

3

tl; dr Sie können dies tun, indem Sie die Etikettenanzahl in onChartScale ändern.

Zuerst möchten Sie Ihre Zuhörer ein:

chart.setOnChartGestureListener(this); // set a listener ;) 

Sie versuchen, die oben/unten gezogen Werte zu erhalten und überprüfen, was auf dem Bildschirm gezeichnet wird. Wenden Sie einige grundlegende Berechnungen an und Sie sind fertig.

wird der folgende Code 2 Etiketten zeichnen, wenn die Zoomstufe (zu) hoch und bis zu 9 sonst bekommt:

@Override 
public void onChartScale(MotionEvent me, float scaleX, float scaleY) { 
    final YAxis yAxis = mChart.getAxisLeft(); 
    final Transformer transformer = mChart.getTransformer(YAxis.AxisDependency.LEFT); 

    // ...minor dirty hack 
    final PointD top = transformer.getValuesByTouchPoint(0, 0); 
    final PointD bottom = transformer.getValuesByTouchPoint(0, mChart.getHeight()); 
    final int diff = (int)(top.y - bottom.y); 

    // draw 2-9 axis labels 
    final int count = Math.min(9, Math.max(diff, 2)); 

    Log.d("scale", String.format("scale %f: diff %d and count %d", scaleY, diff, count)); 

    // "force" the count, for there are drawing issues where none get drawn on high zoom levels (just try it out) 
    yAxis.setLabelCount(count, true); 
} 

// todo implement other interface methods 

Der Wert Formatierer und alles andere bleibt gleich.

Und einige hässliche Screenshot zu zeigen, dass es funktioniert: D

Zoomed in chart with 2 labels

+0

Ich kann zwei mal 15.8ºC sehen. Wo lösen sich die wiederholten Werte? Sie setzen nur zwei Werte in der Achse – rguerra

+0

@rguerra Sie nicht festlegen <2 Elemente auf der Achse. Sie müssten dafür eine andere Bibliothek verwenden. Außerdem sind sie aber nur am unteren und oberen Rand und nur dann, wenn der Benutzer ein _lot_ zoomt. So könnte man zusätzlich die Zoomstufe begrenzen, aber ich bezweifle, man kann besser tun, als diese mit mpchart;) –

+0

Ich glaube nicht, dass ich eine andere lib :) verwenden muß, da dies bereits in iOS-Version zu arbeiten. Sie können den Zoom bereits vor wiederholten Werten begrenzen und den axisMax- und axisMin-Wert einstellen. Aber in Android verschiebt sich der Bereich, den wir zoomen, ständig nach rechts – rguerra

2

Obwohl dies eine ältere Frage ist, würde ich für die Zukunft, um es hinzufügen. Neuere Versionen der Bibliothek verfügen über ein wenig bekanntes Feature, das die doppelten Beschriftungen, Granularität genannt, auflöst. Dies ist viel einfacher zu verwenden als die älteren Lösungen (obwohl es zur Zeit der Veröffentlichung nicht verfügbar war).

Sie können immer die neuesten AxisBase Javadocs (3.0.0-Beta1) für eine detailliertere Erklärung. Hier sind die relevanten Methoden:

  • setGranularity(float granularity): Legen Sie einen Mindestabstand für die Achse beim Zoomen Die Achse nicht erlaubt ist unterhalb dieser Grenze zu gehen.. Dies kann verwendet werden, um zu vermeiden, dass das Etikett beim Einzoomen dupliziert wird.
  • setGranularityEnabled(boolean enabled): Aktiviert/deaktiviert die Granularitätskontrolle bei Achsenwertintervallen. Wenn aktiviert ist, wird die Achse Intervall nicht unter einer bestimmten Granularität erlaubt zu gehen.

in Ihrem Fall also würden Sie die Granularität zu 0.1f festlegen müssen, da Sie ein Komma haben. Der folgende Code-Snippet sollte die wiederholten Werte auf der Achse vermeiden:

YAxis yAxis = mChart.getAxisLeft(); 
yAxis.setGranularityEnabled(true); 
yAxis.setGranularity(0.1f); 
Verwandte Themen