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
- Adımlar. Satırın değeri eklediği miktardır; sıfırın altındaysa götürdüğü. Ekleyen adım grafiğin
risingrenginde, götüren adımfallingrenginde çizilir: temanınsuccessvedangerrenkleri,colorsbaşka söylemedikçe. - Toplamlar.
total'ın toplam dediği satır sıfırın üstünde durur ve kendinden önceki adımların vardığı yeri gösterir; kendi değeri sorulmaz. Kendi değeri olan bir toplam, sayımın yeniden başladığı yerdir: ilk adımdan önceki açılış tutarı gibi. Toplamlar serinin kendi renginde çizilir (color). - Bağlantı çizgileri. Her çubuğun ucundan bir sonrakinin başladığı yere ince bir çizgi gider (
connectors). - Sıfır. Değer ekseni sıfırı içine alır: toplamlar onun üstünde durur.
- Değer etiketleri.
labelsher çubuğun neyi gösterdiğini ucuna yazar: yukarı gidenin üstüne, aşağı gidenin altına. - Yatay.
horizontal = truekalemleri grafiğin yanından aşağı dizer; her çubuk üstündekinin bittiği yerden başlar, ekleyen sağa, götüren sola gider (sağdan sola okunan dilde tersi). Değerler grafiğin altına yazılır. - Otomasyon. Grafik, olduğu
PantrixChartgibi etiketlenir:Chart_<tagKey>. Tek serisinin anahtarısteps'tir.
Ö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.
| Parametre | Tür | Varsayılan | Ne olduğu |
|---|---|---|---|
data | List<T> | satırlar, adımlarının sayıldığı sırayla. | |
x | (T) -> Any | bir 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. | |
name | String | tutarların neyin tutarı olduğu: tooltip'in onlara verdiği ad, ve description'ı olmayan grafiğin ekran okuyucudaki adı. | |
modifier | Modifier | Modifier | grafiğin modifier'ı. Buradaki bir yükseklik grafiğindir. |
total | ((T) -> Boolean)? | null | bir satırın toplam olup olmadığı. null ise grafiğin toplamı yoktur. |
connectors | Boolean | true | her çubuğun ucundan bir sonrakine bir çizgi gidip gitmediği. |
color | Color | Color.Unspecified | toplamların çizildiği renk. Verilmezse grafiğin renklerinin ilkidir. |
horizontal | Boolean | false | yerlerin grafiğin altı boyunca dizilip çubukların yukarı uzanması yerine, yanından aşağı dizilip çubukların boyunca uzanıp uzanmadığı. |
labels | ChartDataLabels? | null | her ç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. |
xAxis | ChartAxis? | ChartAxis() | yerlerin ekseni, grafiğin altında, horizontal ise yanında. null ondan hiçbir şey çizmez. |
yAxis | ChartAxis? | ChartAxis() | değerlerin ekseni, grafiğin yanında, horizontal ise altında. null ondan hiçbir şey çizmez. |
marks | List<ChartMark> | emptyList() | adımların yanında çizim alanına çizilen çizgiler ve bantlar: bir hedef, bir sınır. |
tooltip | ChartTooltip? | ChartTooltip() | gösterilen yer için gösterilen şey. null hiç göstermez. |
zoom | ChartZoom? | null | okuyucunun 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. |
export | ChartExport? | null | okuyucunun 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)? | null | grafiğ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. |
state | ChartState | rememberChartState() | okuyucunun gösterdiği yer: verilmezse grafiğin kendisininki. |
description | String? | null | grafiğin ne gösterdiği, birkaç sözcükle, ekran okuyucu için. |
onSelect | ((ChartPoint) -> Unit)? | null | basılan adımla ya da toplamla çağrılır. |
style | ChartStyle? | null | bu grafiğin kendi geometrisi. |
colors | ChartColors? | null | bu grafiğin kendi renkleri, temanınkiler olmadıkları yerde: rising ve falling da aralarında. |
tagKey | String? | null | grafiğ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ığı.
| Parametre | Tür | Varsayılan | Ne olduğu |
|---|---|---|---|
height | Dp | Dp.Unspecified | Grafiğ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. |
lineWidth | Dp | Dp.Unspecified | Bir serinin çizgisinin kalınlığı. |
markerSize | Dp | Dp.Unspecified | Bir noktadaki işaretin genişliği ve yüksekliği. |
selectedMarkerSize | Dp | Dp.Unspecified | Aynısı, gösterilen noktadaki işaret için. |
gridWidth | Dp | Dp.Unspecified | Kılavuz çizgilerinin, eksenler boyunca çizilen çizgilerin ve gösterilen yeri işaretleyen çizginin kalınlığı. Sıfır hiçbirini çizmez. |
labelGap | Dp | Dp.Unspecified | Çizim alanıyla yanına ve altına yazılanın arası, ve onunla bir eksenin başlığının arası. |
tickSpacing | Dp | Dp.Unspecified | Değ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. |
legendGap | Dp | Dp.Unspecified | Lejantla yanında durduğu grafiğin arası. |
legendItemGap | Dp | Dp.Unspecified | Lejantın bir kaydıyla sonrakinin arası. |
swatchSize | Dp | Dp.Unspecified | Bir serinin lejanttaki ve tooltip'teki örneğinin ne kadar geniş olduğu: çizgisinin kısa bir parçası ya da dolgusunun bir yaması. |
swatchGap | Dp | Dp.Unspecified | O örnekle ardındaki adın arası. |
tooltipShape | ShapeSpec | ShapeSpec.Unspecified | Tooltip'in köşeleri: markanın şekil ölçeğinin bir basamağı ya da sabit bir şekil. |
tooltipHorizontalPadding | Dp | Dp.Unspecified | Tooltip'in yanlarıyla içindekinin arası. |
tooltipVerticalPadding | Dp | Dp.Unspecified | Üstü ve altıyla içindekinin arası, ve başlığıyla satırlarının arası. |
tooltipGap | Dp | Dp.Unspecified | Gösterilen yerle yanındaki tooltip'in arası. |
tooltipElevation | Dp | Dp.Unspecified | Tooltip'in gölgesi. |
barGap | Dp | Dp.Unspecified | Bir yerde yan yana duran iki çubuğun arası. Bunun için fazla ince olan çubuklar daha yakın durur. |
barMaxWidth | Dp | Dp.Unspecified | Bir çubuğun en fazla ne kadar geniş olduğu, yerinin ne kadar yeri olursa olsun: üç yerli bir grafik üç kalas değildir. |
barRadius | Dp | Dp.Unspecified | Bir çubuğun ucunun, sıfırdan uzak ucunun, köşelerinin ne kadar yuvarlak olduğu. |
sliceGap | Dp | Dp.Unspecified | Bir pastanın yan yana duran iki dilimi arasında; pastanın ortasından kenarına kadar aynı genişlikte. |
selectedSliceOffset | Dp | Dp.Unspecified | Bir 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. |
gaugeWidth | Dp | Dp.Unspecified | Bir göstergenin yayının kalınlığı. Bir yay, yarıçapının yarısından kalın olmaz. |
meterHeight | Dp | Dp.Unspecified | Bir ölçüm grubunun çubuğunun yüksekliği. |
trackerHeight | Dp | Dp.Unspecified | Bir durum izleyicinin bloklarının yüksekliği. |
bubbleMinSize | Dp | Dp.Unspecified | Bir 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. |
bubbleMaxSize | Dp | Dp.Unspecified | En büyük balonunun genişliği: büyüklüğü grafiğin en büyüğü olanın. |
navigatorHeight | Dp | Dp.Unspecified | Zoom'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. |
barBandShare | Float | Float.NaN | Bir 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. |
markLineWidth | Dp | Dp.Unspecified | Bir 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. |
markBandAlpha | Float | Float.NaN | Bir işaretin bandının renginin ne kadarıyla çizildiği, sıfırdan bire: bant serilerin arkasında durur ve bir tondur. |
patterns | Boolean? | null | Bir 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ı. |
nodeWidth | Dp | Dp.Unspecified | Bir sankey düğümünün ne kadar geniş olduğu. |
nodeGap | Dp | Dp.Unspecified | Bir 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.
| Parametre | Tür | Varsayılan | Ne olduğu |
|---|---|---|---|
series | List<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. |
grid | Color | Color.Unspecified | Bir eksenin işaretlerinde grafik boyunca çizilen çizgiler. Temanın divider'ı. |
axis | Color | Color.Unspecified | Bir eksen boyunca çizilen çizgi. Temanın border'ı. |
label | Color | Color.Unspecified | Eksenlerin yanına yazılanlar: değerler, yerler ve eksenlerin başlıkları, bir de lejanttaki adlar. Temanın textSecondary'si. |
crosshair | Color | Color.Unspecified | Gösterilen yeri işaretleyen çizgi. Temanın borderHover'ı: içinden geçtiği kılavuz çizgilerinden güçlü, arkasında durduğu serilerden sessiz. |
tooltipContainer | Color | Color.Unspecified | Tooltip'in dolgusu. Temanın surface'i. |
tooltipBorder | Color | Color.Unspecified | Tooltip'in kenarı. Temanın border'ı. |
tooltipText | Color | Color.Unspecified | Tooltip'in başlığı ve değerleri. Temanın textPrimary'si. |
tooltipLabel | Color | Color.Unspecified | Tooltip'teki seri adları. Temanın textSecondary'si. |
rising | Color | Color.Unspecified | Yukarı giden bir değerin çizildiği renk: bir şelalenin ekleyen adımı. Temanın success'i. |
falling | Color | Color.Unspecified | Aşağı giden bir değerin çizildiği renk: bir şelalenin götüren adımı. Temanın danger'ı. |
Erişilebilirlik
- Tooltip ve ekran okuyucu. Bir adım eklediğiyle, işaretiyle yazılır ("+310"); bir toplam vardığı yerle. Bir basış, noktanın
value'sunda adımı,from'unda adımın başladığı seviyeyi alır.