AndroidPlot: Как я могу изменить данные домена?

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

Более конкретно, эта строка:

mySimpleXYPlot.setDomainValueFormat(new DecimalFormat("#"));

На веб-сайте сказано, что я могу использовать другие форматы, и это правда, но если я использую, например:

SimpleDateFormat("dd-MM-yyyy")

На диаграмме отображается "31-12-1969" во всех значениях домена.

Кто-нибудь знает, как я могу изменить эту дату? или использовать другой формат (например, String)?


person fmgh    schedule 21.07.2011    source источник


Ответы (1)


Поздний ответ, но, возможно, будет полезен другим людям.

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

  • брать только ось Y для значений и оставлять ось X в качестве индексов в массиве (как предлагает учебник Androidplot, используйте использование ArrayFormat.Y_VALS_ONLY, // Y_VALS_ONLY означает использование индекса элемента в качестве значения x)
  • каждый раз, когда ваши данные меняются, вам нужно передать на график новый форматер с вашими новыми данными для оси X

Вот несколько фрагментов кода.

Во-первых, это класс, который преобразует индекс массива в пользовательскую строку метки:

public class MyIndexFormat extends Format {

    public String[] Labels = null;

        @Override
        public StringBuffer format(Object obj, 
                StringBuffer toAppendTo, 
                FieldPosition pos) {

            // try turning value to index because it comes from indexes
            // but if is too far from index, ignore it - it is a tick between indexes
            float fl = ((Number)obj).floatValue();
            int index = Math.round(fl);
            if(Labels == null || Labels.length <= index ||
                    Math.abs(fl - index) > 0.1)
                return new StringBuffer("");    

            return new StringBuffer(Labels[index]); 
        }

И вот как я прикрепляю его к сюжету:

MyIndexFormat mif = new MyIndexFormat ();
mif.Labels = // TODO: fill the array with your custom labels

// attach index->string formatter to the plot instance
pricesPlot.getGraphWidget().setDomainValueFormat(mif); 

Этот трюк работает и для динамических обновлений.

ВНИМАНИЕ: Androidplot, похоже, имеет проблемы с отрисовкой горизонтальных линий, поэтому, если ваши данные имеют одинаковые значения Y, вы можете получить странные результаты, я уже обращался за помощью по этому вопросу.

person JustAMartin    schedule 03.02.2012
comment
@ Мартин, что-нибудь о проблеме с горизонтальной линией? Для тех, кто не знает, если вы строите горизонтальную линию (скажем, все значения y на графике равны 0), график не будет отображаться на графике, но если у вас есть другой график, который не является горизонтальной линией, появится горизонтальная линия. - person whyoz; 06.02.2014