Полоса прокрутки, установленная на гистограмме в Android с использованием achartengine

В моем проекте я должен отображать гистограмму за 30 дней с ежедневной чистой суммой. При просмотре гистограммы метки оси X были свернуты и все *отображены* без пробелов. Пока я нажимал кнопки масштабирования, представления расширялись, и мы могли видеть полосу с соответствующими метками оси x. Мне нужно показать гистограмму в расширенном представлении о времени начала активности.

Код для отображения гистограммы:

     XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
        renderer.setAxisTitleTextSize(16);
        renderer.setChartTitleTextSize(20);
        renderer.setLabelsTextSize(15);
        renderer. setLegendTextSize(15);
//     renderer.setInScroll(true);
        //renderer.setMargins(new int[]{10,10,10,0});
        int length = colors.length;
        for (int j = 0; j < length; j++) {
          SimpleSeriesRenderer r = new SimpleSeriesRenderer();
          r.setColor(colors[j]);
          renderer.addSeriesRenderer(r);
        }
        if(flag==1)
     renderer.setChartTitle("Monthly Basis");
        if(flag==0)
             renderer.setChartTitle("Weekly Basis");
        if(flag==2)
             renderer.setChartTitle("Yearly Basis");
    renderer.setXTitle("Date");
    renderer.setYTitle("NetAmount");

    renderer.setXAxisMin(0);

    //renderer
    renderer.setYAxisMin(100);
   // renderer.setYAxisMax(35000);
    renderer.setAxesColor(Color.GRAY);
    renderer.setLabelsColor(Color.LTGRAY);
          renderer.setXLabels(0);
          //renderer.setYLabels(31);
            renderer.setDisplayChartValues(true);
            renderer.setXLabelsAlign(Align.LEFT);
            renderer.setYLabelsAlign(Align.RIGHT);
          if(flag==0 || flag==1)
          {
             for(int axis=1;axis<=31;axis++)
            {
                String d;
                d=String.valueOf(axis);
                renderer.addTextLabel(axis,d);

            }
          }
          else
          {
              renderer.setXAxisMin(2005);
              for(int axis=2005;axis<=2011;axis++)
                {
                    String d;
                    d=String.valueOf(axis);
                    renderer.addTextLabel(axis,d);

                }

             // renderer.setXLabels(4);
          }
             //renderer.setPanEnabled(false,false);
             //renderer.setZoomEnabled(false,false);
           // renderer.setPanLimits(new double[] { 0, 32, -10, 40 });
          // renderer.setZoomLimits(new double[] { 0, 32, -10, 40 });
            renderer.setZoomRate(3.0f);
            renderer.setBarSpacing(0.25);
            //renderer.set(new  double[] {0,30,100,35000});
            //Intent in;

            List<double[]> xvalues = new ArrayList<double[]>();

            int count=1,j=0;
           if(flag==0 || flag==1)
           {
            double xdata[]=new double[31];
            while(count<32)
            {

            xdata[j]=count;
            count++;
            j++;

            }
            xvalues.add(xdata);
           }
           if(flag==2)
           {
            double xdata[]=new double[7];
            count=2005;
            while(j<7)
            {

            xdata[j]=count;
            count++;
            j++;

            }
            xvalues.add(xdata);
           }


          //  return ChartFactory.getBarChartIntent(context, buildBarDataset(titles,xvalues,values), renderer,
            //    Type.DEFAULT);
            mchart=ChartFactory.getBarChartView(context,buildBarDataset(titles,xvalues,values), renderer, Type.STACKED);
            //LinearLayout layout = (LinearLayout) findViewById(R.id.chart1);
            layout.addView(mchart);
            mchart.repaint();

            //startActivity(in);

  }


     protected XYMultipleSeriesDataset buildBarDataset(String[] titles, List<double[]> xvalues, List<double[]> values) {
    XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
     int length = titles.length;
     for (int i = 0; i < length; i++) {
    //CategorySeries series = new CategorySeries(titles[i]);
XYSeries series = new XYSeries(titles[i]);
double[] v = values.get(i);
double[]x=xvalues.get(i);

int seriesLength = v.length;
    for (int k = 0; k < seriesLength; k++) {
if(v[k]==0)
{
v[k]=MathHelper.NULL_VALUE;
}
else
{
     series.add(x[k],v[k]);
}
      //Log.i("Invent","X Axis"+x[k]);
//series.add(xdata[k],v[k]);
     }
     dataset.addSeries(series);
    for (int k = 0; k < seriesLength; k++) {
if(v[k]==MathHelper.NULL_VALUE)
{
v[k]=0;
}
     }
    }
   return dataset;
       }


}

person Venkatesh    schedule 27.06.2012    source источник
comment
Очень сложно понять, что вы описываете, не могли бы вы добавить картинку или попробовать написать по-другому? Что вы имеете в виду под перегруженностью? Друг над другом? Также может помочь короткий код, в котором вы добавляете значения в гистограмму.   -  person larlin    schedule 27.06.2012
comment
Ларлин спасибо за ответ. Извините за эту проблему. Для вашего понимания я добавил свой код сейчас. Пожалуйста, подтвердите это. В этом кодировании я установил значение оси x как 31 и соответствующие им значения оси y. Проблема возникает в представлении гистограммы, когда метки оси X были свернуты с другим. Представление представляет собой форму, состоящую из 31 записи, отображаемой на экране просмотра одновременно. Итак, я хочу установить полосу прокрутки для просмотра значения за 30 дней с точным интервалом.   -  person Venkatesh    schedule 27.06.2012
comment
Ларлин сэр. Вы можете это понять? Пожалуйста помогите . Это срочно.   -  person Venkatesh    schedule 27.06.2012
comment
Если кто-то знает ответ на него, пожалуйста, поделитесь.   -  person Venkatesh    schedule 27.06.2012


Ответы (2)


Я не уверен на 100%, но вот попытка.

Сначала вы, кажется, используете устаревший метод addTextLabel, когда в настоящее время предлагается addXTextLabel.

Во-вторых, вы устанавливаете setXLabels(0); with кажется странным, поскольку у вас будет более 0 XLabels, а также не знаете, как это будет работать с используемым устаревшим методом.

В-третьих, я думаю, что значение X в addTextLabel на самом деле является позицией, а не индексом столбца.

Я не эксперт ни в aChartEngine, ни сейчас у меня нет времени протестировать ваш код. Сегодня вечером я проведу тестирование и отредактирую этот ответ с результатом. Если никакой другой ответ вам не поможет.

(редактировать)

После тестирования вашего кода я получаю такой результат:

метки после вставки

Это проблема, которая решается тремя способами:

  • Уменьшите количество меток, например. только печать когда-либо другой.
  • Используйте меньший размер шрифта для меток, я думаю, что это будет сложно в этом случае, так как я думаю, что читабельность сильно пострадает.
  • Попробуйте сделать ось длиннее, например. удаление меток на другой оси. Я предполагаю, что вы хотите показать метки для суммы, поэтому здесь это бесполезно.

Я сделал очень простую и наивную реализацию, пропуская все остальные, так как считаю, что это самое полезное решение.

for(int axis=1;axis<=31;axis++)
{
  if(axis%2 == 1){
    String d;
    d=String.valueOf(axis);
    renderer.addTextLabel(axis,d);
  }
}

Результат выглядит следующим образом:

введите здесь описание изображения

Надеюсь это поможет!

(редактировать снова)

Новое понимание вопроса выше все еще верно, но вот ответ на вопрос, как я его понимаю сейчас.

Чтобы заставить панораму работать, вам нужно включить панорамирование (уже сделано в этом вопросе), а затем установить xAxisMax на что-то меньшее, чем длина набора данных. В этом примере проще всего просто установить его, например. 15f это делается так:

renderer.setXAxisMax(15.0f);

Надеюсь, это то, что вы хотели.

person larlin    schedule 27.06.2012
comment
Пожалуйста, не принимайте ответ, пока не убедитесь, что он работает. Если ответ немного неясен (как мой выше), пожалуйста, также укажите, что вы сделали из ответа, который помог. Если вы просто чувствуете, что ответ вам помог, пожалуйста, просто поддержите ответ и подождите с принятием, пока не узнаете, что он сработал. - person larlin; 27.06.2012
comment
Извините, сэр, я хочу сделать так, чтобы 30 дней отображались по оси X, не пропуская никого. Есть ли шанс отобразить это, настроив полосу прокрутки? - person Venkatesh; 28.06.2012
comment
Извините, пропустил эту часть, чтобы полоса состояла из нескольких точек данных, измените размер оси на: renderer.setXAxisMax(15.0f); Это покажет первые 15 точек данных. Обновил мой ответ. - person larlin; 28.06.2012
comment
renderer.setXAxisMax(15.0f) работает хорошо. Ларлин большое спасибо. - person Venkatesh; 28.06.2012

Если я правильно понимаю ваш очень запутанный вопрос, вам нужно использовать setBarSpacing().

person Dheeraj Vepakomma    schedule 27.06.2012
comment
Спасибо за ответ Дирадж. Я также добавил setBarSpacing() в свой код. - person Venkatesh; 27.06.2012
comment
Простите, сэр. Я не могу добавить скриншот сюда. Сайты заблокированы как спам из-за того, что у меня меньше репутации. - person Venkatesh; 27.06.2012