Как правильно выровнять подписи оси X в recharts

Вопрос или проблема

Я пытаюсь выровнять метки по оси X так, чтобы они были выровнены в начале и в конце области графика.
К сожалению, они не выровнены в начале:
не выровненная метка по оси X в начале графика

Вот мой полный код:

'use client'

import { Area, AreaChart, CartesianGrid, XAxis } from 'recharts'

import {
  ChartConfig,
  ChartContainer,
  ChartTooltip,
  ChartTooltipContent,
} from '@/components/ui/chart'
import {
  Card,
  CardContent,
  CardDescription,
  CardHeader,
  CardTitle,
} from '../ui/card'

const chartData = [
  { date: new Date('2024-04-02'), transactions: 125 },
  { date: new Date('2024-04-03'), transactions: 143 },
  { date: new Date('2024-04-04'), transactions: 156 },
  { date: new Date('2024-04-05'), transactions: 132 },
  { date: new Date('2024-04-06'), transactions: 168 },
  { date: new Date('2024-04-07'), transactions: 145 },
  { date: new Date('2024-04-08'), transactions: 178 },
  { date: new Date('2024-04-09'), transactions: 189 },
  { date: new Date('2024-04-10'), transactions: 167 },
  { date: new Date('2024-04-11'), transactions: 134 },
  { date: new Date('2024-04-12'), transactions: 156 },
  { date: new Date('2024-04-13'), transactions: 178 },
  { date: new Date('2024-04-14'), transactions: 198 },
  { date: new Date('2024-04-15'), transactions: 167 },
  { date: new Date('2024-04-16'), transactions: 145 },
  { date: new Date('2024-04-17'), transactions: 156 },
  { date: new Date('2024-04-18'), transactions: 189 },
  { date: new Date('2024-04-19'), transactions: 178 },
  { date: new Date('2024-04-20'), transactions: 165 },
  { date: new Date('2024-04-21'), transactions: 145 },
  { date: new Date('2024-04-22'), transactions: 167 },
  { date: new Date('2024-04-23'), transactions: 189 },
  { date: new Date('2024-04-24'), transactions: 176 },
  { date: new Date('2024-04-25'), transactions: 156 },
  { date: new Date('2024-04-26'), transactions: 178 },
  { date: new Date('2024-04-27'), transactions: 189 },
  { date: new Date('2024-04-28'), transactions: 167 },
  { date: new Date('2024-04-29'), transactions: 145 },
  { date: new Date('2024-04-30'), transactions: 178 },
]

const chartConfig = {
  desktop: {
    label: 'Desktop',
    color: 'hsl(var(--chart-1))',
  },
} satisfies ChartConfig

export type AreaCostCollapsibleChartProps = {
  title: string
}

export function AreaCostCollapsibleChart({
  title,
}: AreaCostCollapsibleChartProps) {
  return (
    <Card className="border-none">
      <CardHeader>
        <CardTitle className="text-lg">{title}</CardTitle>
        <CardDescription className="text-sm">
          {chartData[0].date.toLocaleDateString('en-US', {
            month: 'short',
            day: 'numeric',
          })}{' '}
          -{' '}
          {chartData[chartData.length - 1].date.toLocaleDateString('en-US', {
            month: 'short',
            day: 'numeric',
          })}
        </CardDescription>
      </CardHeader>
      <CardContent>
        <ChartContainer config={chartConfig} className="h-[200px] w-full">
          <AreaChart accessibilityLayer data={chartData}>
            <CartesianGrid vertical={false} />
            <XAxis
              dataKey="date"
              tickLine={false}
              axisLine={false}
              interval="equidistantPreserveStart"
              tickMargin={10}
              tickFormatter={(value) =>
                value.toLocaleDateString('en-US', {
                  month: 'short',
                  day: 'numeric',
                })
              }
            />
            <ChartTooltip
              cursor={false}
              content={<ChartTooltipContent indicator="line" />}
            />
            <Area
              dataKey="transactions"
              type="natural"
              fill="var(--color-desktop)"
              fillOpacity={0.1}
              stroke="var(--color-desktop)"
            />
          </AreaChart>
        </ChartContainer>
      </CardContent>
    </Card>
  )
}

Я пробовал использовать другие интервалы, такие как preserveEnd. Это как-то работает, но расстояние между ними не очень хорошее.
Я также пробовал паддинг и маргин на AreaChart или XAxis, но это все равно остается не выровненным в начале (как показано на изображении выше).

И что я ожидаю, так это то, чтобы метки по оси X были выровнены в начале и в конце графика и равномерно распределены. Например:
идеально выровненные метки по оси X в примере Figma

Ответ или решение

Для достижения правильного выравнивания меток по оси X в графиках, созданных с использованием библиотеки Recharts, необходимо учитывать несколько важных аспектов: настройку параметров оси, соответствующие стили и параметры данных. Ваша задача заключается в том, чтобы убедиться, что метки на оси X выравнены по краям графика, а пространство между ними распределено равномерно.

1. Анализ проблемы

Судя по вашему коду и опыту с метками оси X, очевидно, что проблема заключается в неправильной установке параметров выравнивания и интервалов. Вы уже пробовали параметры equidistantPreserveStart и preserveEnd, но они не обеспечили желаемого результата.

2. Настройка параметров оси X

Чтобы достичь идеального выравнивания отметок на оси X, вы можете попытаться использовать параметр interval с значением 0 для равномерного распределения меток. Тем не менее, если у вас множество меток, это может привести к тому, что их будет слишком много для визуализации.

В вашем коде настройка оси X выглядит следующим образом:

<XAxis
  dataKey="date"
  tickLine={false}
  axisLine={false}
  interval="equidistantPreserveStart"
  tickMargin={10}
  tickFormatter={(value) =>
    value.toLocaleDateString('en-US', {
      month: 'short',
      day: 'numeric',
    })
  }
/>

Попробуйте изменить interval на 0:

<XAxis
  dataKey="date"
  tickLine={false}
  axisLine={false}
  interval={0} // Изменено на 0
  tickMargin={10}
  tickFormatter={(value) =>
    value.toLocaleDateString('en-US', {
      month: 'short',
      day: 'numeric',
    })
  }
/>

3. Использование стилей и отступов

Дополнительное выравнивание может быть обеспечено с помощью CSS стилей. Убедитесь, что вы установили достаточные отступы для AreaChart и его контейнера, чтобы метки не соприкасались с краями графика. Например:

.chartContainer {
  padding: 20px 10px; // Установите отступ согласно вашим требованиям
}

Присоедините эти стили к вашему компоненту ChartContainer.

4. Настройка графика

При отрисовке данных убедитесь, что временные метки cover весь диапазон ваших данных. Используйте даты начала и окончания вашего набора данных как основы для оси X. Это поможет избежать визуальных сбоев из-за неправильного отображения отсутствующих данных.

5. Проверка и тестирование

После внесения изменений в код и стили протестируйте его в разных браузерах и разрешениях. Эти шаги обеспечат визуальную целостность графика в разных условиях.

Заключение

Обеспечение правильного выравнивания меток по оси X является важной частью процесса визуализации данных. Применяя предложенные рекомендации, такие как изменение интервала на 0, настройки отступов и тестирование, вы сможете добиться нужного результата. Важно помнить, что правильное отображение информации не только улучшает восприятие данных, но и способствует более эффективному анализу.

Оцените материал
Добавить комментарий

Капча загружается...