From 117ae95fbd739a446a0c78d443b09fcdf5ab45d7 Mon Sep 17 00:00:00 2001
From: Remi  PLANEL <rplanel@pasteur.fr>
Date: Thu, 4 Apr 2024 13:50:14 +0200
Subject: [PATCH] let user configure distribution plot

---
 .../content/ArticleSystemDistributionPlot.vue | 88 +++++++++++++++----
 1 file changed, 71 insertions(+), 17 deletions(-)

diff --git a/components/content/ArticleSystemDistributionPlot.vue b/components/content/ArticleSystemDistributionPlot.vue
index 2104a548..13f8ed2d 100644
--- a/components/content/ArticleSystemDistributionPlot.vue
+++ b/components/content/ArticleSystemDistributionPlot.vue
@@ -37,8 +37,21 @@ const msIndexName = ref<string>("refseqsanitized")
 const client = useMeiliSearchRef()
 
 
+
 const genomeCountDomain = ref<[number | null, number | null]>([null, null])
 const genomeCountValue = ref<[number, number]>([0, 0])
+const resetCount = ref<Fn | null>(null)
+
+
+const genomePercentDomain = ref<[number, number]>([0, 100])
+const genomePercentValue = ref<[number, number]>([0, 0])
+const resetPercent = ref<Fn | null>(null)
+
+
+const axisOptions = ref<string[]>(["percent", "size"])
+const plotY = ref<string>("percent")
+const plotFill = ref<string>("size")
+
 // onBeforeMount(() => {
 //     fetchSystemHits()
 //     fetchRefSeqTaxo()
@@ -56,10 +69,6 @@ const computedWidth = computed(() => {
     return Math.max(screenWidth, 550);
 });
 
-
-
-
-
 const computedDistribution = computed(() => {
     const toValSelectedTaxoRank = toValue(selectedTaxoRank)
     const toValSystemHits = toValue(systemHits)
@@ -84,9 +93,10 @@ const computedDistribution = computed(() => {
 
 const filteredDistribution = computed(() => {
     const toValDistribution = toValue(computedDistribution)
-    const [min, max] = toValue(genomeCountValue)
+    const [minCount, maxCount] = toValue(genomeCountValue)
+    const [minPercent, maxPercent] = toValue(genomePercentValue)
     return toValDistribution.filter(d => {
-        return d.size >= min && d.size <= max
+        return d.size >= minCount && d.size <= maxCount && d.percent >= minPercent && d.percent <= maxPercent
     })
 })
 
@@ -119,24 +129,24 @@ const distributionOptions = computed(() => {
     const { marginLeft, marginRight } = toValue(margin)
     return {
         ...toValue(margin),
-        y: { label: `Number of genomes encoding ${toValue(page)?.title ?? 'the system'}` },
+        y: { label: `% of genomes encoding ${toValue(page)?.title ?? 'the system'}` },
         x: { label: selectedTaxoRank.value, tickRotate: 45 },
         color: {
             scheme: "plasma",
             legend: true,
             reverse: true,
-            domain: [0, 100],
+            // domain: [0, 100],
             marginLeft: 10,
-            label: `% of genomes encoding ${toValue(page)?.title ?? 'the system'}`,
+            label: `Nb of genomes encoding ${toValue(page)?.title ?? 'the system'}`,
         },
         width: computedWidth.value - marginRight - marginLeft,
         marks: [
             Plot.barY(
                 toValue(filteredDistribution),
                 {
-                    y: "size",
+                    y: toValue(plotY),
                     x: "taxo",
-                    fill: "percent",
+                    fill: toValue(plotFill),
                     tip: true,
                     sort: { x: "-y" },
                 },
@@ -156,8 +166,9 @@ watchEffect(() => {
     if (toValDistribution?.length > 0) {
         genomeCountDomain.value = toValDistribution.reduce((acc, curr) => {
             const [min, max] = acc
-            if (min === null || curr.size < min) acc[0] = curr.size
-            if (max === null || curr.size > max) acc[1] = curr.size
+            const currVal = curr.size
+            if (min === null || currVal < min) acc[0] = currVal
+            if (max === null || currVal > max) acc[1] = currVal
             return acc
         }, [null, null])
 
@@ -165,8 +176,12 @@ watchEffect(() => {
     } else {
         genomeCountDomain.value = [null, null]
     }
-    const { range, reset } = useNumericalFilter("distribution", genomeCountDomain.value[0] || 0, genomeCountDomain.value[1] || 0)
-    genomeCountValue.value = range.value
+    const { range: rangeCount, reset: rCount } = useNumericalFilter("count", genomeCountDomain.value[0], genomeCountDomain.value[1])
+    const { range: rangePercent, reset: rPercent } = useNumericalFilter("percent", 0, 100)
+    genomeCountValue.value = rangeCount.value
+    genomePercentValue.value = rangePercent.value
+    resetCount.value = rCount
+    resetPercent.value = rPercent
 
 })
 
@@ -217,10 +232,49 @@ async function fetchRefSeqTaxo() {
                 hide-details="auto" class="mx-2"></v-select>
         </v-card-text>
         <v-card-text>
+            <v-row>
+                <v-col> <v-select v-model="plotY" :items="axisOptions" density="compact" label="Y using"
+                        hide-details="auto" class="mx-2"></v-select>
+                </v-col>
+                <v-col><v-select v-model="plotFill" :items="axisOptions" density="compact" label="Fill using"
+                        hide-details="auto" class="mx-2"></v-select></v-col>
+            </v-row>
 
-            <v-range-slider v-model="genomeCountValue" step="1" thumb-label="always" :min="genomeCountDomain[0]"
-                :max="genomeCountDomain[1]"></v-range-slider>
         </v-card-text>
+        <v-row class="d-flex">
+            <v-col>
+                <v-card flat>
+                    <v-card-item class="mb-4">
+                        <v-card-title> Genome Count
+                        </v-card-title>
+                    </v-card-item>
+                    <v-card-text class="pr-0">
+                        <v-range-slider v-model="genomeCountValue" step="1" thumb-label="always"
+                            :min="genomeCountDomain[0]" :max="genomeCountDomain[1]">
+                            <template #append>
+                                <v-btn variant="text" density="compact" icon="md:restart_alt"
+                                    @click="resetCount()"></v-btn>
+                            </template></v-range-slider>
+                    </v-card-text>
+                </v-card>
+            </v-col>
+            <v-col>
+                <v-card flat>
+                    <v-card-item class="mb-4">
+                        <v-card-title> Genome Percent
+                        </v-card-title>
+                    </v-card-item>
+                    <v-card-text class="pr-0">
+                        <v-range-slider v-model="genomePercentValue" step="1" thumb-label="always"
+                            :min="genomePercentDomain[0]" :max="genomePercentDomain[1]">
+                            <template #append>
+                                <v-btn variant="text" density="compact" icon="md:restart_alt"
+                                    @click="resetPercent()"></v-btn>
+                            </template></v-range-slider>
+                    </v-card-text>
+                </v-card>
+            </v-col>
+        </v-row>
         <PlotFigure ref="systemsDistributionPlot" :options="unref(distributionOptions)" defer></PlotFigure>
     </v-card>
 </template>
\ No newline at end of file
-- 
GitLab