提问者:小点点

Vaadin 图表:第二个和后续项目不会显示在柱形堆栈图的每个 X 刻度上


根据下面的结果集,我创建了一个列堆栈图。它们已转换为一个4属性对象列表(称为SKUQtyMetric-除数量为整数外,所有都是字符串)

将其转换为堆栈图时,我无法让第二个项目出现在每个 x 刻度中的第一个项目旁边(X 代表小时)。如果我没记错的话,应该只有四个 DataSeries 对象,每个对象代表一个出口,然后执行一个内部循环。作为旁注,即使有多个项目,每个插座也被指定了一种颜色(我限制选择三个项目在数据库中搜索),因此下面是 outletFromH 代码。

代码的当前呈现(使用Vaadin图表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 位于同一堆栈中。四个系列应该足够了,不需要有八个。您可以通过设置 DataSeriesItem 的名称并将 XAxis 类型设置为类别来执行此操作,以便从点名称计算类别。或者通过将数字 X 值设置为 DataSeriesItem 并将类别设置为 XAxis 作为 String[]。

拥有独立的系列使一些事情变得更容易,比如工具提示,以及显示/隐藏图例中的数据。但是理论上所有的东西都可以在一个系列中。

在某些情况下,您可能需要确保数据按X值排序,或者按名称(如果您将名称用作类别)排序,否则某些点可能无法正确显示,您可以通过检查浏览器控制台是否存在错误或警告来检查这是否是您的情况。