package com.github.mikephil.charting.components; import android.graphics.Paint; import com.github.mikephil.charting.utils.DefaultValueFormatter; import com.github.mikephil.charting.utils.Utils; import com.github.mikephil.charting.utils.ValueFormatter; /** * Class representing the y-axis labels settings and its entries. Only use the * setter methods to modify it. Do not access public variables directly. Be * aware that not all features the YLabels class provides are suitable for the * RadarChart. Customizations that affect the value range of the axis need to be * applied before setting data for the chart. * * @author Philipp Jahoda */ public class YAxis extends AxisBase { /** custom formatter that is used instead of the auto-formatter if set */ protected ValueFormatter mValueFormatter; /** the actual array of entries */ public float[] mEntries = new float[] {}; /** the number of entries the legend contains */ public int mEntryCount; /** the number of decimal digits to use */ public int mDecimals; /** the number of y-label entries the y-labels should have, default 6 */ private int mLabelCount = 6; /** indicates if the top y-label entry is drawn or not */ private boolean mDrawTopYLabelEntry = true; /** if true, the y-labels show only the minimum and maximum value */ protected boolean mShowOnlyMinMax = false; /** flag that indicates if the axis is inverted or not */ protected boolean mInverted = false; /** if true, the y-label entries will always start at zero */ protected boolean mStartAtZero = true; /** custom minimum value this axis represents */ protected float mCustomAxisMin = Float.NaN; /** custom maximum value this axis represents */ protected float mCustomAxisMax = Float.NaN; /** * axis space from the largest value to the top in percent of the total axis * range */ protected float mSpacePercentTop = 10f; /** * axis space from the smallest value to the bottom in percent of the total * axis range */ protected float mSpacePercentBottom = 10f; public float mAxisMaximum = 0f; public float mAxisMinimum = 0f; /** the total range of values this axis covers */ public float mAxisRange = 0f; /** the position of the y-labels relative to the chart */ private YAxisLabelPosition mPosition = YAxisLabelPosition.OUTSIDE_CHART; /** enum for the position of the y-labels relative to the chart */ public enum YAxisLabelPosition { OUTSIDE_CHART, INSIDE_CHART } /** the side this axis object represents */ private AxisDependency mAxisDependency; /** * Enum that specifies the axis a DataSet should be plotted against, either * LEFT or RIGHT. * * @author Philipp Jahoda */ public enum AxisDependency { LEFT, RIGHT } public YAxis() { super(); this.mAxisDependency = AxisDependency.LEFT; } public YAxis(AxisDependency position) { super(); this.mAxisDependency = position; } public AxisDependency getAxisDependency() { return mAxisDependency; } /** * returns the position of the y-labels */ public YAxisLabelPosition getLabelPosition() { return mPosition; } /** * sets the position of the y-labels * * @param pos */ public void setPosition(YAxisLabelPosition pos) { mPosition = pos; } /** * returns true if drawing the top y-axis label entry is enabled * * @return */ public boolean isDrawTopYLabelEntryEnabled() { return mDrawTopYLabelEntry; } /** * set this to true to enable drawing the top y-label entry. Disabling this * can be helpful when the top y-label and left x-label interfere with each * other. default: true * * @param enabled */ public void setDrawTopYLabelEntry(boolean enabled) { mDrawTopYLabelEntry = enabled; } /** * sets the number of label entries for the y-axis max = 15, min = 2, * default: 6, be aware that this number is not fixed and can only be * approximated * * @param yCount */ public void setLabelCount(int yCount) { if (yCount > 15) yCount = 15; if (yCount < 2) yCount = 2; mLabelCount = yCount; } /** * Returns the number of label entries the y-axis should have * * @return */ public int getLabelCount() { return mLabelCount; } /** * If enabled, the YLabels will only show the minimum and maximum value of * the chart. This will ignore/override the set label count. * * @param enabled */ public void setShowOnlyMinMax(boolean enabled) { mShowOnlyMinMax = enabled; } /** * Returns true if showing only min and max value is enabled. * * @return */ public boolean isShowOnlyMinMaxEnabled() { return mShowOnlyMinMax; } /** * If this is set to true, the y-axis is inverted which means that low * values are on top of the chart, high values on bottom. * * @param enabled */ public void setInverted(boolean enabled) { mInverted = enabled; } /** * If this returns true, the y-axis is inverted. * * @return */ public boolean isInverted() { return mInverted; } /** * enable this to force the y-axis labels to always start at zero * * @param enabled */ public void setStartAtZero(boolean enabled) { this.mStartAtZero = enabled; } /** * returns true if the chart is set to start at zero, false otherwise * * @return */ public boolean isStartAtZeroEnabled() { return mStartAtZero; } public float getAxisMinValue() { return mCustomAxisMin; } /** * Set a custom minimum value for this axis. If set, this value will not be * calculated automatically depending on the provided data. Use * resetAxisMinValue() to undo this. Do not forget to call * setStartAtZero(false) if you use this method. Otherwise, the axis-minimum * value will still be forced to 0. * * @param min */ public void setAxisMinValue(float min) { mCustomAxisMin = min; } /** * By calling this method, any custom minimum value that has been previously * set is reseted, and the calculation is done automatically. */ public void resetAxisMinValue() { mCustomAxisMin = Float.NaN; } public float getAxisMaxValue() { return mCustomAxisMax; } /** * Set a custom maximum value for this axis. If set, this value will not be * calculated automatically depending on the provided data. Use * resetAxisMaxValue() to undo this. * * @param max */ public void setAxisMaxValue(float max) { mCustomAxisMax = max; } /** * By calling this method, any custom maximum value that has been previously * set is reseted, and the calculation is done automatically. */ public void resetAxisMaxValue() { mCustomAxisMax = Float.NaN; } /** * Sets the top axis space in percent of the full range. Default 10f * * @param percent */ public void setSpaceTop(float percent) { mSpacePercentTop = percent; } /** * Returns the top axis space in percent of the full range. Default 10f * * @return */ public float getSpaceTop() { return mSpacePercentTop; } /** * Sets the bottom axis space in percent of the full range. Default 10f * * @param percent */ public void setSpaceBottom(float percent) { mSpacePercentBottom = percent; } /** * Returns the bottom axis space in percent of the full range. Default 10f * * @return */ public float getSpaceBottom() { return mSpacePercentBottom; } public float getRequiredWidthSpace(Paint p) { p.setTextSize(mTextSize); String label = getLongestLabel(); return (float) Utils.calcTextWidth(p, label) + getXOffset() * 2f; } public float getRequiredHeightSpace(Paint p) { p.setTextSize(mTextSize); String label = getLongestLabel(); return (float) Utils.calcTextHeight(p, label) + getYOffset() * 2f; } @Override public String getLongestLabel() { String longest = ""; for (int i = 0; i < mEntries.length; i++) { String text = getFormattedLabel(i); if (longest.length() < text.length()) longest = text; } return longest; } /** * Returns the formatted y-label at the specified index. This will either * use the auto-formatter or the custom formatter (if one is set). * * @param index * @return */ public String getFormattedLabel(int index) { if (index < 0 || index >= mEntries.length) return ""; else return getValueFormatter().getFormattedValue(mEntries[index]); } /** * Sets the formatter to be used for drawing the values inside the chart. If * no formatter is set, the chart will automatically determine a reasonable * formatting (concerning decimals) for all the values that are drawn inside * the chart. Use chart.getDefaultValueFormatter() to use the formatter * calculated by the chart. * * @param f */ public void setValueFormatter(ValueFormatter f) { if (f == null) return; else mValueFormatter = f; } /** * Returns the formatter used for drawing the values inside the chart. * * @return */ public ValueFormatter getValueFormatter() { return mValueFormatter; } /** * If this component has no ValueFormatter or is only equipped with the * default one (no custom set), return true. * * @return */ public boolean needsDefaultFormatter() { if (mValueFormatter == null) return true; if (mValueFormatter instanceof DefaultValueFormatter) return true; return false; } /** * Returns true if this axis needs horizontal offset, false if no offset is * needed. * * @return */ public boolean needsOffset() { if (isEnabled() && isDrawLabelsEnabled() && getLabelPosition() == YAxisLabelPosition.OUTSIDE_CHART) return true; else return false; } }