第七章:讓圖表更專業 - Recharts 進階客製化與視覺升級

在上一章中,我們用 Recharts 輕鬆畫出了預設的長條圖。通常當你把這個畫面拿給客戶或老闆看時,他們第一眼會覺得「哇,很酷!」 但是,過了五分鐘後,他們挑剔的眼睛就會開始發揮作用,並提出下一個要求:「這個滑鼠移上去的黑盒子 (Tooltip) 看起來有點死板,可以改顏色嗎?字可以大一點嗎?」、「這個長條圖的純色看起來有點像 Excel 畫出來的,可以弄得像 Apple 發表會那種漸層感嗎?」

很多工程師聽到這種「外觀客製化」的需求會感到頭痛,因為改底層套件的樣式往往要翻遍厚厚的官方文件。 但這章我們將教你如何使用 Vibe Prompt,瞬間打破套件的預設樣式,客製化出極度專業的商業圖表,讓你的報價再翻一倍!

🎯 本章目標

  1. 學習如何完全客製化 Recharts 的 Tooltip,結合 Tailwind 的毛玻璃特效。
  2. 替換圖表長條的顏色為高質感的 SVG 漸層色 (Gradient)。
  3. 掌握圖表響應式 (Responsive) 設計中的常見破版陷阱與解法。

🎨 第一步:客製化 Tooltip (自訂提示框)

預設的 Tooltip 是一個白底黑字的方塊。我們要把它改成帶有 Tailwind 毛玻璃效果 (Glassmorphism) 的高質感設計。 在 Recharts 中,要修改 Tooltip,我們必須寫一個自訂的 React 元件,然後把它當作 content 屬性傳遞給 <Tooltip>

🔥【Vibe Prompt 實戰咒語】 我在使用 Recharts,我需要客製化 <Tooltip />。 請幫我寫一個 CustomTooltip 元件,它會接收 active, payload, label 三個參數。 當 active 為 true 且 payload 有資料時,請回傳一個使用 Tailwind CSS 的 div: 1. 背景要用半透明玻璃感 (bg-white/80 backdrop-blur-md)。 2. 要有柔和的陰影 (shadow-lg) 與圓角 (rounded-xl)。 3. 第一行印出 label (代表日期),字體要加粗。 4. 第二行印出「準時」的人數 (抓取 payload[0].value),文字設為綠色 (text-emerald-600)。 5. 第三行印出「遲到」的人數 (抓取 payload[1].value),文字設為紅色 (text-rose-500)。 請給我完整的元件程式碼,並示範如何掛載到 BarChart 裡面。

AI 會完美地幫你產出這個客製化元件:

const CustomTooltip = ({ active, payload, label }: any) => {
  // 防呆:確保游標真的移上去了,且真的有資料
  if (active && payload && payload.length) {
    return (
      <div className="bg-white/80 backdrop-blur-md p-4 rounded-xl shadow-lg border border-slate-100 min-w-[150px]">
        <p className="font-bold text-slate-800 mb-3 pb-2 border-b border-slate-200">{label}</p>
        <div className="space-y-1">
          <p className="text-emerald-600 font-semibold flex justify-between">
            <span>準時:</span> <span>{payload[0].value} 人</span>
          </p>
          <p className="text-rose-500 font-semibold flex justify-between">
            <span>遲到:</span> <span>{payload[1].value} 人</span>
          </p>
        </div>
      </div>
    );
  }
  return null;
};

// 💡 在你的主圖表程式碼中這樣使用:
// <Tooltip content={<CustomTooltip />} cursor={{ fill: '#F1F5F9' }} />

🌈 第二步:加入靈魂漸層色 (Gradients)

純色的長條圖太死板了。讓我們加上漂亮的漸層色! 在網頁繪圖 (SVG) 中,定義漸層色需要寫 <defs><linearGradient> 標籤。這對新手來說根本是天書,但對 AI 來說只是小菜一碟。

🔥【Vibe Prompt 實戰咒語】 請幫我在 Recharts 的 BarChart 裡面定義兩個 SVG 漸層色 (linearGradient)。 請把它們包在 <defs> 標籤中。 第一個漸層 id="colorSuccess",從上到下漸層,顏色從淺綠 (#34D399) 到深綠 (#059669)。 第二個漸層 id="colorLate",從上到下漸層,顏色從淺紅 (#F87171) 到深紅 (#DC2626)。 請教我如何把這兩個漸層套用到下方 <Bar /> 元件的 fill 屬性上。

AI 會告訴你,只要把這段加進去即可:

<BarChart data={data}>
  {/* 定義魔法調色盤 */}
  <defs>
    <linearGradient id="colorSuccess" x1="0" y1="0" x2="0" y2="1">
      <stop offset="5%" stopColor="#34D399" stopOpacity={1}/>
      <stop offset="95%" stopColor="#059669" stopOpacity={1}/>
    </linearGradient>
    <linearGradient id="colorLate" x1="0" y1="0" x2="0" y2="1">
      <stop offset="5%" stopColor="#F87171" stopOpacity={1}/>
      <stop offset="95%" stopColor="#DC2626" stopOpacity={1}/>
    </linearGradient>
  </defs>

  {/* 套用調色盤 (注意 url(#id) 的語法) */}
  <Bar dataKey="準時" fill="url(#colorSuccess)" radius={[4, 4, 0, 0]} />
  <Bar dataKey="遲到" fill="url(#colorLate)" radius={[4, 4, 0, 0]} />
</BarChart>

現在,你的圖表不僅有圓角,還散發著科技感的漸層光澤,搭配上滑鼠懸停時的高級毛玻璃浮窗。這已經是世界頂尖軟體公司的 UI 水準了!

💼 [商業實戰:響應式破版急救]

圖表做得很美,但當老闆用他的 iPhone 打開後台時,圖表突然擠成一團,或是超出螢幕,這是新手最常犯的錯。 Recharts 必須包在 <ResponsiveContainer> 裡面,但這還不夠,外層的父元素必須設定明確的高度 (例如 h-[300px]),否則 <ResponsiveContainer height="100%"> 會找不到參考依據而塌陷成高度 0。

下次如果在手機版看到圖表不見了,直接用這個指令找 AI 討救兵:「我的 Recharts 包在 ResponsiveContainer 裡,但在手機版高度塌陷變成 0,請幫我檢查外層 Tailwind 的高度設定並修正。」

✅ 本章小結

遇到套件功能不夠用時,千萬不要回去自己刻 <div> 或底層 Canvas。 99% 的主流套件 (如 Recharts、MUI、Antd) 都提供了極強大的客製化接口。你只要把「需求與外觀畫面」用白話文告訴 AI,它就能幫你把複雜的底層 API 寫出來。這就是現代全端工程師必備的「搭積木加雕刻」能力!

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!