Разработка интерактивных графиков на Recharts для React-приложения

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Разработка интерактивных графиков на Recharts для React-приложения
Простая
от 1 рабочего дня до 3 рабочих дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Разработка интерактивных графиков на Recharts для React-приложения

Recharts — React-нативная библиотека графиков, построенная на SVG и D3. Каждый компонент графика — обычный React-компонент, что упрощает кастомизацию и интеграцию с состоянием приложения.

Установка

npm install recharts

Area Chart с кастомным Tooltip

import {
  AreaChart, Area, XAxis, YAxis, CartesianGrid,
  Tooltip, ResponsiveContainer, Legend
} from 'recharts';

function CustomTooltip({ active, payload, label }) {
  if (!active || !payload?.length) return null;

  return (
    <div className="bg-white border rounded-lg shadow-lg p-3">
      <p className="font-semibold text-gray-700 mb-2">{label}</p>
      {payload.map(entry => (
        <div key={entry.name} className="flex items-center gap-2">
          <div className="w-3 h-3 rounded-full" style={{ background: entry.color }} />
          <span className="text-sm">
            {entry.name}: <strong>{formatCurrency(entry.value)}</strong>
          </span>
        </div>
      ))}
    </div>
  );
}

function SalesAreaChart({ data }) {
  return (
    <ResponsiveContainer width="100%" height={300}>
      <AreaChart data={data} margin={{ top: 10, right: 30, left: 0, bottom: 0 }}>
        <defs>
          <linearGradient id="salesGradient" x1="0" y1="0" x2="0" y2="1">
            <stop offset="5%" stopColor="#3b82f6" stopOpacity={0.3} />
            <stop offset="95%" stopColor="#3b82f6" stopOpacity={0} />
          </linearGradient>
        </defs>
        <CartesianGrid strokeDasharray="3 3" stroke="#f0f0f0" />
        <XAxis dataKey="date" tickFormatter={d => format(parseISO(d), 'dd MMM')} />
        <YAxis tickFormatter={v => `${(v/1000).toFixed(0)}k`} />
        <Tooltip content={<CustomTooltip />} />
        <Area
          type="monotone"
          dataKey="revenue"
          name="Выручка"
          stroke="#3b82f6"
          fill="url(#salesGradient)"
          strokeWidth={2}
        />
      </AreaChart>
    </ResponsiveContainer>
  );
}

Composed Chart (смешанный тип)

import { ComposedChart, Bar, Line, Scatter } from 'recharts';

function ComposedAnalytics({ data }) {
  return (
    <ResponsiveContainer width="100%" height={350}>
      <ComposedChart data={data}>
        <CartesianGrid strokeDasharray="3 3" />
        <XAxis dataKey="month" />
        <YAxis yAxisId="revenue" orientation="left" />
        <YAxis yAxisId="count" orientation="right" />
        <Tooltip />
        <Legend />

        <Bar yAxisId="revenue" dataKey="revenue" name="Выручка" fill="#93c5fd" />
        <Line yAxisId="count" dataKey="orders" name="Заказы"
          type="monotone" stroke="#f59e0b" strokeWidth={2} dot={false} />
        <Scatter yAxisId="revenue" dataKey="bigOrders" name="Крупные заказы"
          fill="#ef4444" />
      </ComposedChart>
    </ResponsiveContainer>
  );
}

Кастомный Shape для Bar

function RoundedBar(props) {
  const { x, y, width, height, fill } = props;
  const radius = 4;

  return (
    <path
      d={`M${x},${y + height}
         L${x},${y + radius}
         Q${x},${y} ${x + radius},${y}
         L${x + width - radius},${y}
         Q${x + width},${y} ${x + width},${y + radius}
         L${x + width},${y + height} Z`}
      fill={fill}
    />
  );
}

<Bar dataKey="value" shape={<RoundedBar />} />

Zoom через ReferenceArea

function ZoomableChart({ data }) {
  const [refArea, setRefArea] = useState({ left: '', right: '' });
  const [zoomedData, setZoomedData] = useState(data);

  const zoom = () => {
    if (refArea.left === refArea.right) return;
    const filtered = data.filter(d =>
      d.date >= refArea.left && d.date <= refArea.right
    );
    setZoomedData(filtered);
    setRefArea({ left: '', right: '' });
  };

  return (
    <LineChart data={zoomedData}
      onMouseDown={e => setRefArea({ left: e.activeLabel, right: '' })}
      onMouseMove={e => refArea.left && setRefArea(prev => ({ ...prev, right: e.activeLabel }))}
      onMouseUp={zoom}>
      {/* ... */}
      {refArea.left && refArea.right && (
        <ReferenceArea x1={refArea.left} x2={refArea.right} strokeOpacity={0.3} />
      )}
    </LineChart>
  );
}

Сроки

3–5 типов графиков с кастомными tooltips и интерактивностью — 3–4 дня.