MP图表在折线图中显示X_axis的一个额外值?

时间:2016-08-29 09:22:54

标签: java android charts

我已实施MP LineChart。除了one之外,每件事都有效。它在x轴的末尾增加了第一个月。值从第二点开始,而不是从第一点开始。我尝试了谷歌提供的几个解决方案,但无法成功。 例如,在下面的屏幕截图中,我的月份列表包含[apr,may,jun,jul,aug]但是它在末尾添加额外的apr并且行从可能不是apr开始。 以下是我的代码。

  String[] mMonths;
  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_multi_line_chart);
    context = this;
    mpref = new MySharedPreferences(this);
    charts_list = new ArrayList<Charts_Data_Model>();
    mChart = (LineChart) findViewById(R.id.chart1);
    mChart.setOnChartValueSelectedListener(this);

    mChart.setDrawGridBackground(false);
    mChart.setDescription("VSC CHART");
    mChart.setDrawBorders(false);

    mChart.getAxisLeft().setEnabled(true);
    mChart.getAxisRight().setDrawAxisLine(false);
    mChart.getAxisRight().setEnabled(false);
    mChart.getAxisRight().setDrawGridLines(false);
    mChart.getXAxis().setDrawAxisLine(true);
    mChart.getXAxis().setDrawGridLines(true);

    // enable touch gestures
    mChart.setTouchEnabled(true);

    // enable scaling and dragging
    mChart.setDragEnabled(true);
    mChart.setScaleEnabled(true);

    // if disabled, scaling can be done on x- and y-axis separately
    mChart.setPinchZoom(true);


    Legend l = mChart.getLegend();
    l.setPosition(Legend.LegendPosition.ABOVE_CHART_LEFT);
    l.setXEntrySpace(7f);
    l.setYEntrySpace(0f);
    l.setYOffset(0f);
    l.setDirection(Legend.LegendDirection.LEFT_TO_RIGHT);
    l.setWordWrapEnabled(true);


    new Task4().execute();

   }


    class Task4 extends AsyncTask<Void, Void, String> {

    @Override
    protected void onPreExecute() {
        pDialog = new ProgressDialog(MultiLineChartActivity.this);
        pDialog.setMessage("please wait");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(Void... arg0) {


        getChartDataHadsM();


        //Record method
        return null;
    }

    @Override
    protected void onPostExecute(String result) {

        super.onPostExecute(result);
        XAxis xAxis = mChart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setAxisMinValue(0f);
        xAxis.setAvoidFirstLastClipping(true);
        // xAxis.setGranularityEnabled(false);
        xAxis.setGranularity(1f);

        xAxis.setValueFormatter(new AxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                return mMonths[(int) value % mMonths.length];
            }

            @Override
            public int getDecimalDigits() {
                return 0;
            }
        });


        LineData data = new LineData(sets);
        mChart.setData(data);
        mChart.invalidate();
        pDialog.dismiss();

    }
}

   public void getChartDataHadsM() {
    mMonths = new String[charts_list_HadsM.size()];
    ArrayList<Entry> e1 = new ArrayList<Entry>();
    ArrayList<Entry> e2 = new ArrayList<Entry>();

    int size = charts_list_HadsM.size();
    for (int i = 0; i < size; i++) {

        String month = charts_list_HadsM.get(i).month;
        mMonths[i] = month;
        String anx = charts_list_HadsM.get(i).anx;
        String dep = charts_list_HadsM.get(i).dep;

        e1.add(new Entry(i + 1, Integer.parseInt(anx)));
        e2.add(new Entry(i + 1, Integer.parseInt(dep)));


    }
    sets = new ArrayList<ILineDataSet>();
    if (!e1.isEmpty()) {
        LineDataSet d1 = new LineDataSet(e1, "anxiety");
        d1.setLineWidth(2.5f);
        d1.setCircleRadius(4.5f);
        d1.setHighLightColor(Color.rgb(244, 117, 117));
        d1.setDrawValues(false);
        sets.add(d1);
    }
    if (!e2.isEmpty()) {
        LineDataSet d2 = new LineDataSet(e2, "depression");
        d2.setLineWidth(2.5f);
        d2.setCircleRadius(4.5f);
        d2.setHighLightColor(Color.rgb(244, 117, 117));
        d2.setColor(ColorTemplate.VORDIPLOM_COLORS[0]);
        d2.setCircleColor(ColorTemplate.VORDIPLOM_COLORS[0]);
        d2.setDrawValues(false);
        sets.add(d2);
    }


}

Screen Shot of my line chart

请提供任何提示或帮助。

1 个答案:

答案 0 :(得分:1)

我没有使用您使用的图表集。但是你所描述的错误和图像看起来像是搞乱了索引。

我已经查看过该来源,并且发现了以下我发现可疑的内容,您可能需要查看:

for (int i = 0; i < size; i++) {
// your month list is 0-based
    String month = charts_list_HadsM.get(i).month;
    mMonths[i] = month;
    String anx = charts_list_HadsM.get(i).anx;
    String dep = charts_list_HadsM.get(i).dep;


// Your data list is 1-based
// You add the data at (i+1) effectively skipping position 0
    e1.add(new Entry(i + 1, Integer.parseInt(anx)));
    e2.add(new Entry(i + 1, Integer.parseInt(dep)));


}

基本上,你的月份现在有一个传奇太少了,而且当它到达条目末尾时,它似乎会旋转。

符合你的形象:

在APR列中,没有值,它以MAY开头。然后添加值,但是图例中的值比月份多一个。因此,图例将重新启动APR以显示额外值。

我建议修复此问题:

for (int i = 0; i < size; i++) {
// your month list is 0-based
    String month = charts_list_HadsM.get(i).month;
    mMonths[i] = month;
    String anx = charts_list_HadsM.get(i).anx;
    String dep = charts_list_HadsM.get(i).dep;


// Make entries index 0-based, too
    e1.add(new Entry(i, Integer.parseInt(anx)));
    e2.add(new Entry(i, Integer.parseInt(dep)));
}