Основываясь на приведенном ниже наборе результатов, я создал столбчатую диаграмму. Они были преобразованы в список объектов с 4 атрибутами (называемый SKUQtyMetric — все являются строками, кроме Quantity as Integer)

Resultset from Database

При преобразовании этого в стековую диаграмму я не мог заставить второй элемент появляться рядом с первым элементом в каждом из x-тиков (X представляет час). Если я не ошибаюсь, должно быть только четыре объекта DataSeries, каждый из которых представляет выход, а затем выполняет внутренний цикл. В качестве примечания: каждая розетка обозначается цветом, даже если имеется более одного элемента (я сохраняю ограничение в три элемента для выбора для поиска в базе данных), поэтому ниже приведен код outletFromH .

Текущий рендеринг кода (с использованием Vaadin Charts 4) выглядит следующим образом:

Map<String, Set<String>> myMaps = new HashMap<String, Set<String>>();
        for (SkuQtyMetric item : objList) {
            if (!myMaps.containsKey(item.getOutletName())) {
                myMaps.put(item.getOutletName(), new HashSet<String>());
            }
            myMaps.get(item.getOutletName()).add(item.getItemName());
        }
        String asgnColor = "#ffcccc";
        for(Map.Entry<String, Set<String>> map: myMaps.entrySet()) {
            DataSeries dataSeries = new DataSeries(map.getKey()+"");
            PlotOptionsColumn plotOptions = new PlotOptionsColumn();
            plotOptions.setStacking(Stacking.NORMAL);
            DataLabels labels = new DataLabels(true);
            Style style = new Style();
            style.setFontSize("9px");
            style.setTextShadow("0 0 3px black");
            labels.setStyle(style);
            labels.setColor(new SolidColor("white"));
            plotOptions.setDataLabels(labels);
            ls.add(dataSeries);

            for(String itemName: map.getValue()) {
                System.out.println("Inside " + map.getKey() + ", value is: " + itemName);
                dataSeries.setId(itemName);
                for(SkuQtyMetric metric : objList) {
                    for (Map.Entry<String, String> outletfromH : Constant.SYCARDA_COLOR.entrySet()) {
                        if (outletfromH.getKey().equalsIgnoreCase(map.getKey())) {
                            asgnColor = outletfromH.getValue();
                        }
                    }
                    System.out.println("DataSeries Id: " + dataSeries.getId() + " , Item metric name is: "+metric.getItemName());
                    if(dataSeries.getName().equalsIgnoreCase(metric.getOutletName())) {
                        if(dataSeries.getId().equalsIgnoreCase(metric.getItemName())) {
                            DataSeriesItem dataSeriesItem = new DataSeriesItem(xFor(metric.getHourNumber()), metric.getQuantityAmt());
                            dataSeriesItem.setId(metric.getItemName()+"_setSeriesId");
                            dataSeriesItem.setColor(new SolidColor(asgnColor));

                            dataSeries.setStack(metric.getItemName());
                            plotOptions.setColor(new SolidColor(asgnColor));
                            dataSeries.setPlotOptions(plotOptions);
                            dataSeries.add(dataSeriesItem);
                        }
                    }
                }
            }
        }


        for (int j = 0; j < ls.size(); j++) {
            listSeries.add(ls.get(j));
        }

        chart.getConfiguration().getSubTitle().setText(subpageName);
        chart.getConfiguration().setSeries(listSeries);

При рендеринге я мог получить только этот результат:

Current chart

Это текущая диаграмма, но отсутствует второй элемент (кокосовая вода), показанный красными каракулями. В чем я не уверен, так это в том, что мой класс Map ИЛИ мои контролируемые объекты списка неверны ИЛИ может быть, что должно быть восемь, а не четыре DataSeries (каждый из которых является выходом и продуктом). Если нет, есть ли более эффективный способ обработки кода для отображения диаграммы, чем то, что я делаю сейчас?

0
Melvin Mah 15 Дек 2019 в 10:37

1 ответ

Должна быть возможность иметь несколько DataSeriesItem в одной серии, которые входят в один и тот же стек. Четырех рядов должно быть достаточно, не обязательно иметь 8. Вы можете сделать это, задав имя DataSeriesItem и задав тип XAxis для категории, чтобы категории вычислялись из имен точек. Или задав числовые значения X для DataSeriesItem и задав категории для XAxis как String[].

Наличие отдельных рядов упрощает некоторые вещи, такие как всплывающие подсказки и отображение/скрытие данных из легенды. Но теоретически все может быть в одной серии.

В некоторых случаях вам может потребоваться убедиться, что данные отсортированы по значению X или по имени, если вы используете имя в качестве категории, иначе некоторые точки могут отображаться неправильно, вы можете проверить, ваш ли это случай, проверив консоль браузера на наличие ошибок или предупреждения об этом.

0
Guille 9 Июл 2020 в 19:05