نمودار میلهای (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 اصلی
| Prop | Type | Default | Description |
|---|---|---|---|
data | Array<object> | - | دادههای نمودار (الزامی) |
keys | string[] | - | کلیدهای داده برای نمایش (الزامی) |
indexBy | string | - | کلید برای محور X (الزامی) |
layout | 'vertical' | 'horizontal' | 'vertical' | جهت نمودار |
groupMode | 'stacked' | 'grouped' | 'stacked' | حالت نمایش چند سری |
padding | number | 0.3 | فاصله بین میلهها |
margin | object | - | حاشیه نمودار |
Props استایل
| Prop | Type | Default | Description |
|---|---|---|---|
borderRadius | number | 0 | شعاع گوشهها |
borderWidth | number | 0 | عرض حاشیه |
enableLabel | boolean | true | نمایش برچسبها |
labelSkipWidth | number | 0 | حداقل عرض برای نمایش برچسب |
labelSkipHeight | number | 0 | حداقل ارتفاع برای نمایش برچسب |
تنظیمات محورها
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>