diff --git a/backend/metagenedb/api/catalog/qparams_validators/gene.py b/backend/metagenedb/api/catalog/qparams_validators/gene.py
index 758d1a97c2f9bfc16fdeed21fd5610c563d9fd47..fe09c979b4a98d17b0ae10f9a64fd9dc50651e6a 100644
--- a/backend/metagenedb/api/catalog/qparams_validators/gene.py
+++ b/backend/metagenedb/api/catalog/qparams_validators/gene.py
@@ -3,3 +3,4 @@ from marshmallow import Schema, fields
 
 class GeneLengthQueryParams(Schema):
     window_size = fields.Integer()
+    stop_at = fields.Integer()
diff --git a/backend/metagenedb/api/catalog/views/gene.py b/backend/metagenedb/api/catalog/views/gene.py
index ada0b5ee67b8d2af25eaa6535c89586750b51d50..9e1a07aaf56240bc74932ec22cbbfb07718ded96 100644
--- a/backend/metagenedb/api/catalog/views/gene.py
+++ b/backend/metagenedb/api/catalog/views/gene.py
@@ -1,4 +1,3 @@
-import pandas as pd
 from django_pandas.io import read_frame
 from drf_yasg import openapi
 from drf_yasg.utils import swagger_auto_schema
@@ -53,12 +52,13 @@ class GeneViewSet(BulkViewSet):
     serializer_class = GeneSerializer
     lookup_field = 'gene_id'
     GENE_LENGTH_COL = 'length'
-    DEFAULT_WINDOW_SIZE = 10000
+    DEFAULT_WINDOW_SIZE = 1000
+    DEFAULT_STOP_AT = 10000
 
     def get_permissions(self):
         return super(self.__class__, self).get_permissions()
 
-    def _count_windows(self, df, window_size=DEFAULT_WINDOW_SIZE, window_col=GENE_LENGTH_COL):
+    def _count_windows(self, df, window_size=DEFAULT_WINDOW_SIZE, window_col=GENE_LENGTH_COL, stop_at=DEFAULT_STOP_AT):
         """
         Count how many line of the df belong to each windows defined by the window_size for the window_col
         :param df:
@@ -66,12 +66,18 @@ class GeneViewSet(BulkViewSet):
         :param window_size: size of the window
         :return: {'data': COUNTS_BY_WINDOW, 'labels': START-END}
         """
-        all_ranges = [(i, i + window_size) for i in range(0, df[window_col].max(), window_size)]
+        length_max = df[window_col].max()
+        stop_at = length_max if length_max < stop_at else stop_at
+        all_ranges = [[i, i + window_size] for i in range(0, stop_at + 1, window_size)]
+        all_ranges[-1][1] = length_max + 1  # last should contain all above the stop_at
         data = []
         labels = []
         for rg in all_ranges:
-            labels.append(f"{rg[0]}-{rg[1]-1}")
+            labels.append(f"{rg[0]/1000}k-{rg[1]/1000}k")
             data.append(df[get_mask(df, rg, window_col)].count()[window_col])
+        # Change labels
+        labels[0] = f"<{labels[0].split('-')[1]}"
+        labels[-1] = f">{labels[-1].split('-')[0]}"
         return {
             'counts': data,
             'labels': labels
@@ -97,12 +103,13 @@ class GeneViewSet(BulkViewSet):
             return Response(error_message, status=HTTP_422_UNPROCESSABLE_ENTITY)
 
         window_size = query_params.get('window_size', self.DEFAULT_WINDOW_SIZE)
-        df = read_frame(self.queryset.values(self.GENE_LENGTH_COL))
+        stop_at = query_params.get('stop_at', self.DEFAULT_STOP_AT)
+        df = read_frame(Gene.objects.all(), fieldnames=[self.GENE_LENGTH_COL])
         if df.empty:
             return Response(
                 {'results': {}},
                 status=HTTP_204_NO_CONTENT
             )
         return Response(
-            {'results': self._count_windows(df, window_size)}
+            {'results': self._count_windows(df, window_size=window_size, stop_at=stop_at)}
         )
diff --git a/backend/metagenedb/api/catalog/views/test_gene.py b/backend/metagenedb/api/catalog/views/test_gene.py
index fb136301e4bbbc0e1dc71f3cacce9a5fe18038e4..0ce78477b98a8820c6959e9b64e1b8c9b821a7ea 100644
--- a/backend/metagenedb/api/catalog/views/test_gene.py
+++ b/backend/metagenedb/api/catalog/views/test_gene.py
@@ -50,9 +50,19 @@ class TestCountWindows(TestCase):
 
     def test_simple_count_window10(self):
         expected_dict = {
-            'labels': ['0-9', '10-19', '20-29', '30-39'],
+            'labels': ['<0.01k', '0.01k-0.02k', '0.02k-0.03k', '>0.03k'],
             'counts': [0, 0, 2, 1]
         }
         geneviewset = GeneViewSet()
         test_dict = geneviewset._count_windows(self.df, 10, window_col=self.window_col)
         self.assertDictEqual(test_dict, expected_dict)
+
+    def test_simple_count_window10_stop20(self):
+        expected_dict = {
+            'labels': ['<0.01k', '0.01k-0.02k', '>0.02k'],
+            'counts': [0, 0, 3]
+        }
+        geneviewset = GeneViewSet()
+        test_dict = geneviewset._count_windows(self.df, window_size=10,
+                                               window_col=self.window_col, stop_at=20)
+        self.assertDictEqual(test_dict, expected_dict)
diff --git a/frontend/src/views/Stats.vue b/frontend/src/views/Stats.vue
index 62198c7d3b8715fb27afe1aa9424028e359527c3..b681d6499849802e4fbed95794ecf1f1ad2a7f15 100644
--- a/frontend/src/views/Stats.vue
+++ b/frontend/src/views/Stats.vue
@@ -35,7 +35,7 @@ export default {
   data() {
     return {
       geneLengthData: {},
-      geneLengthWindowSize: 10000,
+      geneLengthWindowSize: 1000,
     };
   },
   mounted() {