ui icon indicating copy to clipboard operation
ui copied to clipboard

[bug]: chart not rendering

Open ronijaat opened this issue 1 year ago • 22 comments

Describe the bug

Hey, I am using charts, and everything was working fine, but now suddenly the pie chart is not rendering. This happens when I use two pie charts side by side. but it rendered the data. see the below image

charts-bug

Affected component/components

chart

How to reproduce

no

Codesandbox/StackBlitz link

No response

Logs

No response

System Info

node-20
next-14

Before submitting

  • [X] I've made research efforts and searched the documentation
  • [X] I've searched for existing issues

ronijaat avatar Jul 09 '24 12:07 ronijaat

can you please send the code?

oleksii-sploro avatar Jul 09 '24 13:07 oleksii-sploro

Check to make sure the ChartContainer component has a minimum height class or style attribute e.g: min-h-[300px]. The issue that I had was that I was using the tailwindcss aspect plugin. Removing this allowed my charts to render properly.

jxryft avatar Jul 10 '24 18:07 jxryft

Same problem for me. No examples from shadcn-ui's docs works with next-js 15 and react 19. But if I use a recharts' official example, it works.

borgogelli avatar Jul 11 '24 10:07 borgogelli

You might be experiencing this issue because Recharts is not yet compatible with React 19. If you have upgraded to React 19, you may need to wait for Recharts to update or revert to a compatible version to resolve the issue.

https://github.com/shadcn-ui/ui/issues/4231

muhammetakalan avatar Jul 12 '24 13:07 muhammetakalan

You might be experiencing this issue because Recharts is not yet compatible with React 19. If you have upgraded to React 19, you may need to wait for Recharts to update or revert to a compatible version to resolve the issue.

#4231

Rechart 2.13.0-alpha.4 with React 19.0.0-beta works fine with NextJs 15. Only shadcn's chart examples doesn't work.

borgogelli avatar Jul 12 '24 21:07 borgogelli

react-is is breaking in recharts 2.13.0-alpha.4 & react 19 / next 15.

You need to manually override this in your package.json

"dependencies": {
    "react-is": "19.0.0-rc-6f23540c7d-20240528"
},
"overrides": {
    "recharts": {
        "react-is": "$react-is"
    }
}

See below thread over at recharts. https://github.com/recharts/recharts/issues/4558#issuecomment-2135604065

Updating the above has shadcn charts working on my next 15 / react 19 project with recharts alpha.

May need to update below screenshot in the docs. Screenshot 2024-07-13 at 1 45 44 AM

dludemann avatar Jul 13 '24 05:07 dludemann

The charts are not visible for me as well.

Only when explicitly setting width and height props for the recharts Chart Component (e.g. BarChart or LineChart), the chart is visible. However, responsiveness is lost due to this. Seems like the ChartContainer wrapper around ResponsiveContainer does not work?

Any suggestions?

AlexSchwabauer avatar Jul 18 '24 07:07 AlexSchwabauer

Check to make sure the ChartContainer component has a minimum height class or style attribute e.g: min-h-[300px]. The issue that I had was that I was using the tailwindcss aspect plugin. Removing this allowed my charts to render properly.

If you are using the @tailwindcss/aspect-ratio plugin, you can follow the instructions on the "Compatibility with default aspect-ratio utilities" section of the readme to support the default aspect-ratio utilities these charts rely on.

ryanburns23 avatar Jul 18 '24 19:07 ryanburns23

The charts are not visible for me as well.

Only when explicitly setting width and height props for the recharts Chart Component (e.g. BarChart or LineChart), the chart is visible. However, responsiveness is lost due to this. Seems like the ChartContainer wrapper around ResponsiveContainer does not work?

Any suggestions?

See my above suggestion if you are using React 19 or Next 15 https://github.com/shadcn-ui/ui/issues/4231#issuecomment-2226782779

By forcing the rc version of react-is (which supports react 19 rc / 15 rc) the shadcn examples work out of the box and the ChartContainer is responsive for me using the min-h that shadcn tells you to.

react-is is a dependency for recharts that hasn't been updated yet in the recharts package. Hence, why you need to force the update.

dludemann avatar Jul 18 '24 19:07 dludemann

Running into the same issue here with React 19 + Next 15. Tried all of the suggestions posted so far and still cannot get a responsive chart to render.

Examples taken directly from the recharts docs render normally when explicitly setting width and height, however the ResponsiveContainer examples do not render.

Was able to reproduce on a new create-next-app project while trying all of the fixes above, tested on Firefox 128 and Chromium 125.0.6422.141.

emkooz avatar Jul 18 '24 22:07 emkooz

Same for me here with Next JS 14, React 18. I will investigate more during the day EDIT : I modified the ChartContainer component by removing the wrapper div and this solved the issue for me.

AlexandreLrz avatar Jul 20 '24 14:07 AlexandreLrz

I got the same issue, charts are not visible (in shadcn examples) with Nextjs 15-rc and React 19-rc! (just a try) Working fine with Nextjs 14 and React 18

To reproduce: simple replace shadcn/apps/www/package.json with next: 15.0.0-rc.0 and react: rc and react-dom: rc

thanhlq avatar Jul 23 '24 08:07 thanhlq

The main issue is that charts don't render correctly with dynamic data.

"First bug I found on GitHub."🫡

ronijaat avatar Jul 23 '24 08:07 ronijaat

Goodmorging at least for me,

I encountered the same issue where the Shadcn chart would not render, and I managed to solve it after through investigation. The primary problem seemed to be that wrapping a div, card, or any other element outside the ChartContainer prevents the chart from rendering. I tried the suggestion by AlexandreLrz to remove the wrapper div, which worked temporarily but wasn't an ideal solution for my needs.

To get to the bottom of this, I created a new Next.js 14 app and meticulously set it up by installing charts, shadcn, Tailwind CSS, and other necessary dependencies. Upon rendering a chart, it worked perfectly fine!

I didn't stop there. I conducted a comprehensive comparison of the package.json, tailwind.config.js, and other configuration files between my new working setup and the problematic one. I examined dependencies, configurations, and potential conflicts thoroughly.

After extensive debugging, I discovered that removing require("@tailwindcss/aspect-ratio") from the plugins section in tailwind.config.js resolved the rendering issue. Once this line was removed, the charts rendered flawlessly without any further problems. To double-check, I added the aspect-ratio plugin to the new app, which caused the chart to stop rendering. This confirmed that the plugin was the culprit, interfering with the ChartContainer in some way.

I hope i save some debug time for you guys to day!

SsyraxX avatar Aug 07 '24 07:08 SsyraxX

Removing the wrapper div worked for me (React 18, Next.js 14). I guess the chart needs to be a separate component.

RakeshPotnuru avatar Aug 07 '24 08:08 RakeshPotnuru

the issue for me was that the shadcn example used max-h-[250px] in the ChartContainer component, while the documentation states to use min-h-[your-height]. So, after replacing max with min everything worked correctly.

MoDev2002 avatar Aug 13 '24 08:08 MoDev2002

for people using yarn this is what worked for me:

  "resolutions": {
    "react-is": "^19.0.0-rc-2d2cc042-20240809"
  },

cloudorbush avatar Aug 15 '24 07:08 cloudorbush

My chart not render with dynamic data, I am using React 18 and this is my code:

export function PieChartCustom({ chartData = [], datakey, namekey }) {
  return (
    <ChartContainer
      config={chartConfig}
      className="min-h-[250px]"
    >
      <PieChart>
        <ChartTooltip
          cursor={false}
          content={<ChartTooltipContent hideLabel />}
        />
        <Pie data={chartData} dataKey={datakey} nameKey={namekey} />
      </PieChart>
    </ChartContainer>
  )
}

victorbr988 avatar Aug 23 '24 02:08 victorbr988

I'm using a LineChart and the line is not rendering, Nextjs 14 and React 18

mohamedamara1 avatar Aug 26 '24 14:08 mohamedamara1

Goodmorging at least for me,

I encountered the same issue where the Shadcn chart would not render, and I managed to solve it after through investigation. The primary problem seemed to be that wrapping a div, card, or any other element outside the ChartContainer prevents the chart from rendering. I tried the suggestion by AlexandreLrz to remove the wrapper div, which worked temporarily but wasn't an ideal solution for my needs.

To get to the bottom of this, I created a new Next.js 14 app and meticulously set it up by installing charts, shadcn, Tailwind CSS, and other necessary dependencies. Upon rendering a chart, it worked perfectly fine!

I didn't stop there. I conducted a comprehensive comparison of the package.json, tailwind.config.js, and other configuration files between my new working setup and the problematic one. I examined dependencies, configurations, and potential conflicts thoroughly.

After extensive debugging, I discovered that removing require("@tailwindcss/aspect-ratio") from the plugins section in tailwind.config.js resolved the rendering issue. Once this line was removed, the charts rendered flawlessly without any further problems. To double-check, I added the aspect-ratio plugin to the new app, which caused the chart to stop rendering. This confirmed that the plugin was the culprit, interfering with the ChartContainer in some way.

I hope i save some debug time for you guys to day!

This is exactly what I did and Charts started working again, remove that plugin and uninstall that!

ctff-kongchang avatar Aug 28 '24 22:08 ctff-kongchang

My chart not render with dynamic data, I am using React 18 and this is my code:

export function PieChartCustom({ chartData = [], datakey, namekey }) {
  return (
    <ChartContainer
      config={chartConfig}
      className="min-h-[250px]"
    >
      <PieChart>
        <ChartTooltip
          cursor={false}
          content={<ChartTooltipContent hideLabel />}
        />
        <Pie data={chartData} dataKey={datakey} nameKey={namekey} />
      </PieChart>
    </ChartContainer>
  )
}

I solved my problem, it turns out that in my data structure, the nameKey value was a string and not a number

victorbr988 avatar Aug 28 '24 23:08 victorbr988

I manage to fix it by forcing two things:

  • value: Number instead of String
  • adding width and height to <PieChart> component.

It's working even with dynamic data!

Example:

import { convertCategoriesToChartConfigAndData } from '@/app/lib/chart-utils';
import { Cell, Pie, PieChart, ResponsiveContainer } from 'recharts';

export function ChartTestComponent() {
  const dataTest = [
    {
      name: 'rent',
      value: 150.00, //previously was value: '150.00',
      fill: '#f9a653',
    },
    {
      name: 'entertainment',
      value: 189.20, //previously was value: '189.20',
      fill: '#4BC0C0',
    },
  ];

  return (
    <ResponsiveContainer>
      <PieChart width={800} height={400}>
        <Pie
          data={dataTest}
          cx={120}
          cy={200}
          innerRadius={60}
          outerRadius={80}
          paddingAngle={5}
          dataKey='value'
        >
          {dataTest.map((category, index) => (
            <Cell key={`cell-${index}`} fill={category.fill} />
          ))}
        </Pie>
      </PieChart>
    </ResponsiveContainer>
  );
}

caiolv avatar Oct 01 '24 23:10 caiolv

I solved it using this CSS code in my global stylesheet file:

.recharts-responsive-container {
    height: initial !important;
}

Component code:

export function SimpleBarChart() {
    return (
        <Card>
            <CardHeader>
                <CardTitle>Bar Chart</CardTitle>
                <CardDescription>January - June 2024</CardDescription>
            </CardHeader>
            <CardContent>
                <ChartContainer className="min-h-[300px]" config={chartConfig}>
                    <BarChart accessibilityLayer data={chartData}>
                        <CartesianGrid vertical={false} />
                        <XAxis
                            dataKey="month"
                            tickLine={false}
                            tickMargin={10}
                            axisLine={false}
                            tickFormatter={(value) => value.slice(0, 3)}
                        />
                        <ChartTooltip
                            cursor={false}
                            content={<ChartTooltipContent hideLabel />}
                        />
                        <Bar
                            dataKey="desktop"
                            fill="var(--color-desktop)"
                            radius={8}
                        />
                    </BarChart>
                </ChartContainer>
            </CardContent>
            <CardFooter className="flex-col items-start gap-2 text-sm">
                <div className="flex gap-2 font-medium leading-none">
                    Trending up by 5.2% this month{' '}
                    <TrendingUp className="h-4 w-4" />
                </div>
                <div className="leading-none text-muted-foreground">
                    Showing total visitors for the last 6 months
                </div>
            </CardFooter>
        </Card>
    )
}

devcarlosmolero avatar Oct 10 '24 11:10 devcarlosmolero

for people using yarn this is what worked for me:

  "resolutions": {
    "react-is": "^19.0.0-rc-2d2cc042-20240809"
  },

This is the thing which is the main problem with React 19 RC and NextJS 15 RC. Otherwise you wont see any SVG in your code. So definitely not a HTML/CSS issue.

logemann avatar Oct 13 '24 13:10 logemann

I manage to fix it by forcing value to be a Number instead of String and adding width and height to PieChart component. It's working even with dynamic data!

For example, in this component

import { convertCategoriesToChartConfigAndData } from '@/app/lib/chart-utils';
import { Cell, Pie, PieChart, ResponsiveContainer } from 'recharts';

export function ChartTestComponent() {
  const dataTest = [
    {
      name: 'rent',
      value: '150.00',
      fill: '#f9a653',
    },
    {
      name: 'entertainment',
      value: '189.20',
      fill: '#4BC0C0',
    },
    {
      name: 'random',
      value: '5.55',
      fill: '#00ff5a',
    },
  ];

  return (
    <ResponsiveContainer>
      <PieChart width={800} height={400}>
        <Pie
          data={dataTest}
          cx={120}
          cy={200}
          innerRadius={60}
          outerRadius={80}
          paddingAngle={5}
          dataKey='value'
        >
          {dataTest.map((category, index) => (
            <Cell key={`cell-${index}`} fill={category.fill} />
          ))}
        </Pie>
      </PieChart>
    </ResponsiveContainer>
  );
}

Change dataTest to

  const dataTest = [
    {
      name: 'rent',
      value: 150.00, //here
      fill: '#f9a653',
    },
    {
      name: 'entertainment',
      value: 189.20, //here
      fill: '#4BC0C0',
    },
    {
      name: 'random',
      value: 5.55, //and here
      fill: '#00ff5a',
    },
  ];

Thanks, this solved my problem

ruimarcosjoao avatar Oct 23 '24 21:10 ruimarcosjoao

I finally solved it, nothing I searched for worked, but I found a way to solve it by trying. First I'll explain my problem:

I was trying to use literally any chart from the ones in the documentation, but NONE of them showed me the graphic part of the chart, the text, but nothing about the chart. The error was that all the charts in the documentation are without the width and height defined.

It was quite a headache to guess that the BarChart component requires you to pass its dimensions as a parameter (without being required/mandatory by the component itself!!!)

<BarChart width={500} height={250}>

[edit] Oh and I'd like to mention in case you're wondering, yes, I'm on the latest version of React and Next.

lucarosato1 avatar Oct 24 '24 01:10 lucarosato1

@lucarosato1, width and heigh shouldn't be needed for the shadcn components. The BarChart example from their docs renders just fine as is.

arno-fukuda avatar Oct 24 '24 01:10 arno-fukuda

@lucarosato1, width and heigh shouldn't be needed for the shadcn components. The BarChart example from their docs renders just fine as is.

Hmm that's weird because I literally copied and pasted it into a new and clean Shadcn and Next project and nothing of the graphic is visible until I manually enter the dimensions (tested in Firefox, Safari and Brave)

lucarosato1 avatar Oct 24 '24 03:10 lucarosato1

Hmm that's weird because I literally copied and pasted it into a new and clean Shadcn and Next project and nothing of the graphic is visible until I manually enter the dimensions (tested in Firefox, Safari and Brave)

A new and clean Next project will be on 15.0.1 with React 19-rc. That's why you still have to override the react-is dependency.

arno-fukuda avatar Oct 24 '24 05:10 arno-fukuda

e

god that is absurd I wasted so much time trying to figure it out only for it to be that :( that sucks, also is there a way to not have to define the width so it takes up full like w-full tailwind?

FifthWit avatar Oct 25 '24 02:10 FifthWit