Как добавить метки горизонтальных линий в конце строки при использовании нескольких графиков в Roassal3

Я пытаюсь использовать Roassal3 в Pharo 10 для визуализации нескольких рядов данных. Мне удалось хорошо нарисовать диаграмму, но я хочу пометить линии. Я попытался использовать RSLegend для отображения текста с соответствующими цветными полями (соответствующими цветам линий), но они получаются слишком большими и в конечном итоге сжимают график, чтобы он соответствовал холсту. Если бы я мог манипулировать легендами, чтобы они отображались по-разному, это помогло бы, но я помню, как видел пример с использованием более ранней версии Roassal, которая отображает метку для каждой строки в конце строки. Это было бы идеально, поэтому я попытался добавить RSLabel в качестве маркера End для сюжета. Это сработало, за исключением того, что все метки выходили под разными углами (предположительно, под углом сюжетных линий в конце). Как я могу заставить метки конечных маркеров отображаться горизонтально? Документация по Roassal3 все еще находится в стадии разработки, поэтому я не могу найти примеров.

Я обновил пример кода, чтобы показать, что я пробовал с конечными маркерами, легендами и декораторами (ни один из них не идеален, но я могу работать с декораторами):

      | chart plot dates values firstDate labels legend offset plotLabel renderedLabel canvasCopy |
chart := RSChart new.
canvasCopy := chart canvas copy.
dates := (20 to: 1 by: -1) collect: [ :i | Date today subtractDays: i ]. 
firstDate := dates first.
offset := 20 @ -50.
values := #(
    #(4.29 4.01 3.82 3.91 4.01 3.73 4.47 4.28 4.18 4.00 3.72 4.27 3.99 4.91 5.09 4.91 5.09 4.91 4.44 4.91)
    #(2.0 1.98 1.98 1.98 1.99 1.96 2.07 1.96 1.90 1.95 1.98 2.04 2.12 2.12 2.21 2.27 2.27 2.10 2.19 1.95)
    ).
labels := #('series 1' 'series 2').
values with: labels do: [ :series :label | 
   plot := RSLinePlot new markerEnd: (RSLabel new text: label).
   plot 
       x: (dates collect: [ :date | date julianDayNumber - firstDate julianDayNumber ])
       y: series.
   chart addPlot: plot.
    plotLabel := RSYLabelDecoration new right; 
        title: '~' , label;
        fontSize: 12;
        rotationAngle: 90;
        color: (chart colorFor: plot);
        offset: offset;
        yourself.
    chart addDecoration: plotLabel.
    renderedLabel := (plotLabel copy renderIn: canvasCopy) label.
    offset := (0 - renderedLabel textWidth) @ (offset y + renderedLabel textHeight + 4). 
 ].
canvasCopy shapes copy do: [ :shape | canvasCopy removeShape: shape ].
chart addDecoration: (RSHorizontalTick new labelConversion: [ :value | 
    Date julianDayNumber: firstDate julianDayNumber + value ]; useDiagonalLabel; yourself).
chart addDecoration: RSVerticalTick new.
chart ylabel: 'The values'.
chart build.
legend := RSLegend new.
legend container: chart canvas.
labels with: chart plots do: [ :c : p |
    legend text: c withBoxColor: (chart colorFor: p) ].
legend layout horizontalCompactTree .
legend build.
^chart canvas open

1 ответ

Я создал проблему в репозитории roassal3. Совет от Александра Бергеля хорош, но я думаю, что все должно быть проще.

Например вот так

      
dates := (10 to: 1 by: -1) collect: [ :i | Date today subtractDays: i ]. 
values := #(
    #(3.72 4.27 3.99 4.91 5.09 4.91 5.09 4.91 4.44 4.91)
    #(4.29 4.01 3.82 3.91 4.01 3.73 4.47 4.28 4.18 4.00)
    #(1.98 2.04 2.12 2.12 2.21 2.27 2.27 2.10 2.19 1.95)
    #(2.5 2.3 2.7 2.73 2.15 2.6 2.63 2.57 2.4 2.8)
    #(2.0 1.98 1.98 1.98 1.99 1.96 2.07 1.96 1.90 1.95)
    ).

labels := #('first series' 'second series' 'series number 4' 'the third series' 'a fifth series').
chart := (values with: labels collect: [ :series :label | 
   plot := RSLinePlot new.
    plot label: '~' , label.
   plot 
       x: dates
       y: series.
   
 ]) asCombinePlot.
chart withLineSpineAxis. 
chart ylabel: 'The values'.
chart legend layout grid.
chart

Другие вопросы по тегам