پرتوپرتو

نمودار میله‌ای (Bar Chart)

کامپوننت نمایش داده در نمودار میله‌ای

معرفی

کامپوننت PartoBarChart برای نمایش داده‌ها به صورت نمودار میله‌ای استفاده می‌شود. این کامپوننت به‌طور خودکار از تم رنگی سیستم طراحی استفاده می‌کند.

پیش‌نمایش

استفاده

import { PartoBarChart } from '@parto/ui';

const data = [
  { ماه: 'فروردین', فروش: 50, هزینه: 32 },
  { ماه: 'اردیبهشت', فروش: 80, هزینه: 45 },
  { ماه: 'خرداد', فروش: 65, هزینه: 40 },
  { ماه: 'تیر', فروش: 95, هزینه: 58 },
];

<div className="h-[400px]">
  <PartoBarChart
    data={data}
    keys={['فروش', 'هزینه']}
    indexBy="ماه"
    margin={{ top: 20, right: 20, bottom: 50, left: 60 }}
    padding={0.3}
  />
</div>

چند سری داده

const data = [
  { ماه: 'فروردین', فروش: 50, هزینه: 30 },
  { ماه: 'اردیبهشت', فروش: 75, هزینه: 45 },
  { ماه: 'خرداد', فروش: 60, هزینه: 40 },
  { ماه: 'تیر', فروش: 90, هزینه: 55 },
];

<PartoBarChart
  data={data}
  keys={['فروش', 'هزینه']}
  indexBy="ماه"
/>

حالت گروهی

<PartoBarChart
  data={data}
  keys={['فروش', 'هزینه']}
  indexBy="ماه"
  groupMode="grouped"
  padding={0.2}
/>

افقی

<PartoBarChart
  data={data}
  keys={['مقدار']}
  indexBy="ماه"
  layout="horizontal"
  margin={{ top: 20, right: 150, bottom: 50, left: 60 }}
/>

با تنظیمات پیشرفته

<PartoBarChart
  data={data}
  keys={['فروش']}
  indexBy="ماه"
  margin={{ top: 20, right: 20, bottom: 50, left: 60 }}
  padding={0.3}
  valueScale={{ type: 'linear' }}
  indexScale={{ type: 'band', round: true }}
  borderRadius={4}
  borderWidth={1}
  axisTop={null}
  axisRight={null}
  axisBottom={{
    tickSize: 5,
    tickPadding: 5,
    tickRotation: 0,
    legend: 'ماه',
    legendPosition: 'middle',
    legendOffset: 40,
  }}
  axisLeft={{
    tickSize: 5,
    tickPadding: 5,
    tickRotation: 0,
    legend: 'فروش',
    legendPosition: 'middle',
    legendOffset: -50,
  }}
  enableLabel={true}
  labelSkipWidth={12}
  labelSkipHeight={12}
/>

Props اصلی

PropTypeDefaultDescription
dataArray<object>-داده‌های نمودار (الزامی)
keysstring[]-کلیدهای داده برای نمایش (الزامی)
indexBystring-کلید برای محور X (الزامی)
layout'vertical' | 'horizontal''vertical'جهت نمودار
groupMode'stacked' | 'grouped''stacked'حالت نمایش چند سری
paddingnumber0.3فاصله بین میله‌ها
marginobject-حاشیه نمودار

Props استایل

PropTypeDefaultDescription
borderRadiusnumber0شعاع گوشه‌ها
borderWidthnumber0عرض حاشیه
enableLabelbooleantrueنمایش برچسب‌ها
labelSkipWidthnumber0حداقل عرض برای نمایش برچسب
labelSkipHeightnumber0حداقل ارتفاع برای نمایش برچسب

تنظیمات محورها

axisBottom={{
  tickSize: 5,        // اندازه تیک
  tickPadding: 5,     // فاصله تیک
  tickRotation: 0,    // چرخش برچسب
  legend: 'عنوان',    // عنوان محور
  legendPosition: 'middle',  // موقعیت عنوان
  legendOffset: 40,   // فاصله عنوان
}}

تم‌بندی خودکار

این کامپوننت به‌طور خودکار:

  • از رنگ‌های تعریف شده در CSS Variables استفاده می‌کند
  • با تم dark/light سازگار است
  • tooltip را با رنگ پس‌زمینه مناسب نمایش می‌دهد
  • محورها و برچسب‌ها با رنگ foreground نمایش داده می‌شوند

نکات بهینه‌سازی

  • برای داده‌های زیاد از labelSkipWidth و labelSkipHeight استفاده کنید
  • margin را بر اساس طول برچسب‌ها تنظیم کنید
  • در موبایل layout="horizontal" بهتر است
  • برای نمودارهای پیچیده groupMode="grouped" واضح‌تر است

ملاحظات RTL

  • محور افقی از راست به چپ خوانده می‌شود
  • برچسب‌ها راست‌چین هستند
  • Legend ها در موقعیت مناسب RTL قرار می‌گیرند
  • داده‌ها می‌توانند فارسی باشند

مثال کامل در کارت

<Card>
  <CardHeader>
    <CardTitle>گزارش فروش ماهانه</CardTitle>
    <CardDescription>مقایسه فروش و هزینه</CardDescription>
  </CardHeader>
  <CardContent>
    <div className="h-[400px]">
      <PartoBarChart
        data={data}
        keys={['فروش', 'هزینه']}
        indexBy="ماه"
        margin={{ top: 20, right: 20, bottom: 50, left: 60 }}
        padding={0.3}
        groupMode="grouped"
        axisBottom={{
          tickSize: 5,
          tickPadding: 5,
          tickRotation: 0,
        }}
        axisLeft={{
          tickSize: 5,
          tickPadding: 5,
          tickRotation: 0,
        }}
      />
    </div>
  </CardContent>
</Card>