Как создать диаграмму с динамическим количеством линий?

Добрый день! Возникла необходимость генерации SerialChart в контроллере. В ходе работы над этой задачей столкнулся с проблемой, что нужно указывать конкретные столбцы в valueField. Как быть если заранее число графиков, которые будут отображены неизвестно? Важно, что нужен именно SerialChart, например сделать через dataSet’ы в StockChart не подходит. (И раз уж заикнулся, как настроить compare сетов данных? Чтобы не в процентах была шкала)

Добрый день.

Для схожей задачи делаем следующее:
Принимаем данные для чарта (List<Map> points), далее для каждого ключа создаем граф:

points.get(0).keySet().forEach(valueFIeld -> {
            if (!valueFIeld.equals(categoryField)) {
                Graph newGraph = new Graph();
                newGraph.setValueField(valueFIeld );
                /*...*/
                chart.addGraphs(newGraph);

Соответственно, в DataProvider отправляются точки с теми же названиями филдов.

1 симпатия

Здравствуйте!

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

Простой пример:
XML:

<charts:serialChart id="serialChart"
                    height="100%"
                    width="100%">
    <charts:legend/>
</charts:serialChart>

Контроллер экрана:

private List<CountryData> countryDataList = new ArrayList<>();

public static final String CATEGORY_FIELD = "country";

@Inject
private SerialChart serialChart;

@Override
public void init(Map<String, Object> params) {
    countryDataList.add(new CountryData("Country 1", 1211));
    countryDataList.add(new CountryData("Country 2", 1092));

    serialChart.setCategoryField(CATEGORY_FIELD);

    DataProvider dataProvider = new ListDataProvider();

    for (CountryData data : countryDataList) {
        MapDataItem item = new MapDataItem();

        item.add(CATEGORY_FIELD, data.getName()); // значение для поля категории
        item.add(data.getName(), data.getPopulation()); // значение для графа

        dataProvider.addItem(item);
        serialChart.addGraphs(createGraph(data));
    }
    serialChart.setDataProvider(dataProvider);
}

private Graph createGraph(CountryData data) {
    Graph graph = new Graph();
    graph.setType(GraphType.COLUMN);
    graph.setFillAlphas(1.0);
    graph.setTitle(data.getName());
    graph.setValueField(data.getName());
    return graph;
}

Чтобы сравнение DataSet-ов было не в процентах, нужно в StockPanel свойство recalculateToPercents установить в “never”.

2 симпатии