Основываясь на приведенном ниже наборе результатов, я создал столбчатую диаграмму. Они были преобразованы в список объектов с 4 атрибутами (называемый SKUQtyMetric — все являются строками, кроме Quantity as Integer)
При преобразовании этого в стековую диаграмму я не мог заставить второй элемент появляться рядом с первым элементом в каждом из 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);
При рендеринге я мог получить только этот результат:
Это текущая диаграмма, но отсутствует второй элемент (кокосовая вода), показанный красными каракулями. В чем я не уверен, так это в том, что мой класс Map ИЛИ мои контролируемые объекты списка неверны ИЛИ может быть, что должно быть восемь, а не четыре DataSeries (каждый из которых является выходом и продуктом). Если нет, есть ли более эффективный способ обработки кода для отображения диаграммы, чем то, что я делаю сейчас?
1 ответ
Должна быть возможность иметь несколько DataSeriesItem в одной серии, которые входят в один и тот же стек. Четырех рядов должно быть достаточно, не обязательно иметь 8. Вы можете сделать это, задав имя DataSeriesItem и задав тип XAxis для категории, чтобы категории вычислялись из имен точек. Или задав числовые значения X для DataSeriesItem и задав категории для XAxis как String[].
Наличие отдельных рядов упрощает некоторые вещи, такие как всплывающие подсказки и отображение/скрытие данных из легенды. Но теоретически все может быть в одной серии.
В некоторых случаях вам может потребоваться убедиться, что данные отсортированы по значению X или по имени, если вы используете имя в качестве категории, иначе некоторые точки могут отображаться неправильно, вы можете проверить, ваш ли это случай, проверив консоль браузера на наличие ошибок или предупреждения об этом.
Похожие вопросы
Новые вопросы
vaadin
Используйте тег [vaadin] для всех сообщений, касающихся любого использования платформы разработки веб-приложений Vaadin. Для постов, связанных с конкретным Vaadin или конкретным компонентом, дополнительно пометьте пост соответствующим тегом, например: [vaadin8] и [vaadin-upload] соответственно.