JFreeChart + JRuby - заполнить область между двумя точками на оси домена - PullRequest
1 голос
/ 23 февраля 2010

Я использую JRuby для доступа к JFreeChart. Но я не могу установить маркер домена на оси даты ... Кто-нибудь может сказать мне, почему это не работает?

def create_plot
    rangeaxis = NumberAxis.new
    rangeaxis.setAutoRangeIncludesZero(true)

    daxis = DateAxis.new
    daxis.setRange( Time.at(@dataset['date_start'].to_i) , Time.at(@dataset['date_end'].to_i) )  

    @plot = XYPlot.new(@datasets.first, daxis, rangeaxis, @base_renderer)
    @plot.setDatasetRenderingOrder(DatasetRenderingOrder::FORWARD)
    @plot.setBackgroundPaint(java.awt.Color.white)

    lol = IntervalMarker.new( 0, 99999999999, java.awt.Color.gray, BasicStroke.new(2.0), java.awt.Color.gray, nil, 1.0 )
    lol.setLabel("ARGH")
    @plot.addDomainMarker(lol)
  end

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

Спасибо за любые ответы!

Ответы [ 2 ]

1 голос
/ 25 февраля 2010

Я нашел лучший пример. Первый, который я дал, был для "CategoryMarker", когда вам нужен более общий маркер. Доменом в этом примере является время, поэтому код устанавливает интервал времени для маркера, чтобы охватить диапазон, а затем устанавливает параметры метки для отображения. Это из примера MarkerDemo2, который использует createXYLineChart. Это должен быть соответствующий код:


        Marker threshold = new ValueMarker(80.0);
        Hour hour1 = new Hour(18, 30, 6, 2005);
        Hour hour2 = new Hour(20, 30, 6, 2005);
        double millis1 = hour1.getFirstMillisecond();
        double millis2 = hour2.getFirstMillisecond();
        Marker cooling = new IntervalMarker(millis1, millis2);
        cooling.setLabelOffsetType(LengthAdjustmentType.EXPAND);
        cooling.setPaint(new Color(150, 150, 255));
        cooling.setLabel("Automatic Cooling");
        cooling.setLabelFont(new Font("SansSerif", Font.PLAIN, 11));
        cooling.setLabelPaint(Color.blue);
        cooling.setLabelAnchor(RectangleAnchor.TOP_LEFT);
        cooling.setLabelTextAnchor(TextAnchor.TOP_RIGHT);
        plot.addDomainMarker(cooling, Layer.BACKGROUND);
Поэтому важно установить IntervalMarker, а затем присоединить его с помощью addDomainMarker. Вы определенно хотите RectangleAnchor
1 голос
/ 23 февраля 2010

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


        CategoryMarker marker = new CategoryMarker("Category 3");
        marker.setPaint(new Color(0xDD, 0xFF, 0xDD, 0x80));
        marker.setAlpha(0.5f);
        plot.addDomainMarker(marker, Layer.BACKGROUND);

Доплата за документацию стоила того, на мой взгляд.

добавлен: Это как раз перед кодом выше. Кажется, позиционирование маркера.

        renderer.setItemLabelsVisible(true);
        ItemLabelPosition p = new ItemLabelPosition(
            ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER, 45.0
        );
        renderer.setPositiveItemLabelPosition(p);
        plot.setRenderer(renderer);
а затем есть этот код, который появляется непосредственно перед вызовом addDomainMarker:
        marker.setLabelAnchor(RectangleAnchor.TOP_LEFT);
        marker.setLabelTextAnchor(TextAnchor.TOP_LEFT);
        marker.setLabelOffsetType(LengthAdjustmentType.CONTRACT);
...