Как использовать AChartEngine для отображения двух круговых диаграмм в одном действии И отображения моих собственных данных на диаграммах

Я очень новичок в achartengine (в программировании на Java/Android в целом), но мне нужно, чтобы он отображал две круговые диаграммы в одном действии. Я заставил его работать, вызвав следующий код, но теперь я хотел бы знать, как отобразить данные, которые я установил ранее в действии. Каждая диаграмма должна содержать свои данные (собственный массив строк).

Мой onCreate основного действия

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.rezultati);

        ...


        db.open();
        //here I get the values, which are then stored in test1, test2 and test3 for graph 1
        //I also get the values for graph 2, which are called test4, test5 and test6
        db.close();

        //Now I'd like to assign those 'test' values to the pie chart

Вот мой класс PieGraph, который находится в том же файле .java, что и моя активность.

public class PieGraph{
     public GraphicalView getView(Context context) {

        int[] values; //I'd like to place my values for the first graph here, display the 1st graph and then do the same with the second

        CategorySeries series = new CategorySeries("Pie Graph");
        //I also need to replace my 'series' to "test1", "test2" and "test3" for the 1st graph
        //and "test4", "test5" and "test6 for the 2nd graph

        int[] colors = new int[] { Color.BLUE, Color.GREEN, Color.RED };

        DefaultRenderer renderer = new DefaultRenderer();
        for (int color : colors) {
            SimpleSeriesRenderer r = new SimpleSeriesRenderer();
            r.setColor(color);
            renderer.addSeriesRenderer(r);
        }

        renderer.setZoomButtonsVisible(false);
        renderer.setPanEnabled(false);
        renderer.setDisplayValues(true);
        renderer.setLabelsTextSize(35);
        renderer.setShowLegend(false);

        return ChartFactory.getPieChartView(context, series, renderer);
    }
}

Теперь мне нужен метод, который будет получать данные «тестовые» значения, помещать их в график и выводить оба графика в макете (я уже добавил два LinearLayouts для графиков в свой .xml).


person alkra_dev    schedule 06.05.2014    source источник


Ответы (1)


Вы можете сделать это, используя что-то вроде ниже. Но убедитесь, что «arrProducts», который представляет собой массив пользовательских объектов, заполнен до вызова этого метода. Пользовательский класс объектов имеет методы получения и установки для "уникальных вызовов" и "специальности". Я преобразовал uniqueCalls, которые были строковыми, в логические значения.

ArrayList<CustomObjectClass> arrProducts;

public void PieChart() {
            try {
                String uniqueCalls;
                String specialtyName;

                CategorySeries series = new CategorySeries(" Pie Chart");
                for (int i = 0; i < arrProducts.size(); i++) {
                    uniqueCalls = arrProducts.get(i).getUniqueCalls();
                    specialtyName = arrProducts.get(i).getSpecialtyName();
                    double db = Double.parseDouble(uniqueCalls);
                    Log.v("******", "String : " + uniqueCalls + " Double: " + db);
                    series.add(specialtyName, db);
                }
                // Color of each Pie Chart Sections
                int[] colors = { Color.rgb(169, 169, 169), Color.rgb(255, 165, 0),
                        Color.rgb(128, 128, 128), Color.rgb(255, 160, 122),
                         R.color.BabyBlue,
                        R.color.BashfulPink, R.color.BasketBallOrange,
                        R.color.Chocolate,R.color.Khaki, R.color.LimeGreen,  R.color.Maroon, };

                // Instantiating a renderer for the Pie Chart
                DefaultRenderer defaultRenderer = new DefaultRenderer();

                for (int i = 0; i < arrProducts.size(); i++) {
                    specialtyName = arrProducts.get(i).getSpecialtyName();
                    SimpleSeriesRenderer seriesRenderer = new SimpleSeriesRenderer();
                    seriesRenderer.setColor(colors[i]);

                    seriesRenderer.setDisplayChartValues(true);
                    // Adding a renderer for a slice
                    defaultRenderer.addSeriesRenderer(seriesRenderer);
                }

                // defaultRenderer.setChartTitle("Product Wise Calling");
                defaultRenderer.setChartTitleTextSize(20);
                defaultRenderer.setZoomButtonsVisible(true);
                // defaultRenderer.setBackgroundColor(Color.GRAY);
                defaultRenderer.setLabelsColor(Color.BLACK);
                defaultRenderer.setDisplayValues(true);
                defaultRenderer.setClickEnabled(true);
                defaultRenderer.setSelectableBuffer(10);

                LinearLayout chartContainer = (LinearLayout) findViewById(R.id.chart_container);

                // Creating a Line Chart
                mChartView = ChartFactory.getPieChartView(getBaseContext(), series,
                        defaultRenderer);

                // Adding the Line Chart to the LinearLayout
                chartContainer.addView(mChartView);

                mChartView.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        SeriesSelection seriesSelection = mChartView
                                .getCurrentSeriesAndPoint();
                        if (seriesSelection == null) {
                            Toast.makeText(
                                    ChartProductCallingSpecialtyWiseActivity.this,
                                    "Please Select the Pie to see the value",
                                    Toast.LENGTH_SHORT).show();
                        } else {
                            // display information of the clicked point
                            Toast.makeText(
                                    ChartProductCallingSpecialtyWiseActivity.this,
                                    " Pie Value : " + seriesSelection.getXValue(),
                                    Toast.LENGTH_SHORT).show();
                        }

                    }
                });
                // ANOTHER INSTANCE EXAMPLE OF PLOTTING THE PIE CHART
                // Creating an intent to plot Pie chart using dataset and
                // multipleRenderer
                // Intent intent = ChartFactory.getPieChartIntent(getBaseContext(),
                // series, defaultRenderer, "Pie Chart");
                //
                // // Start Activity
                // startActivity(intent);
            } catch (Exception e) {

            }
        }
person Dhaval    schedule 06.05.2014
comment
Это может показаться глупым вопросом, но как мне это реализовать? Это в основном код вместо класса? Где я должен поместить это в свой код? - person alkra_dev; 06.05.2014
comment
Нисколько. Если вы хотите реализовать две круговые диаграммы в одном действии, я предлагаю вам использовать два контейнера (два макета — линейный, относительный, фреймовый, на ваш выбор). Проверьте мой метод, вы увидите макет chartContainer, вызываемый с использованием идентификатора. Теперь вы знаете, как вставить данные в диаграмму? Если нет, то я могу объяснить это вам. - person Dhaval; 06.05.2014
comment
Если вы готовы помочь, пожалуйста, проверьте обновленный вопрос. Я точно объяснил, что я хотел бы сделать и что у меня уже есть (и с чем у меня проблемы). Спасибо. - person alkra_dev; 06.05.2014
comment
Насколько я понимаю, вам нужно отобразить две диаграммы, а это значит, что вам нужно инициализировать два массива. Вам нужно создать два метода — каждый для одной диаграммы — и использовать эти заполненные массивы. - person Dhaval; 06.05.2014
comment
Вы заполняете массивы из БД, что означает, что у вас может быть массив пользовательских объектов. В этом случае проверьте мой ответ, посмотрите, как я назвал значения - person Dhaval; 06.05.2014
comment
Таким образом, я могу в основном создать два массива целых чисел и заполнить их, потому что значения, которые я извлекаю, являются значениями int. Часть, которую я не понимаю, заключается в том, как мне анализировать те массивы, которые я заполнил в классе, с помощью методов, которые я создам. - person alkra_dev; 06.05.2014
comment
К какому классу вы хотите разобрать массивы? - person Dhaval; 06.05.2014
comment
Дайте мне посмотреть, правильно ли я вообще думаю. У меня есть класс PieGraph. Я создаю метод, который в основном создает объект класса PieGraph, этот объект является представлением. Я также хочу проанализировать свой собственный целочисленный массив для объекта, который я создаю, чтобы его можно было использовать для замены массива круговой диаграммы (который задан в классе). - person alkra_dev; 06.05.2014
comment
Не создавайте класс. Используйте его как метод void. Проверьте это: wptrafficanalyzer.in/blog/. В этом блоге есть и другие примеры типов диаграмм. - person Dhaval; 06.05.2014
comment
@Dhaval Можете ли вы помочь мне здесь: заголовок stackoverflow.com/questions/48742359/ - person Tia; 12.02.2018