Pantrix UI

Heatmap

Bir ısı haritası: hücrelerden bir ızgara, her hücre değerinin ne kadar olduğunu söyleyen bir tonda. İki adı ve bir sayısı olan şeye yakışır: haftanın günlerinin saatleri, birkaç yılın ayları, bir listenin ötekiyle karşılaştırılması. Neyin çok, neyin az olduğu bir bakışta görülür; aynı sayıların tablosunu ise okumak gerekir.

import com.pantrixui.components.chart.heatmap.PantrixHeatmap

Örnekler

Haftanın saatleri

Bir mağazanın bir haftalık ziyaretçisi, günlere ve günün dilimlerine göre. Koyu hücre kalabalık saattir.

İmleci bir hücrenin üstüne getir ya da dokun: tooltip o günün o saatindeki ziyaretçiyi yazar.

PantrixHeatmap(
    data = weekVisits(),
    x = { it.hours },
    y = { it.day },
    value = { it.visits },
    description = "Güne ve saate göre ziyaret",
    tagKey = "plain"
)

internal fun weekVisits(): List<SlotVisits> {
    val days = listOf("Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz")
    val hours = listOf("09", "11", "13", "15", "17", "19")
    val visits = listOf(
        listOf(12, 18, 34, 22, 41, 30),
        listOf(10, 16, 31, 20, 38, 28),
        listOf(14, 21, 36, 25, 44, 33),
        listOf(11, 19, 35, 27, 47, 36),
        listOf(16, 24, 42, 31, 58, 52),
        listOf(28, 45, 61, 66, 72, 57),
        listOf(22, 39, 54, 60, 49, 26)
    )
    return days.flatMapIndexed { day, name -> hours.mapIndexed { slot, at -> SlotVisits(name, at, visits[day][slot]) } }
}

internal class SlotVisits(
    val day: String,
    val hours: String,
    val visits: Int
)

Beş ton, değerler yazılı

Sınav puanları, yüz üzerinden. Ölçeğin beş tonu var (steps): her yirmi puan bir ton. Değerler hücrelere yazılı (labels) ve ölçek grafiğin yanında duruyor. Sınava girmeyenin hücresi boş.

PantrixHeatmap(
    data = examScores(),
    x = { it.subject },
    y = { it.student },
    value = { it.score },
    scale = HeatmapScale(min = 0.0, max = 100.0, steps = 5),
    labels = ChartDataLabels(),
    legend = ChartLegend(position = ChartLegendPosition.End),
    description = "Öğrencilerin derslere göre puanları",
    tagKey = "steps"
)

internal fun examScores(): List<ExamScore> {
    val subjects = listOf("Matematik", "Fizik", "Kimya", "Tarih", "Dil")
    val scores = mapOf(
        "Ada" to listOf(92, 85, 78, 64, 88),
        "Lin" to listOf(71, 58, null, 90, 95),
        "Can" to listOf(45, 62, 70, 81, 39),
        "Ece" to listOf(84, 97, 91, 55, 73)
    )
    return scores.flatMap { (student, row) ->
        subjects.mapIndexed { at, subject -> ExamScore(student, subject, row[at]) }
    }
}

internal class ExamScore(
    val student: String,
    val subject: String,
    val score: Int?
)

İki renkli ölçek

İki renkli bir ölçek, sıcaklık gibi: en az ziyaret low renginde (uyarı renginin kabı), en çoğu color renginde (tehlike rengi); aradaki tonlar iki rengin Oklab'da karışımı. Renkler temadan alındığı için ölçek açık temada da koyu temada da okunur.

val colors = PantrixTheme.colors
PantrixHeatmap(
    data = weekVisits(),
    x = { it.hours },
    y = { it.day },
    value = { it.visits },
    scale = HeatmapScale(low = colors.warning.container, color = colors.danger.color),
    labels = ChartDataLabels(),
    description = "Güne ve saate göre ziyaret",
    tagKey = "two_colours"
)

internal fun weekVisits(): List<SlotVisits> {
    val days = listOf("Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz")
    val hours = listOf("09", "11", "13", "15", "17", "19")
    val visits = listOf(
        listOf(12, 18, 34, 22, 41, 30),
        listOf(10, 16, 31, 20, 38, 28),
        listOf(14, 21, 36, 25, 44, 33),
        listOf(11, 19, 35, 27, 47, 36),
        listOf(16, 24, 42, 31, 58, 52),
        listOf(28, 45, 61, 66, 72, 57),
        listOf(22, 39, 54, 60, 49, 26)
    )
    return days.flatMapIndexed { day, name -> hours.mapIndexed { slot, at -> SlotVisits(name, at, visits[day][slot]) } }
}

internal class SlotVisits(
    val day: String,
    val hours: String,
    val visits: Int
)

Bir hücreye basmak

onSelect, basılan hücreyi verir: bir hücreye bas ya da klavyeyle bir hücreye gidip Enter'a bas, kartın altındaki satır basılanı yazar. Ölçeğin kendi rengi var (HeatmapScale.color) ve ölçek çubuğu yok (legend = null).

val report = LocalExampleEvents.current
PantrixHeatmap(
    data = weekVisits(),
    x = { it.hours },
    y = { it.day },
    value = { it.visits },
    scale = HeatmapScale(color = PantrixTheme.colors.success.color),
    legend = null,
    onSelect = { cell -> report("${cell.name}, ${cell.label}: ${cell.text}") },
    description = "Güne ve saate göre ziyaret",
    tagKey = "pressed"
)

internal fun weekVisits(): List<SlotVisits> {
    val days = listOf("Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz")
    val hours = listOf("09", "11", "13", "15", "17", "19")
    val visits = listOf(
        listOf(12, 18, 34, 22, 41, 30),
        listOf(10, 16, 31, 20, 38, 28),
        listOf(14, 21, 36, 25, 44, 33),
        listOf(11, 19, 35, 27, 47, 36),
        listOf(16, 24, 42, 31, 58, 52),
        listOf(28, 45, 61, 66, 72, 57),
        listOf(22, 39, 54, 60, 49, 26)
    )
    return days.flatMapIndexed { day, name -> hours.mapIndexed { slot, at -> SlotVisits(name, at, visits[day][slot]) } }
}

internal class SlotVisits(
    val day: String,
    val hours: String,
    val visits: Int
)

Dışa aktarma

export = ChartExport(...) grafiğin üstüne bir dışa aktarma düğmesi koyar: bas ve türü seç (PNG, SVG ya da PDF). Grafik dosyayı üretir ve onExport'a verir; altta adı ve boyu, PNG ise resmi görünür, "Dosyayı kaydet" onu platformun yoluyla verir.

Dosyada hücreler ve kenarlardaki adlar durur; renk ölçeği, ekranda nerede durursa dursun, dosyada hücrelerin altındadır.

var file by remember { mutableStateOf<ChartExportFile?>(null) }
PantrixHeatmap(
    data = weekVisits(),
    x = { it.hours },
    y = { it.day },
    value = { it.visits },
    description = "Güne ve saate göre ziyaret",
    tagKey = "exported",
    export = ChartExport(fileName = "haftanin-saatleri") { file = it }
)
ExportedFile(file, tagKey = "exported")

internal fun weekVisits(): List<SlotVisits> {
    val days = listOf("Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz")
    val hours = listOf("09", "11", "13", "15", "17", "19")
    val visits = listOf(
        listOf(12, 18, 34, 22, 41, 30),
        listOf(10, 16, 31, 20, 38, 28),
        listOf(14, 21, 36, 25, 44, 33),
        listOf(11, 19, 35, 27, 47, 36),
        listOf(16, 24, 42, 31, 58, 52),
        listOf(28, 45, 61, 66, 72, 57),
        listOf(22, 39, 54, 60, 49, 26)
    )
    return days.flatMapIndexed { day, name -> hours.mapIndexed { slot, at -> SlotVisits(name, at, visits[day][slot]) } }
}

internal class SlotVisits(
    val day: String,
    val hours: String,
    val visits: Int
)

API

data

Bir ısı haritası: hücrelerden bir ızgara, her hücre değerinin ne kadar olduğunu söyleyen bir tonda. İki adı ve bir sayısı olan şeye yakışır: haftanın günlerinin saatleri, birkaç yılın ayları, bir listenin ötekiyle karşılaştırılması. Neyin çok, neyin az olduğu bir bakışta görülür; aynı sayıların tablosunu ise okumak gerekir.

ParametreTürVarsayılanNe olduğu
dataList<T>veri, değeri olan her hücre için bir veri.
x(T) -> Anybir verinin durduğu kolon: bir ad, bir saat, kendine eşit olan herhangi bir şey.
y(T) -> Anysatırı, aynı biçimde.
value(T) -> Number?değeri, yoksa null.
modifierModifierModifiergrafiğin modifier'ı. Buradaki bir yükseklik grafiğindir, ölçeğinki de içinde.
xAxisChartAxis?ChartAxis()kolonlar: adlarının hücrelerin altına yazılıp yazılmadığı (labels) ve bir adın nasıl yazıldığı (label). Başka hiçbir şeyi okunmaz. null hiç yazmaz.
yAxisChartAxis?ChartAxis()satırlar: adlarının hücrelerin yanına yazılıp yazılmadığı ve nasıl yazıldığı. null hiç yazmaz.
scaleHeatmapScaleHeatmapScale()bir değerin nasıl bir tona dönüştüğü.
labelsChartDataLabels?nullhücrelere yazılan değerler; her biri, hücrede yeri varsa, tonunun üstünde daha iyi okunan siyah ya da beyazla. null hiç yazmaz.
legendChartLegend?ChartLegend()ton ölçeğinin durduğu yer. null hiç göstermez. Bir ölçeğin grafikten çıkaracağı bir şey yoktur: yalnızca durduğu yer okunur.
tooltipChartTooltip?ChartTooltip()gösterilen hücre için gösterilen: başlık olarak kolonu, altında da satırı ve format'ın söylediği gibi yazılan değeri. Bir hücrenin paylaşacağı bir yeri ve içinden geçen bir çizgisi yoktur: shared ve crosshair okunmaz. null hiç göstermez.
empty(@Composable () -> Unit)?nullgrafiğin çizecek değeri yokken 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.
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: grafik hakkında söylediği ilk şey. Verilmezse grafik satırlarının adlarıyla duyurulur.
onSelect((ChartPoint) -> Unit)?nullbasılan hücreyle çağrılır: x'i verinin data içindeki sıfırdan sayılan yeri, label'ı kolonu, name'i satırı, value'su değeridir.
styleChartStyle?nullbu grafiğin kendi geometrisi: burada verilen alanlar, gerisi için temanınkiler. İki hücrenin arası sliceGap kadardır, köşeleri de barRadius'un söylediği kadar yuvarlaktır.
colorsChartColors?nullbu grafiğin kendi renkleri, temanınkiler olmadıkları yerde.
tagKeyString?nullgrafiğin otomasyon anahtarı: grafik Heatmap_<tagKey>, hücrelerinin tamamı Heatmap_<tagKey>.Plot, bir hücre, dolu hücreler arasında satır satır birden sayılarak, Heatmap_<tagKey>.Cell_<number>, ölçek Heatmap_<tagKey>.Legend ve tooltip Heatmap_<tagKey>.Tooltip olur. Bir hücreye basış, verinin sıra numarasıyla bir Heatmap select olayı olarak bildirilir. Değerlerden hiçbir şey bildirilmez.
exportChartExport?nullgrafiği uygulamanın dışına PNG, SVG ya da PDF olarak çıkarmayı sağlayan şey: grafiğin üstündeki bir düğme onun o anki hâlinin dosyasını üretip verir (bkz. ChartExport). null, grafikte böyle bir düğme yoktur. Renklerin ölçeği dosyada hücrelerin altında durur.

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