StackableChartLayer (クラス)
public abstract StackableChartLayer {inherits ChartLayer}
パッケージ: CURL.GUI.CHARTS
直接継承しているサブクラス: AreaLayer, LineLayer, BarLayer, BaseScatterLayer

スタック プロットの実装に必要な機能の一部を定義する抽象 ChartLayer サブクラス。

説明

このクラスは、ChartStackingMode をサポートするすべての ChartLayer サブクラスのスーパークラスです。このクラスとは、直接やりとりする必要はありません。

コンストラクタ
default:新しい StackableChartLayer を初期化します。
コンストラクタ protected {StackableChartLayer.default
x-axis-data:#ChartDataSeries = null,
stacking-mode:ChartStackingMode = ChartStackingMode.none,
...
}

プロパティ
generate-y-axes?:この ChartLayer の Y 軸生成を考慮するかどうかを決定します。
アクセサ public StackableChartLayer.generate-y-axes?:bool
stacking-mode:この ChartLayerChartStackingMode
アクセサ public StackableChartLayer.stacking-mode:ChartStackingMode
セッター public StackableChartLayer.stacking-mode:ChartStackingMode
プロパティ 継承 ChartLayer: chart, color-associations, legend-enabled?, legend-entry-factory, style-element, x-axis-data, y-axis-data
プロパティ 継承 Shape: as-Shape, border-color, color, draw-operation, option-parent, selection-context, shape-parent, shape-selectable, stroke-thickness, transformation, visible?
プロパティ 継承 ShapeContainerBase: as-ShapeRoot, shape-children
プロパティ 継承 Visual: _style-element, clonable-class?, completely-clonable-children?, cursor, data-source, display-context, dragee, font-size, input-method-enabled?, input-method-keyboard-mode, name, options, options-present-here, style-class, style-manager, style-options, test-description, test-name, test-parent?, test-type-name, test-visible?, tooltip, user-data
プロパティ 継承 DataBindingTarget: data-binding-context, data-bindings
プロパティ 継承 EventTarget: event-handlers
プロパティ 継承 OptionListInterface: option-register-proc, registered-option-keys

メソッド
append-data-series:プロットされる ChartLayer.y-axis-dataChartDataSeries を追加します。
public {StackableChartLayer.append-data-series}:void
compute-data-min-max:data に関連した最小値と最大値を決定します。
public {StackableChartLayer.compute-data-min-max}:(min:any, max:any)
get-data-mapping:この ChartLayerChartDataSeries の 1 つに対応する ChartDataMapping オブジェクトを取得します。
public {StackableChartLayer.get-data-mapping}:ChartDataMapping
get-inverse-data-mapping:この ChartLayerChartDataSeries の 1 つに対応する ChartInverseDataMapping オブジェクトを取得します。
public final {StackableChartLayer.get-inverse-data-mapping
y-data:ChartDataSeries,
error-if-no-axes?:bool = true
}:#ChartInverseDataMapping
メソッド 継承 ChartLayer: append-color-association, create-legend-entries, detach, draw, get-data-series-from-shape, get-data-series-visibility, get-fill-pattern-for-data-series, get-nearest-record-in-data, get-own-bounds, get-record-at-point, get-record-count, handle-observer-message, maybe-create-x-axis, maybe-create-y-axis-for-series, non-keyword-init-arg, note-color-associations-changed, note-y-axis-data-array-changed, remove-color-association, remove-data-series, self-contains-point?, self-intersects-polygon?, set-data-series-visibility, update-layout
メソッド 継承 Shape: apply-rotation, apply-scale, apply-transformation, apply-translation, apply-translation-in-parent, constrain-own-layout-bounds, constrain-shape-layout-bounds, contains-point?, find-graphical-ancestor, fire-crossing-event, fire-in-child, get-display-context, get-down-orientation-in-shape-parent, get-graphical-root, get-local-device-pixel-size, get-origin-in-graphical-ancestor, get-origin-in-root, get-origin-in-shape-parent, get-origin-in-shape-root, get-own-bounds-in-shape-root, get-own-layout-bounds, get-right-orientation-in-shape-parent, get-shape-bounds, get-shape-bounds-in-shape-root, get-shape-layout-bounds, get-top-left-in-ancestor, get-transformation-to-shape-root, keyword-init-arg, option-change-notify, overdraw-for-selection, quantize-line-thickness, request-draw, request-draw-self, reset-transformation, set-rotation, set-scale, set-transformation, set-translation-in-parent, to-Graphic, transform-from-display-coordinates, transform-from-graphical-root-coordinates, transform-point-from-shape-root, transform-point-to-shape-root, transform-to-display-coordinates, transform-to-graphical-root-coordinates, transform-vector-from-shape-root, transform-vector-to-shape-root, transformation-changed, transformation-changing
メソッド 継承 Observer: observe, stop-observing
メソッド 継承 ShapeContainerBase: add, clear, draw-shape-child, draw-shape-children, get-all-children-at-point, get-child-at-point, get-leaf-at-point, get-shape-root, note-attached, note-detaching, notify-option-children, on-drag-enter, on-pointer-enter, on-pointer-envelope-event, register-options, remove, set-shape-index, set-shape-index-after, set-shape-index-before, shape-container-fire-inferior-crossing-event, shape-container-handle-crossing, shape-container-pick-child, shape-container-pointer-enter-occurred, shape-container-pointer-leave-occurred
メソッド 継承 Visual: add-from-init-args, add-option, add-style-option, animate, change-cursor, clonable-appearance?, clone-appearance, clone-appearance-helper, find-test-children, get-focus-manager, get-layout-context, get-test-parent, get-test-property, get-text, get-view, maybe-fire-attach-event, maybe-fire-detach-event, note-caret-position, on-drag-leave, on-pointer-leave, pop-cursor, prepare-test-object, prepare-test-parent, push-cursor, quantize-width, release-key-focus, remove-option, remove-style-option, request-key-focus, scroll-to-include, test-record, test-run, xy-offset-to
メソッド 継承 GraphicOptions: any-to-Distance
メソッド 継承 GuiEventTarget: handle-event, on-action, on-cancel-mode, on-command-changed, on-commit, on-composition-change-event, on-composition-result-event, on-context-menu-event, on-current-record-change-request, on-current-record-changed, on-destroy-notify, on-destroy-requested, on-drag-over, on-drag-pointer, on-drag-started, on-drop, on-end-composition-event, on-focus-event, on-focus-in, on-focus-out, on-grab-release, on-gui-event, on-input-method-event, on-inspection, on-key-event, on-key-press, on-pointer-button, on-pointer-crossing, on-pointer-event, on-pointer-motion, on-pointer-press, on-pointer-release, on-pointer-scroll, on-raw-key-event, on-raw-key-press, on-raw-key-release, on-reset, on-selectable-added, on-selectable-removed, on-selection-changed, on-selection-context-activated, on-selection-context-deactivated, on-selection-event, on-start-composition-event, on-start-event, on-stop-event, on-view-activate, on-view-deactivate, on-window-close, remove-event-handlers-for-event-class
メソッド 継承 DataBindingTarget: add-data-binding, get-data-binding, refresh-data-binding, remove-data-binding, unset-property, update-data-binding, validate-data-binding
メソッド 継承 EventTarget: accepts-event-class?, add-event-handler, event-handler-present?, remove-event-handler, verify-event
メソッド 継承 OptionListInterface: change-option-parent-notify, clone-options, get-option, get-option-by-name, local-add-notify, local-remove-notify, name-to-option-key, new-option-item, option-changed, option-lookup, option-lookup-here, option-propagate-notify, option-set?, propagate-option-change, remove-styles, set-option-by-name, set-style-option-by-name, unset-option-by-name, unset-style-option-by-name
メソッド 継承 BasicEventTarget: enqueue-event
メソッド 継承 InitRestArgParser: process-rest-args
メソッド 継承 Object: object-describe, object-describe-for-debugging, object-serialize



コンストラクタ詳細
default (コンストラクタ)
protected {StackableChartLayer.default
x-axis-data:#ChartDataSeries = null,
stacking-mode:ChartStackingMode = ChartStackingMode.none,
...
}

新しい StackableChartLayer を初期化します。

x-axis-data: ChartLayer.default を参照してください。
stacking-mode: このグラフの初期 ChartStackingModeChartStackingMode.none 以外のスタッキング モードでは許可されるデータの型に制約が生じることに注意してください。詳細については、StackableChartLayer.stacking-mode を参照してください。
...: ChartLayer.default を参照してください。



プロパティ詳細
generate-y-axes? (アクセサ)
アクセサ public StackableChartLayer.generate-y-axes?:bool

この ChartLayer の Y 軸生成を考慮するかどうかを決定します。

説明

このメソッドは、自動軸生成プロセスによって内部的に呼び出されます。既定では、true が返されますが、一部のレイヤではこれがオーバーライドされます。たとえば、スタッキングをサポートするレイヤ (例については、LineLayer.stacking-mode を参照) では、スタッキング モードが ChartStackingMode.percent の場合、プロットは Y 位置について軸にまったく依存しないので、そのレイヤに対しては Y 軸の要求はありません。


stacking-mode (アクセサ)
アクセサ public StackableChartLayer.stacking-mode:ChartStackingMode
セッター public StackableChartLayer.stacking-mode:ChartStackingMode

この ChartLayerChartStackingMode

説明

このプロパティは、次のように、StackableChartLayer.y-axis-data のメンバの相互の関連性がどのように解釈されるかを定義します。
  • StackableChartLayer.none: 各データ系列は、独自のプロットであり、互いに独立しています。これが既定値になります。
  • StackableChartLayer.stacked: StackableChartLayer.y-axis-data の連続する各メンバは、前のメンバにスタックされます。つまりそのプロット値は、自身の値にそれ以前のプロット値が加わったものになります。
  • StackableChartLayer.percent: データ系列の実際の値をプロットする代わりに、このモードでは、同じレコードにおけるすべてのデータ系列の値の合計に対する値の比率がプロットされます。これらの値は他の値の上にスタックされることにも注意してください。

注意事項

StackableChartLayer.none 以外の値の場合、この ChartLayer に含まれるデータは、いくつかの制約に従う必要があります。StackableChartLayer.y-axis-data のすべての要素は、同じ Domain を使用する必要があります。(つまり、ChartDataSeries.field.domain は同じである必要があります。)これは、すべて同じデータ型を持つことを暗示します。また、データ型は数値型である必要があります。この中には、intdouble などの型、 TimeDistance などの単位を併せ持つ型があります。
データがこれらの制約に従わない場合は、データが変更されるか、スタッキング モードが変更されるたびに、エラーがスローされます。
このプロパティが StackableChartLayer.percent に設定されていると、結果のプロットは、パーセンテージに基づくため、どの Y 軸にも依存しなくなります。StackableChartLayer は、ChartLayer.generate-y-axes? をオーバーライドして、この状態での Y 軸の作成を禁止します。


例: StackableChartLayer.stacking-mode の変更
{import * from CURL.GUI.CHARTS}
{import * from CHARTS-DOC,
    location = "../docstring-support/gui/charts-doc.scurl"
}

{let chart:LayeredChart =
    {LayeredChart
        width = 17cm,
        height = 10cm,
        left-axis-parent =
            {ShapeGroup
                axis-label = "Sales",
                tick-label-factory =
                    {proc {axis:ChartAxis, tick:ChartTick, tick-rotation:Angle}:any
                        let constant val:double = tick.value asa double
                        {return
                            {if val >= 1e9 then
                                {format "%gB", val / 1e9}
                             elseif val >= 1e6 then
                                {format "%gM", val / 1e6}
                             else
                                {format "%g", val}
                            }
                        }
                    }
            },
        {BarLayer
            sample-sales-records,
            "north-america-sales",
            "europe-sales",
            "asia-sales",
            "service-revenue",
            x-axis-data = {ChartDataSeries sample-sales-records, "period"}
        }
    }
}

{value chart}

{RadioFrame
    {HBox
        spacing = 4pt,
        {RadioButton radio-value = ChartStackingMode.none, value = true},
        {RadioButton radio-value = ChartStackingMode.stacked},
        {RadioButton radio-value = ChartStackingMode.percent}
    },
    {on ValueFinished at rf:RadioFrame do
        let constant layer:BarLayer = chart.layers[0] asa BarLayer
        set layer.stacking-mode = rf.value asa ChartStackingMode
    }
}





メソッド詳細
append-data-series (メソッド)
public {StackableChartLayer.append-data-series}:void

プロットされる ChartLayer.y-axis-dataChartDataSeries を追加します。

data: 追加される ChartDataSeries

説明

詳細については、ChartLayer.y-axis-data を参照してください。


compute-data-min-max (メソッド)
public {StackableChartLayer.compute-data-min-max}:(min:any, max:any)

data に関連した最小値と最大値を決定します。

data: 検証する ChartDataSeries。これは ChartLayer.y-axis-data のメンバである必要があります。

戻り値

最小値と最大値。非 null の値がデータに存在しない場合は、これらの値の両方が null であることに注意してください。それ以外の場合は、どちらも null ではありません。

説明

このメソッドは通常、ChartDataSeries.compute-min-max を呼び出すためにだけ実装されます。ただし、プロットが考慮されるように、計算を拡張できます。たとえば、スタッキング棒グラフを扱う場合、実際のスタック データの値が考慮されます。これが ChartDataSeries.compute-min-max ではなく、このメソッドを呼び出す理由です。


get-data-mapping (メソッド)
public {StackableChartLayer.get-data-mapping}:ChartDataMapping

この ChartLayerChartDataSeries の 1 つに対応する ChartDataMapping オブジェクトを取得します。

y-data: マッピングが有効になっている ChartDataSeries。このオブジェクトは ChartLayer.y-axis-data のメンバでなければなりません。

戻り値

このレイヤおよび指定されたデータ系列の ChartDataMapping オブジェクト。

説明

ChartDataMapping により、ChartDataMapping.get-position を使用して指定のレコードの空間位置を簡単に決定できます。これは一般的に、Shape オブジェクトをそのプロットの一部として位置付ける場合に、ChartLayer の実装によって使用されます。
返される位置は、座標内でプロット エリアに対して相対的であることに注意してください。下の例では、座標は ShapeChartLayer 自体に追加するためにそのまま使用されます。すべての ChartLayer がプロット エリアの原点を自身の原点としてもっているので、これは有効です。
座標を Chart に対して相対的としたい場合は、LayeredChart.plot-area.transformation.transform を使用してこれを実現できます。
ChartLayer.get-inverse-data-mapping も参照してください。

注意事項

このメソッドは、レイアウトがペンディングである場合、ある程度のグラフ レイアウト処理が即時に実行されます。データ マッピングは有効な軸がないと決定されないため、LayeredChart.ensure-axes-valid が常に呼び出されます。
グラフの軸またはこのレイヤのデータ系列を変更する後続の操作 (スタッキング モードを変更する操作など) は、ChartDataMapping オブジェクトを無効化することに注意してください。このオブジェクトを使用すると、意味のない結果が作成されます。最善の策は、これらのオブジェクトを保持しないで、必要になった時点でこのメソッドを用いてこれらのオブジェクトを取得することです。


例: ChartDataMapping を使用しての Shape のグラフへの追加
{import * from CURL.GUI.CHARTS}
{import * from CHARTS-DOC,
    location = "../docstring-support/gui/charts-doc.scurl"
}

{let chart:LayeredChart =
    {LayeredChart
        width = 15cm,
        height = 6cm,
        {BarLayer
            sample-records,
            "Age",
            x-axis-data = {ChartDataSeries sample-records, "Name"}
        },
        {LineLayer
            sample-records,
            "Wins"
        },
        {on ChartLayoutChanged do
            || Give big winners a gold diamond
            let constant layer:ChartLayer = chart.layers[1]
            let constant map:ChartDataMapping =
                {layer.get-data-mapping layer.y-axis-data[0]}


            let index:int = 0
            {for record in sample-records do
                {if record["Wins"] asa int >= 6 then
                    let constant (pos:Distance2d, y-was-null?:bool) =
                        {map.get-position record, index}
                    
                    {if not y-was-null? then
                        || Don't add shapes for records with null values.
                        let constant size:Distance =
                            3 * {sqrt 2} * {layer.get-display-context}.pixel-size
                        {layer.add
                            {RectangleShape
                                {GRect size, size, size, size},
                                translation = pos,
                                rotation = 45deg,
                                color = "gold",
                                tooltip =
                                    {Tooltip
                                        {format
                                            "%s got %d wins!",
                                            record["Name"],
                                            record["Wins"]
                                        }
                                    }
                            }
                        }
                    }
                }
                
                {inc index}
            }
        }
    }
}

{value chart}


get-inverse-data-mapping (メソッド)
public final {StackableChartLayer.get-inverse-data-mapping
y-data:ChartDataSeries,
error-if-no-axes?:bool = true
}:#ChartInverseDataMapping

この ChartLayerChartDataSeries の 1 つに対応する ChartInverseDataMapping オブジェクトを取得します。

y-data: マッピングが有効になっている ChartDataSeries。このオブジェクトは ChartLayer.y-axis-data のメンバでなければなりません。
error-if-no-axes?:
y-data に一致する軸が見つからない場合 (LayeredChart.get-best-match-x-axis および LayeredChart.get-best-match-y-axis を参照)、ChartInverseDataMapping オブジェクトは作成されません。
これが起こり、error-if-no-axes? が true であると、エラーがスローされます。error-if-no-axes? が false の場合は、代わりに null が返されます。

戻り値

このレイヤおよび指定されたデータ系列の ChartInverseDataMapping オブジェクト (作成可能な場合)。null が返されるのは、y-data と一致する軸がない場合、および error-if-no-axes? が false の場合に限られます。

説明

ChartInverseDataMapping により、指定した空間位置に対応する X 値と Y 値を簡単に判断できます。たとえば、これを使用して、ユーザーの入力に応じて RecordSet 内でデータを追加したり、データを変更したりできます。
ChartInverseDataMapping.get-valuesLayeredChart の座標空間内に座標を必要とするので、以下の例のように、イベント ハンドラをグラフ自体にアタッチすると、これが与えられます。
ChartLayer.get-data-mapping も参照してください。

注意事項

このメソッドは、レイアウトがペンディングである場合、ある程度のグラフ レイアウト処理が即時に実行されます。データ マッピングは有効な軸がないと決定されないため、LayeredChart.ensure-axes-valid が常に呼び出されます。
グラフの軸またはこのレイヤのデータ系列を変更する後続の操作 (スタッキング モードを変更する操作など) は、ChartInverseDataMapping オブジェクトを無効化することに注意してください。このオブジェクトを使用すると、意味のない結果が作成されます。最善の策は、これらのオブジェクトを保持しないで、必要になった時点でこのメソッドを用いてこれらのオブジェクトを取得することです。
必ずしもグラフのすべての構成で完全な逆マッピングを作成できるわけではないことにも注意してください。スタッキングを使用するどのグラフでも (ChartStackingMode.stackedChartStackingMode.percent のいずれか)、X 軸専用 ChartInverseDataMapping が返されます。この場合、Y 値は null となります。


例: 次の使用: ChartInverseDataMapping
{import * from CURL.GUI.CHARTS}
{import * from CHARTS-DOC,
    location = "../docstring-support/gui/charts-doc.scurl"
}

{let bar-display:TextDisplay = {TextDisplay width = 4cm}}
{let line-display:TextDisplay = {TextDisplay width = 4cm}}

{let chart:LayeredChart =
    {LayeredChart
        width = 15cm,
        height = 6cm,
        {BarLayer
            sample-records,
            "Age",
            x-axis-data = {ChartDataSeries sample-records, "Name"}
        },
        {LineLayer
            sample-records,
            "Wins"
        },
        {on e:PointerMotion do
            let layer:ChartLayer = chart.layers[0]
            let inverse-mapping:ChartInverseDataMapping =
                {non-null {layer.get-inverse-data-mapping layer.y-axis-data[0]}}
            let (x:any, y:any) = {inverse-mapping.get-values e.x, e.y}
            set bar-display.value = x & ", " & y

            set layer = chart.layers[1]
            set inverse-mapping =
                {non-null {layer.get-inverse-data-mapping layer.y-axis-data[0]}}
            set (x, y) = {inverse-mapping.get-values e.x, e.y}
            set line-display.value = x & ", " & y
        }
    }
}

{Table
    cell-border-width = 1pt,
    cell-border-color = FillPattern.silver,
    {row-prototype
        font-weight = FontWeight.bold,
        {text BarLayer (Age)},
        {text LineLayer (Wins)}
    },
    {row-prototype bar-display, line-display},
    {row-prototype
        {cell-prototype
            colspan = 2,
            chart
        }
    }
}