Pantrix UI

Waterfall Chart

Bir şelale grafiği: bir miktarın adım adım nasıl oluştuğu. Her çubuk bir öncekinin bittiği yerden başlar; satırın eklediği kadar yukarı, götürdüğü kadar aşağı gider. Bir toplam sıfırın üstünde durur ve kendinden önceki adımların vardığı yeri gösterir.

import com.pantrixui.components.chart.waterfall.PantrixWaterfallChart

Örnekler

Açılıştan kapanışa

Bir çeyreğin nakit akışı: açılış tutarı, gelirler, giderler ve kapanış. Açılış, kendi değeri olan bir toplamdır: sayım ondan başlar. Kapanışın değeri yoktur: adımların vardığı yeri gösterir.

İmleci bir çubuğun üstüne getir ya da çubuğa dokun: tooltip adımı işaretiyle yazar. Çubukların arasındaki ince çizgiler her adımın bir öncekinin bittiği yerden başladığını gösterir.

PantrixWaterfallChart(
    data = QUARTER_CASH,
    x = { it.name },
    y = { it.amount },
    name = "Nakit (bin TL)",
    total = { it.total },
    description = "Bir çeyreğin nakit akışı, açılıştan kapanışa",
    tagKey = "plain"
)

private data class CashMove(
    val name: String,
    val amount: Int?,
    val total: Boolean = false
)

private val QUARTER_CASH = listOf(
    CashMove("Açılış", amount = 420, total = true),
    CashMove("Satış", amount = 310),
    CashMove("Hizmet", amount = 120),
    CashMove("Maaş", amount = -260),
    CashMove("Kira", amount = -90),
    CashMove("Vergi", amount = -70),
    CashMove("Kapanış", amount = null, total = true)
)

Ara toplamlar

Yolun ortasında ara toplamlar: her çeyreğin sonunda, o ana kadar varılan yer. Ara toplam sıfırın üstünde durur ve sayım ondan sonra kaldığı yerden sürer.

PantrixWaterfallChart(
    data = HALF_YEAR_CASH,
    x = { it.name },
    y = { it.amount },
    name = "Nakit (bin TL)",
    total = { it.total },
    description = "Bir yarıyılın aylık nakit değişimi, çeyrek sonlarında ara toplamla",
    tagKey = "subtotals"
)

private data class CashMove(
    val name: String,
    val amount: Int?,
    val total: Boolean = false
)

private val HALF_YEAR_CASH = listOf(
    CashMove("Oca", amount = 180),
    CashMove("Şub", amount = -60),
    CashMove("Mar", amount = 140),
    CashMove("1. çeyrek", amount = null, total = true),
    CashMove("Nis", amount = -110),
    CashMove("May", amount = 90),
    CashMove("Haz", amount = 210),
    CashMove("2. çeyrek", amount = null, total = true)
)

Değerler çubukların ucunda

Her çubuğun neyi gösterdiği ucuna yazılır (labels): ekleyen adımın üstüne, götüren adımın altına, işaretiyle; toplamın üstüne, olduğu gibi.

Yeri olmayan etiket atlanır; değer tooltip'te ve ekran okuyucuda durur.

PantrixWaterfallChart(
    data = QUARTER_CASH,
    x = { it.name },
    y = { it.amount },
    name = "Nakit (bin TL)",
    total = { it.total },
    labels = ChartDataLabels(),
    description = "Bir çeyreğin nakit akışı, değerleriyle",
    tagKey = "labels"
)

private data class CashMove(
    val name: String,
    val amount: Int?,
    val total: Boolean = false
)

private val QUARTER_CASH = listOf(
    CashMove("Açılış", amount = 420, total = true),
    CashMove("Satış", amount = 310),
    CashMove("Hizmet", amount = 120),
    CashMove("Maaş", amount = -260),
    CashMove("Kira", amount = -90),
    CashMove("Vergi", amount = -70),
    CashMove("Kapanış", amount = null, total = true)
)

Yatay

Aynı çeyrek yatay (horizontal = true): kalemler grafiğin yanından aşağı dizilir ve her çubuk üstündekinin bittiği yerden başlar. Kalemlerin adları uzun ya da kalemler çok olduğunda yatay şelale daha kolay okunur.

PantrixWaterfallChart(
    data = QUARTER_CASH,
    x = { it.name },
    y = { it.amount },
    name = "Nakit (bin TL)",
    total = { it.total },
    horizontal = true,
    labels = ChartDataLabels(),
    description = "Bir çeyreğin nakit akışı, yatay çubuklarla",
    tagKey = "horizontal_steps"
)

private data class CashMove(
    val name: String,
    val amount: Int?,
    val total: Boolean = false
)

private val QUARTER_CASH = listOf(
    CashMove("Açılış", amount = 420, total = true),
    CashMove("Satış", amount = 310),
    CashMove("Hizmet", amount = 120),
    CashMove("Maaş", amount = -260),
    CashMove("Kira", amount = -90),
    CashMove("Vergi", amount = -70),
    CashMove("Kapanış", amount = null, total = true)
)

Kendi renklerin

Adımların iki rengi grafiğin renklerinden gelir (ChartColors'ın rising ve falling alanları), toplamların rengi serinin kendisinden (color). Anahtarı çevir: çubukların arasındaki çizgiler kalkar (connectors).

Renk tek başına anlam taşımamalı: bir adımın yönü çubuğun nereden nereye gittiğinden ve değerinin işaretinden de okunur.

var connectors by remember { mutableStateOf(true) }
val theme = PantrixTheme.colors
PantrixSwitchButton(
    checked = connectors,
    onCheckedChange = { connectors = it },
    label = "Bağlantı çizgileri",
    tagKey = "waterfall_connectors"
)
PantrixWaterfallChart(
    data = QUARTER_CASH,
    x = { it.name },
    y = { it.amount },
    name = "Nakit (bin TL)",
    total = { it.total },
    connectors = connectors,
    color = theme.neutral.color,
    colors = ChartColors(rising = theme.info.color, falling = theme.warning.color),
    description = "Bir çeyreğin nakit akışı, kendi renkleriyle",
    tagKey = "own_colors"
)

private data class CashMove(
    val name: String,
    val amount: Int?,
    val total: Boolean = false
)

private val QUARTER_CASH = listOf(
    CashMove("Açılış", amount = 420, total = true),
    CashMove("Satış", amount = 310),
    CashMove("Hizmet", amount = 120),
    CashMove("Maaş", amount = -260),
    CashMove("Kira", amount = -90),
    CashMove("Vergi", amount = -70),
    CashMove("Kapanış", amount = null, total = true)
)

Bir adıma basmak

Bir basış adımı ve başladığı seviyeyi alır: noktanın value'su adımın eklediği, from'u adımın başladığı seviyedir; ikisinin toplamı adımdan sonra varılan yerdir. Toplamın from'u yoktur. Bir çubuğa bas: alttaki satır basılanı yazar.

var pressed by remember { mutableStateOf<String?>(null) }
val strings = PantrixTheme.strings
PantrixWaterfallChart(
    data = QUARTER_CASH,
    x = { it.name },
    y = { it.amount },
    name = "Nakit (bin TL)",
    total = { it.total },
    onSelect = { point ->
        val start = point.from
        pressed = if (start == null) {
            "${point.label}: toplam ${point.text}"
        } else {
            "${point.label}: ${point.text}, sonrasında ${strings.decimal(start + point.value)}"
        }
    },
    description = "Bir çeyreğin nakit akışı",
    tagKey = "press"
)
PantrixText(text = pressed ?: "Bir çubuğa bas")

private data class CashMove(
    val name: String,
    val amount: Int?,
    val total: Boolean = false
)

private val QUARTER_CASH = listOf(
    CashMove("Açılış", amount = 420, total = true),
    CashMove("Satış", amount = 310),
    CashMove("Hizmet", amount = 120),
    CashMove("Maaş", amount = -260),
    CashMove("Kira", amount = -90),
    CashMove("Vergi", amount = -70),
    CashMove("Kapanış", amount = null, total = true)
)

Uzun yazılış

Kısa yazılışın açtığı grafik: tek bir WaterfallSeries taşıyan bir PantrixChart. Kısa yazılışın horizontal = true'su uzun yazılışta orientation = ChartOrientation.Horizontal'dır; seri anahtarını ve adını kendisi taşır. Şelaleyi başka şeylerle bir arada isteyen ekran bu yazılışı kullanır: burada kapanış hedefini gösteren bir çizgi.

PantrixChart(
    series = listOf(
        WaterfallSeries(
            key = "cash",
            name = "Nakit (bin TL)",
            data = QUARTER_CASH,
            x = { it.name },
            y = { it.amount },
            total = { it.total }
        )
    ),
    orientation = ChartOrientation.Horizontal,
    marks = listOf(ChartReferenceLine(y = 500, label = "Hedef")),
    description = "Bir çeyreğin nakit akışı ve kapanış hedefi, yatay çubuklarla",
    tagKey = "as_series"
)

private data class CashMove(
    val name: String,
    val amount: Int?,
    val total: Boolean = false
)

private val QUARTER_CASH = listOf(
    CashMove("Açılış", amount = 420, total = true),
    CashMove("Satış", amount = 310),
    CashMove("Hizmet", amount = 120),
    CashMove("Maaş", amount = -260),
    CashMove("Kira", amount = -90),
    CashMove("Vergi", amount = -70),
    CashMove("Kapanış", amount = null, total = true)
)

API

data

Bir şelale grafiği: bir miktarın adım adım nasıl oluştuğu. Her çubuk bir öncekinin bittiği yerden başlar; satırın eklediği kadar yukarı, götürdüğü kadar aşağı gider. Bir toplam sıfırın üstünde durur ve kendinden önceki adımların vardığı yeri gösterir.

ParametreTürVarsayılanNe olduğu
dataList<T>satırlar, adımlarının sayıldığı sırayla.
x(T) -> Anybir satırın grafik boyunca nerede durduğu: bir ad, bir gün, kendisine eşit olan herhangi bir şey.
y(T) -> Number?bir satırın eklediği, sıfırın altındaysa götürdüğü, ya da değeri yoksa null. Bir toplam için, sayımın yeniden başladığı tutar, ya da kendinden önceki adımların vardığı yer için null.
nameStringtutarların neyin tutarı olduğu: tooltip'in onlara verdiği ad, ve description'ı olmayan grafiğin ekran okuyucudaki adı.
modifierModifierModifiergrafiğin modifier'ı. Buradaki bir yükseklik grafiğindir.
total((T) -> Boolean)?nullbir satırın toplam olup olmadığı. null ise grafiğin toplamı yoktur.
connectorsBooleantrueher çubuğun ucundan bir sonrakine bir çizgi gidip gitmediği.
colorColorColor.Unspecifiedtoplamların çizildiği renk. Verilmezse grafiğin renklerinin ilkidir.
horizontalBooleanfalseyerlerin grafiğin altı boyunca dizilip çubukların yukarı uzanması yerine, yanından aşağı dizilip çubukların boyunca uzanıp uzanmadığı.
labelsChartDataLabels?nullher çubuğun neyi gösterdiği, ucuna yazılmış: bir adım işaretiyle, bir toplam olduğu gibi, yeri olduğunda. null hiçbirini yazmaz.
xAxisChartAxis?ChartAxis()yerlerin ekseni, grafiğin altında, horizontal ise yanında. null ondan hiçbir şey çizmez.
yAxisChartAxis?ChartAxis()değerlerin ekseni, grafiğin yanında, horizontal ise altında. null ondan hiçbir şey çizmez.
marksList<ChartMark>emptyList()adımların yanında çizim alanına çizilen çizgiler ve bantlar: bir hedef, bir sınır.
tooltipChartTooltip?ChartTooltip()gösterilen yer için gösterilen şey. null hiç göstermez.
zoomChartZoom?nullokuyucunun yerlerin bir kısmına yakından bakmasını ve geri kalanı boyunca kaydırmasını sağlayan şey. Grafiğe verilmedikçe null'dır; null bütün yerleri gösterir, başka bir şey yapmaz.
exportChartExport?nullokuyucunun grafiği uygulamadan bir dosya olarak çıkarmasını sağlayan şey: bir resim, ya da her boyutta keskin bir çizim. Grafiğe verilmedikçe null'dır, ve grafiğin böyle bir düğmesi olmaz.
empty(@Composable () -> Unit)?nullgrafiğin çizecek değeri yokken çizim alanında gösterdiği şey: temanın bunun için yazdığı sözün ("Veri yok") yerine; o zaman ekran okuyucuya da o söz söylenmez. null sözü yazar. Grafiğin dışa aktarıldığı dosya sözü yazar.
stateChartStaterememberChartState()okuyucunun gösterdiği yer: verilmezse grafiğin kendisininki.
descriptionString?nullgrafiğin ne gösterdiği, birkaç sözcükle, ekran okuyucu için.
onSelect((ChartPoint) -> Unit)?nullbasılan adımla ya da toplamla çağrılır.
styleChartStyle?nullbu grafiğin kendi geometrisi.
colorsChartColors?nullbu grafiğin kendi renkleri, temanınkiler olmadıkları yerde: rising ve falling da aralarında.
tagKeyString?nullgrafiğin otomasyon anahtarı. Grafik, olduğu PantrixChart gibi etiketlenir, Chart_<tagKey>, ve parçaları ile olayları o grafiğinkilerdir; tek serisinin anahtarı steps'tir.

ChartStyle

Bir grafiğin geometrisi: hiçbir şey söylemediğinde ne kadar yüksek olduğu, çizgilerinin ne kadar kalın, işaretlerinin ne kadar büyük olduğu ve parçalarının arasındaki boşluk; ve dolgularının renklerinin yanında desen alıp almadığı.

ParametreTürVarsayılanNe olduğu
heightDpDp.UnspecifiedGrafiğin modifier'ı ona bir yükseklik vermediğinde çizim alanının, eksenleriyle birlikte, ne kadar yüksek olduğu. Çizim alanının üstündeki ya da altındaki bir lejant kendi yüksekliğini ekler.
lineWidthDpDp.UnspecifiedBir serinin çizgisinin kalınlığı.
markerSizeDpDp.UnspecifiedBir noktadaki işaretin genişliği ve yüksekliği.
selectedMarkerSizeDpDp.UnspecifiedAynısı, gösterilen noktadaki işaret için.
gridWidthDpDp.UnspecifiedKılavuz çizgilerinin, eksenler boyunca çizilen çizgilerin ve gösterilen yeri işaretleyen çizginin kalınlığı. Sıfır hiçbirini çizmez.
labelGapDpDp.UnspecifiedÇizim alanıyla yanına ve altına yazılanın arası, ve onunla bir eksenin başlığının arası.
tickSpacingDpDp.UnspecifiedDeğerlerin ekseni boyunca işaretlenen iki değerin arasındaki en az boşluk: eksen söylemediğinde kaç tanesinin işaretleneceğine karar veren şey.
legendGapDpDp.UnspecifiedLejantla yanında durduğu grafiğin arası.
legendItemGapDpDp.UnspecifiedLejantın bir kaydıyla sonrakinin arası.
swatchSizeDpDp.UnspecifiedBir serinin lejanttaki ve tooltip'teki örneğinin ne kadar geniş olduğu: çizgisinin kısa bir parçası ya da dolgusunun bir yaması.
swatchGapDpDp.UnspecifiedO örnekle ardındaki adın arası.
tooltipShapeShapeSpecShapeSpec.UnspecifiedTooltip'in köşeleri: markanın şekil ölçeğinin bir basamağı ya da sabit bir şekil.
tooltipHorizontalPaddingDpDp.UnspecifiedTooltip'in yanlarıyla içindekinin arası.
tooltipVerticalPaddingDpDp.UnspecifiedÜstü ve altıyla içindekinin arası, ve başlığıyla satırlarının arası.
tooltipGapDpDp.UnspecifiedGösterilen yerle yanındaki tooltip'in arası.
tooltipElevationDpDp.UnspecifiedTooltip'in gölgesi.
barGapDpDp.UnspecifiedBir yerde yan yana duran iki çubuğun arası. Bunun için fazla ince olan çubuklar daha yakın durur.
barMaxWidthDpDp.UnspecifiedBir çubuğun en fazla ne kadar geniş olduğu, yerinin ne kadar yeri olursa olsun: üç yerli bir grafik üç kalas değildir.
barRadiusDpDp.UnspecifiedBir çubuğun ucunun, sıfırdan uzak ucunun, köşelerinin ne kadar yuvarlak olduğu.
sliceGapDpDp.UnspecifiedBir pastanın yan yana duran iki dilimi arasında; pastanın ortasından kenarına kadar aynı genişlikte.
selectedSliceOffsetDpDp.UnspecifiedBir pastanın gösterilen diliminin, pastanın kenarından ne kadar dışarı taştığı. Pasta çevresinde bu kadar yer bırakır: dilimin duracağı yer olsun.
gaugeWidthDpDp.UnspecifiedBir göstergenin yayının kalınlığı. Bir yay, yarıçapının yarısından kalın olmaz.
meterHeightDpDp.UnspecifiedBir ölçüm grubunun çubuğunun yüksekliği.
trackerHeightDpDp.UnspecifiedBir durum izleyicinin bloklarının yüksekliği.
bubbleMinSizeDpDp.UnspecifiedBir saçılım grafiğinin en küçük balonunun genişliği: büyüklüğü hiç olmayan ya da bir alan olarak görülemeyecek kadar az olan nokta da bir noktadır.
bubbleMaxSizeDpDp.UnspecifiedEn büyük balonunun genişliği: büyüklüğü grafiğin en büyüğü olanın.
navigatorHeightDpDp.UnspecifiedZoom'unda gezgin şeridi olan bir grafikte, çizim alanının altındaki şeridin yüksekliği: grafiğin görünen kısmı onun üstünde işaretlenir ve kaydırılır. Yerleri yanından aşağı dizilen grafikte şerit çizim alanının yanında durur ve bu onun genişliğidir.
barBandShareFloatFloat.NaNBir yerin çubuklarının bandından aldığı pay, sıfırdan çok ve en fazla bir: kalanı bir yerin çubuklarıyla sonrakininkiler arasındaki boşluktur. Çubuklar yine de barMaxWidth'ten geniş olmaz.
markLineWidthDpDp.UnspecifiedBir işaretin çizgisinin kalınlığı: bir hedefin, bir sınırın, bir günün. Sıfır çizgi çizmez; işaretin yazısı yine yazılır.
markBandAlphaFloatFloat.NaNBir işaretin bandının renginin ne kadarıyla çizildiği, sıfırdan bire: bant serilerin arkasında durur ve bir tondur.
patternsBoolean?nullBir grafiğin serilerinin, dilimlerinin ve karolarının dolgularının renklerinin yanında desenlerle, çizgilerinin de sırayla kesik çizilip çizilmediği (ChartPattern): renkleri ayırt edemeyen bir okuyucu için onları ayıran şey. Verilmezse sistemin ayarına uyulur: sistem şeyleri renksiz ayırt etmeye ayarlıysa açık (iOS'ta "Differentiate Without Color", Android'de renk düzeltme), değilse kapalı.
nodeWidthDpDp.UnspecifiedBir sankey düğümünün ne kadar geniş olduğu.
nodeGapDpDp.UnspecifiedBir sankey kolonunun iki düğümü arası.

ChartColors

Temanın renklerini almayan bir grafik için, onun neyle boyandığı: verilen renk kullanılır, verilmeyen temanınki kalır.

ParametreTürVarsayılanNe olduğu
seriesList<Color>emptyList()Serilerin çizildiği renkler, dağıtıldıkları sırayla, kendi rengini söylemeyen seriler için. Boşsa temanın grafik renkleridir.
gridColorColor.UnspecifiedBir eksenin işaretlerinde grafik boyunca çizilen çizgiler. Temanın divider'ı.
axisColorColor.UnspecifiedBir eksen boyunca çizilen çizgi. Temanın border'ı.
labelColorColor.UnspecifiedEksenlerin yanına yazılanlar: değerler, yerler ve eksenlerin başlıkları, bir de lejanttaki adlar. Temanın textSecondary'si.
crosshairColorColor.UnspecifiedGösterilen yeri işaretleyen çizgi. Temanın borderHover'ı: içinden geçtiği kılavuz çizgilerinden güçlü, arkasında durduğu serilerden sessiz.
tooltipContainerColorColor.UnspecifiedTooltip'in dolgusu. Temanın surface'i.
tooltipBorderColorColor.UnspecifiedTooltip'in kenarı. Temanın border'ı.
tooltipTextColorColor.UnspecifiedTooltip'in başlığı ve değerleri. Temanın textPrimary'si.
tooltipLabelColorColor.UnspecifiedTooltip'teki seri adları. Temanın textSecondary'si.
risingColorColor.UnspecifiedYukarı giden bir değerin çizildiği renk: bir şelalenin ekleyen adımı. Temanın success'i.
fallingColorColor.UnspecifiedAşağı giden bir değerin çizildiği renk: bir şelalenin götüren adımı. Temanın danger'ı.

Erişilebilirlik