2015-09-14 14 views
24

Voglio evitare i valori ripetuti ei valori -0 nell'asse Y, evitando la situazione dell'immagine.mpandroidchart - Come posso evitare i valori ripetuti nell'asse Y?

ho queste idee per risolvere questo, ma qualsiasi soluzione:

  1. Limite lo zoom prima di avere valori ripetuti in asse Y, quindi fermare l'infinito zoom-in sul grafico
  2. Prendi il YAxis valori e rimuove i valori duplicati.

YAxis with duplicate values

+0

impostato con il valore massimo per xey –

+0

ritengo in IOS è risolto nell'ultima versione, con chart.getViewPortHandler(). setMaximumScaleX (4f); chart.getViewPortHandler(). SetMaximumScaleY (4f); Ma non funziona ancora in Android – rguerra

risposta

0

Non ho mai usato MPAndroidCharts prima, ma solo un po 'di ricerca qua e là mi ha fatto questo metodo che credo sarebbe utile.

La descrizione dice che "il numero esatto di etichette specificato verrà disegnato e distribuito uniformemente lungo l'asse". Se riesci a farlo funzionare a tuo favore, potresti essere in grado di limitare lo zoom.

Inoltre, v'è un altro metodo-

public int getLabelCount() { 
     return mLabelCount; 
    } 

Questo restituisce il numero di etichette sull'asse. Spero che questo ti aiuti.

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

2

codice come questo:

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

o:

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

Quando u ottenere i dati:

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

non ho alcun codice per mano mia.

+0

Questo cambia il mio ViewPorter e quando provo a ingrandire, sposta la porta di visualizzazione a destra – rguerra

+0

nessun codice cambierà viewPorter –

3

tl; dr È possibile effettuare questa operazione modificando il numero di etichette in onChartScale.

In primo luogo, si vuole il vostro ascoltatore istituito:

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

si tenta di ottenere il fondo disegnato valori/Top e verificare ciò che viene disegnato sullo schermo. Applica alcuni calcoli di base e sei pronto.

Il seguente codice trarrà 2 etichette se il livello di zoom diventa (anche) in alto e fino a 9 altrimenti:

@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 

Il valore formattatore e tutto il resto rimane lo stesso.

E alcuni brutti screenshot per dimostrare che funziona: D

Zoomed in chart with 2 labels

+0

Posso vedere due volte 15.8ºC. Dove questo risolve i valori ripetuti? Stai solo mettendo due valori nell'asse – rguerra

+0

@rguerra Non puoi impostare <2 elementi sull'asse. Dovresti usare un'altra libreria per questo. Inoltre, sono solo in basso e in alto e solo se l'utente ingrandisce un _lot_. Quindi potresti limitare ulteriormente il livello di zoom, ma dubito che tu possa fare meglio di questo usando MPChart;) –

+0

Non penso di aver bisogno di usare un'altra lib :) perché, questo funziona già nella versione iOS. Possono già limitare lo zoom prima dei valori ripetuti, impostando il valore axisMax e axisMin. Ma in Android, l'area che si ingrandisce si sposta a destra tutto il tempo – rguerra

2

Anche se questa è una domanda più vecchio vorrei aggiungere ad essa per riferimento futuro. Le versioni più recenti della libreria hanno una funzione poco conosciuta che risolve le etichette duplicate, chiamate granularità. Questo è molto più semplice da usare rispetto alle soluzioni più vecchie (anche se per essere onesti, questo non era disponibile nel momento in cui sono stati pubblicati).

È sempre possibile controllare l'ultimo AxisBase Javadocs (3.0.0-beta1) per una spiegazione più dettagliata. Questi sono i metodi rilevanti:

  • setGranularity(float granularity): impostare un intervallo minimo per l'asse in ingrandimento L'asse non è consentito scendere al di sotto di tale limite.. Questo può essere usato per evitare la duplicazione dell'etichetta durante lo zoom.
  • setGranularityEnabled(boolean enabled): Abilita/disabilita il controllo della granularità sugli intervalli dei valori degli assi. Se è abilitato lo , l'intervallo dell'asse non può scendere sotto una certa granularità .

Quindi nel tuo caso avresti bisogno di impostare la granularità a 0.1f poiché si dispone di un punto decimale. Il seguente frammento di codice dovrebbe evitare i valori ripetuti sull'asse: limite

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