I. Wprowadzenie

Grafiki SVG w Power BI zapewniają poziom precyzji i możliwości narracyjnych, których nie są w stanie zapewnić standardowe wykresy. Ponieważ SVG jest tylko znacznikiem, każdy piksel – pozycje, kształty, etykiety i interakcje – może być sterowany przez miary i dynamiczne reguły biznesowe. W rezultacie otrzymujemy kompaktowe, spójne wizualizacje (niestandardowe wskaźniki, wykresy punktowe, wykresy kaskadowe, osie czasu, karty wyników, schematy), które pozostają responsywne w stosunku do fragmentatorów, drążenia danych i kontekstu na poziomie wiersza bez zewnętrznych dodatków.

W tym artykule omówimy krok po kroku proces tworzenia wizualizacji SVG od podstaw: wybór układu współrzędnych, powiązanie miar z geometrią, formatowanie tekstu w celu zapewnienia czytelności, nakładanie warstw adnotacji i łączenie interaktywności. Po drodze omówimy najlepsze praktyki (skale, wypełnienie, wyrównanie, dostępność, tokeny kolorów, higiena wydajności) i zwrócimy uwagę na typowe pułapki (nadmierne rysowanie, kolizje etykiet, nadmierne obciążenie DAX i kompromisy związane z konserwacją). Na koniec otrzymasz wzór wielokrotnego użytku, który można dostosować do dowolnego wskaźnika KPI lub układu.

Rozważymy również zalety i wady. Plusy: precyzyjna kontrola pikseli, niewielkie rozmiary, możliwość ponownego wykorzystania modelu semantycznego i płynne dostosowywanie motywów. Minusy: krzywa uczenia się, konieczność dyscypliny w nazewnictwie i testowaniu oraz potencjalne problemy z wydajnością, jeśli znaczniki lub DAX nie są zoptymalizowane. Zrozumienie obu stron pomoże Ci zdecydować, kiedy SVG jest odpowiednim narzędziem, a kiedy natywna grafika jest „wystarczająco dobra”.

Nasz zespół specjalizuje się właśnie w tym: przekształcaniu ulubionych wykresów i wskaźników KPI w w pełni zautomatyzowane, gotowe do produkcji raporty Power BI oparte na niestandardowym SVG. Od systemów odkrywania i projektowania po inżynierię DAX i zarządzanie, wspieramy klientów na każdym etapie, aby ich raporty były nie tylko piękne, ale także łatwe w utrzymaniu, szybkie i godne zaufania.

II. Czym jest SVG

Wizualizacje SVG w Power BI to wizualizacje, które renderują grafikę przy użyciu Scalable Vector Graphics (SVG) – formatu opartego na XML, który pozostaje ostry w każdym rozmiarze. W Power BI zazwyczaj generuje się ciągi SVG w DAX lub Power Query i wyświetla je za pomocą wizualizacji obsługującej HTML/SVG (np. HTML Content, Deneb lub niestandardowe wizualizacje). Pozwala to rysować w pełni niestandardowe kształty (ikony, paski, punktory, paski Gantta, flagi, wykresy sparkline) z dynamicznymi kolorami, rozmiarami i etykietami opartymi na danych.

Dlaczego warto używać SVG w Power BI?

    • Grafika o idealnej rozdzielczości, niezależna od rozdzielczości.
    • Wysoka dynamika: każdy atrybut (kolor, położenie, krycie, tekst) może reagować na miary.
    • Umożliwia tworzenie wykresów niedostępnych w standardowej wersji (wykresy punktowe, mostki kaskadowe, niestandardowe kafelki KPI).

Kompromisy:

    • Większy nakład pracy przy projektowaniu i utrzymaniu (tworzysz znaczniki SVG).

    • Może działać wolniej, jeśli generujesz bardzo duże pliki SVG w każdym wierszu.

    • Dostępność i podpowiedzi wymagają starannego podejścia.

III. Zalety i wady korzystania z SVG

Zalety:

    • Precyzyjna kontrola pikseli

      Dokładne pozycjonowanie, rozmiar i styl każdego elementu (etykiety, znaczniki, kształty) wykraczające poza możliwości natywnych elementów wizualnych.

    • W pełni oparty na danych

      Geometria i tekst mogą reagować na filtry/segmentatory za pośrednictwem DAX, umożliwiając tworzenie wskaźników KPI uwzględniających segmentatory, dynamiczne progi i adnotacje warunkowe.

    • Nieograniczone typy wizualizacji

      Tworzenie niestandardowych wykresów (np. wskaźniki punktowe, niestandardowe wykresy kaskadowe, osie czasu, schematy), które nie są dostępne w standardzie.

    • Spójność marki

      Scentralizuj kolory, typografię i odstępy za pomocą tokenów opartych na miarach, aby zapewnić spójną tematykę w raportach.

    • Lekkie i przenośne

      Brak zewnętrznego niestandardowego kodu wizualnego; SVG to tylko tekst, łatwy do szablonowania, ponownego wykorzystania i wersjonowania w kontroli źródła.

Wady:

    • Stroma krzywa uczenia się

      Wymaga biegłości zarówno w DAX, jak i SVG; debugowanie długich ciągów znaków może być żmudne.

    • Ryzyko związane z utrzymaniem

      Bez ścisłego nazewnictwa i modularyzacji SVG/DAX szybko staje się trudny do odczytania, testowania i rozszerzania.

    • Ograniczona natywna interaktywność

      Podświetlanie krzyżowe, wbudowane podpowiedzi i funkcje ułatwień dostępu są słabsze w porównaniu ze standardowymi elementami wizualnymi.

    • Niuanse związane z eksportowaniem i układem

      Subskrypcje e-mailowe, eksport do formatu PDF i widok mobilny mogą być renderowane w różny sposób; konieczne jest dokładne testowanie.

    • Pułapki związane z wydajnością

      Nadmierne znaczniki, wiele elementów lub intensywne łączenie ciągów znaków (szczególnie w DirectQuery) mogą spowalniać działanie elementów wizualnych.

IV. Najlepsze praktyki dotyczące korzystania z SVG

Istnieje pięć najlepszych praktyk dotyczących używania SVG w raporcie:

  1. Najpierw zaprojektuj tokeny (kolory, rozmiary, odstępy)
    • Scentralizuj styl jako miary (np. __Color_Primary, __Font_S, __Pad_M), aby motywy zmieniały się w jednym miejscu.
    • Przykład:
      VAR cMain = [__Color_Primary]
      VAR f12 = [__Font_S]
  2. Zmodularyzuj SVG (składaj z fragmentów)
    • Stwórz małe miary dla elementów podstawowych (oś, słupki, etykiety) i połącz je.
    • Przykładowy wzorzec:
      __svg_axis(), __svg_bars(), __svg_labels() → CONCATENATEX({[__axis],[__bars],[__labels]},[Value],"")
  3. Użyj stabilnego układu współrzędnych
    • Ustaw viewBox="0 0 W H" i wyprowadź wszystkie pozycje z marginesów oraz szerokości/wysokości wykresu.
    • Przykład:
      VAR W = 280
      VAR mL = 12
      VAR plotW = W - (mL + [mR])
      positions = mL + scaleX(Value)
  4. Bądź bezwzględny w kwestii liczby elementów
    • Ogranicz kształty; w miarę możliwości agreguj; unikaj ciężkich dekoracji poszczególnych punktów.
    • Zmniejsz powtarzające się atrybuty za pomocą grup<g> i wspólnych ciągów klas/stylów.
  5. Higiena wydajności w DAX
    • Buforuj za pomocą VAR i ponownie wykorzystuj; unikaj powtarzania CALCULATE dla tych samych wyników cząstkowych.
    • Twórz znaczniki za pomocą CONCATENATEX w małej tabeli VAR zamiast wielu konkatenacji.
    • Ograniczenia: ograniczaj liczbę wierszy (TOPN), unikaj skomplikowanej logiki dla każdego wiersza w DirectQuery.

V. SVG jako przyszłość zaawansowanych raportów Power BI – prawdziwy przykład

Powyższy obrazek przedstawia wykres tornado pokazujący procentowy rozkład wskaźnika rotacji pracowników według działu i płci.

Jak utworzyć miarę, aby to pokazać? Kod Dax ma ponad 150 wierszy, więc omówię to krok po kroku

Każda wizualizacja SVG wymaga ustawienia kluczowych parametrów wysokości i szerokości wybranego elementu wizualnego.

Kluczowe ustawienia:

  • Wbase = 280 → podstawowa szerokość obszaru roboczego (px/jednostki użytkownika) dla całego SVG.
  • mL, mR, mT, mB = 12 → marginesy lewy/prawy/górny/dolny (wypełnienie) wokół obszaru rysowania.
  • rowH = 34 → wysokość jednego wiersza/pasma kategorii.
  • barH = ROUND(rowH*0.65,0) → grubość słupka ustawiona na ~65% wysokości wiersza (tak, aby pozostało trochę pionowego wypełnienia).

Typowe zastosowanie:

  • Inner plot width = Wbase - mL - mR
  • Row y-position = mT + rowIndex * rowH
  • Bar y = rowY + (rowH - barH)/2 (wyśrodkowuje pasek w rzędzie)

Krótki opis używanych zmiennych:

  • Tokeny kolorów (colF, colM, colDeptTxt) definiują kolory szesnastkowe wielokrotnego użytku dla serii kobiet/mężczyzn i etykiet działów – łatwe tworzenie motywów i spójność.
  • DeptList tworzy odrębną listę działów w bieżącym kontekście filtrowania (z uwzględnieniem fragmentatorów/RLS).
  • ByDept dodaje dwa wskaźniki dla każdego działu: wskaźniki rotacji kobiet (Fv) i mężczyzn (Mv), używając funkcji CALCULATE z KEEPFILTERS, dzięki czemu płeć jest stosowana bez usuwania innych filtrów.
  • MaxV wyszukuje najwyższy wskaźnik rotacji wśród obu płci i wszystkich działów – służy do spójnego skalowania długości pasków w SVG.
  • MaxVnz jest bezpiecznym dzielnikiem (powraca do 1, jeśli wszystko jest ≤0), aby uniknąć dzielenia przez zero w obliczeniach szerokości/pozycji.

Poniżej znajduje się krótki opis użytych zmiennych:

  • W / plotW / gap: całkowita szerokość SVG, szerokość rysowalna po marginesach bocznych (mL, mR) oraz odstępy między kolumną etykiet a słupkami.
  • MaxDeptLen: najdłuższa długość nazwy działu (znaki) z DeptList.
  • labelW_auto: automatyczna szerokość kolumny etykiety, przybliżona na podstawie długości tekstu (~8 px na znak + 28 px wypełnienia).
  • labelW: ostateczna szerokość kolumny etykiety – ograniczona do 48% W i co najmniej 110 px, ale nie mniejsza niż szerokość automatyczna.
  • halfW: szerokość przypisana do każdego z dwóch obszarów wartości (np. kobiety vs mężczyźni) = (plotW − labelW − gap) / 2, z bezpiecznym zabezpieczeniem DIVIDE(..., 0).
  • leftX: początek x pierwszego obszaru wartości = mL + labelW + gap.
  • midX: początek x drugiego obszaru wartości = leftX + halfW (punkt środkowy między dwoma obszarami słupków).

Poniżej znajduje się krótki opis użytych zmiennych:

  • Ranked: rozszerza ByDept o:
  • Szczyt – wyższa wartość obrotu kobiet (Fv) w porównaniu z mężczyznami (Mv) dla każdego działu (PUSTY → 0).
  • Ord – gęsty ranking tego szczytu w poszczególnych działach (najwyższa wartość = pozycja 1), używany do kontrolowania kolejności wierszy w SVG.
  • N: liczba działów (wierszy) po uszeregowaniu → określa liczbę wyświetlanych słupków/etykiet.
  • H: całkowita wysokość SVG = górny margines + dolny margines + N × rowH → zapewnia, że obszar roboczy mieści wszystkie rzędy w rankingu.
Poniżej znajduje się krótki opis użytych zmiennych:
  • Pętla i kolejność: CONCATENATEX(Ranked, … , "", [Ord], ASC) iteruje działy w kolejności rankingowej i łączy SVG każdego wiersza.
  • Geometria wiersza:
    • yTop, yBar, cy ustawiają górę wiersza, pozycję słupka (y) i pionowe wyśrodkowanie tekstu.
    • halfW/midX pojawiły się wcześniej – podział środkowy dla pasków lewego (F) i prawego (M).
  • Wartości i szerokości:
    • fv, mv = wskaźniki kobiet/mężczyzn (PUSTY → 0).
    • wf, wm = szerokości pasków skalowane przez MaxVnz w każdej połowie.
  • Pozycje X:
    • Pasek kobiecy rozciąga się w lewo od środka: fx = midX - wf; etykieta w fcx = midX - wf/2.
    • Pasek męski rozciąga się w prawo od środka: początek mx = midX; etykieta w mcx = midX + wm/2.
  • Rysowanie:
    • Jeśli szerokość > 0, narysuj zaokrąglony <rect> z wypełnieniem colF/colM i wyśrodkowanym <text> pokazującym FORMAT(...,"0.0%"). MAX(w,1) wymusza minimalną szerokość 1 piksela, dzięki czemu małe wartości pozostają widoczne.
    • Tekst wyrównany za pomocą dominant-baseline='middle', text-anchor='middle', z dyFix i fsVal dla pionowej regulacji i rozmiaru czcionki.

Poniżej znajduje się krótki opis użytych zmiennych:

  • Iteracja i kolejność: CONCATENATEX(Ranked, …, "", [Ord], ASC) tworzy pętlę działów w kolejności rankingowej i łączy etykiety SVG.
  • Pozycja pionowa: cy wyśrodkowuje każdą etykietę w swoim wierszu: mT + (ord−1)*rowH + rowH/2.
  • Szerokość skracania: maxChars szacuje, ile znaków zmieści się w lewej kolumnie etykiety na podstawie labelW (≈7 px/znak, minus wypełnienie).
  • Logika wielokropka: deptShort skraca długie nazwy i dodaje , aby tekst nie wykraczał poza kolumnę etykiety.
  • Rysowanie tekstu: wyświetla <text> w punkcie x=mL, y=cy, wyrównane do lewej strony (text-anchor='start'), wyśrodkowane pionowo (dominant-baseline='middle'), z niewielką pionową poprawką dyFix, rozmiarem fsDept i kolorem colDeptTxt.

Poniżej znajduje się krótki opis użytych zmiennych:

  • legendH / HFinal / lY: rezerwuje miejsce na legendę (legendH=26), ustawia ostateczną wysokość SVG HFinal = H + legendH i umieszcza legendę pionowo w punkcie lY = H + legendH/2.
  • lBoxW / lBoxH / lGapItem / cx: rozmiar pola legendy (18×12), odstępy między elementami legendy (70) i poziome wyśrodkowanie obszaru roboczego (cx = W/2).
  • LegendSVG:
    • Owijaj elementy w grupie <g>.
    • Próbka żeńska: zaokrąglony element <rect> wypełniony kolorem colF, umieszczony po lewej stronie środka w punkcie cx - lGapItem, z etykietą umieszczoną bezpośrednio po prawej stronie (+ lBoxW + 6), wyśrodkowany pionowo na lY.
    • Próbka męska: ten sam wzór po prawej stronie środka (przesunięcie cx + 20), wypełniony kolorem colM, z etykietą obok.
    • Tekst wykorzystuje dominant-baseline='middle' + dyFix do precyzyjnego dostosowania wyrównania w pionie oraz fsDept/colDeptTxt do dostosowania rozmiaru/koloru.

Ostateczny render zwraca plik SVG używany w treści HTML (Lite). Przedstawia on wykres tornado.

VI Podsumowanie

SVG w Power BI zapewnia precyzję, możliwość opowiadania historii i prawdziwie niestandardowe wizualizacje, ale wiąże się to z większą krzywą uczenia się i dyscypliną inżynieryjną, aby zapewnić szybkość i łatwość utrzymania. Jeśli chcesz czerpać korzyści bez złożoności, możemy zaprojektować, zbudować i wspierać Twoje wizualizacje SVG od początku do końca w ramach w pełni zautomatyzowanych raportów. Wolisz pozostać w firmie? Oferujemy również specjalistyczne szkolenia, dzięki którym Twój zespół będzie mógł z pewnością tworzyć i utrzymywać wskaźniki KPI oraz wykresy oparte na SVG. Niezależnie od tego, którą opcję wybierzesz, zyskasz kontrolę nad SVG oraz niezawodność, której oczekują Twoi interesariusze.