Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/dark-trams-fry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@lg-charts/core': minor
---

Small values including zero will show at least a thin bar (1px line minimum) on Bar charts for
visibility
63 changes: 63 additions & 0 deletions charts/core/src/BarChart.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -208,3 +208,66 @@ export const BarWithCategoryAxisLabel: StoryObj<{
);
},
};

export const BarWithMinimumHeight: StoryObj<{
barMinHeight: number;
}> = {
args: {
barMinHeight: 1,
},
argTypes: {
barMinHeight: {
control: { type: 'number', min: 0, max: 10, step: 1 },
description: 'Minimum height of bars in pixels',
},
},
render: ({ barMinHeight }) => {
// Create data with extreme value differences to demonstrate the feature
const extremeValueData = [
{
name: 'Large Values',
data: [
[new Date('2024-01-01').getTime(), 1000000000],
[new Date('2024-01-02').getTime(), 950000000],
[new Date('2024-01-03').getTime(), 1100000000],
[new Date('2024-01-04').getTime(), 1050000000],
] as Array<[number, number]>,
},
{
name: 'Small Values',
data: [
[new Date('2024-01-01').getTime(), 100],
[new Date('2024-01-02').getTime(), 50],
[new Date('2024-01-03').getTime(), 200],
[new Date('2024-01-04').getTime(), 0],
] as Array<[number, number]>,
},
{
name: 'Medium Values',
data: [
[new Date('2024-01-01').getTime(), 500000],
[new Date('2024-01-02').getTime(), 450000],
[new Date('2024-01-03').getTime(), 550000],
[new Date('2024-01-04').getTime(), 10],
] as Array<[number, number]>,
},
];

return (
<Chart>
<XAxis
type="time"
formatter={value => {
const date = new Date(value);
return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
}}
/>
<YAxis type="value" />
<ChartTooltip />
{extremeValueData.map(({ name, data }) => (
<Bar name={name} data={data} key={name} barMinHeight={barMinHeight} />
))}
</Chart>
);
},
};
11 changes: 10 additions & 1 deletion charts/core/src/Series/Bar/Bar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,28 +37,37 @@ export type BarProps = SeriesProps & {
* - `none`: Other bars will not be affected by the hover. (default)
*/
hoverBehavior?: BarHoverBehavior;

/**
* Minimum height of bar in pixels. Ensures small values (including zero) are still visible.
* Useful when charts have large differences in value magnitudes.
* @default 1
*/
barMinHeight?: number;
};

export const Bar = ({
name,
data,
stack,
hoverBehavior = BarHoverBehavior.None,
barMinHeight = 1,
}: BarProps) => {
const options = useCallback<
(stylingContext: StylingContext) => EChartSeriesOptions['bar']['options']
>(
stylingContext => ({
clip: false,
stack,
barMinHeight,
emphasis: {
focus: getEmphasisFocus(hoverBehavior),
},
itemStyle: {
color: stylingContext.seriesColor,
},
}),
[stack, hoverBehavior],
[stack, hoverBehavior, barMinHeight],
);

return <Series type="bar" name={name} data={data} options={options} />;
Expand Down
Loading