Przejdź do treści

#024 Wykres ridgeline (ridgeline plot)

  • Wykresy
  • 6 min read

Wykres ridgeline (czasami nazywany wykresem joyplot) przedstawia rozkład wartości liczbowej dla kilku grup. Rozkład można przedstawić za pomocą histogramów lub wykresów gęstości wyrównanych do tej samej skali poziomej. Wykresy są lekko nałożone na siebie, aby pokazać wyraźniejszy kontrast zmian.

Inaczej mówiąc, to po prostu wykresy gęstości lub histogramy narysowane na tej samej osi OX z lekkim przesunięciem na osi OY.

Zalety

Riedgeline plot posiada wiele zalet, które przyczyniają się do jego popularności jako narzędzia wizualizacji:

  • oferuje czytelny i intuicyjny sposób prezentacji danych,
  • umożliwia porównywanie rozkładów między różnymi grupami lub kategoriami; dzięki temu można łatwo zidentyfikować różnice lub podobieństwa w rozkładach i wyciągnąć wnioski na temat badanych zmiennych,
  • działa dla większej liczby grup, gdzie tradycyjne pojedyncze wykresy gęstości mogą stać się nieczytelne lub zajmują zbyt wiele miejsca,
  • ma estetyczny wygląd, który przyciąga uwagę i sprawia, że dane są bardziej atrakcyjne dla oka; nakładające się krzywe gęstościowe tworzą unikalny wzór, który wyróżnia się na tle innych typów wykresów.

Wady

Jak większość technik wizualizacji danych, riedgeline ma również pewne wady i ograniczenia, które warto wziąć pod uwagę:

  • w przypadku zbyt wielu grup, ilość nakładających się krzywych gęstościowych może sprawić, że wykres stanie się nieczytelny i trudny do interpretacji,
  • riedgeline świetnie wizualizuje różnice w rozkładzie normalnym lub podobnym do niego; w przypadku danych o nieregularnym rozkładzie (takich jak skośne czy wielomodalne), interpretacja może być utrudniona lub prowadzić do błędnych wniosków,
  • wykres w dużym stopniu uzależniony jest od dostosowania parametrów dla rysowania gęstości, które mają wpływ na wygląd krzywych.

Historyczna ciekawostka

Ciekawostką jest, że pierwotnie ta technika wizualizacji danych nazywała się joy plot. Termin ten został zaczerpnięty od nazwy brytyjskiego zespołu muzycznego Joy Division działającego w latach 1976-1980. Duże uznanie zdobyła okładka albumu tego zespołu „Unknown Pleasures” zawierająca bardzo charakterystyczną czarno-białą grafikę nieco przypominającą wykres ridgeline.

Jednak nazwa ta została zmieniona, ponieważ okazało się, że określenie „Joy Division” odnosiło się do sekcji kobiecej w niemieckich obozach koncentracyjnych z czasów II wojny światowej, gdzie przymusowe prostytutki służyły żołnierzom. Mimo tragicznej przeszłości nazwa ta została wybrana przez członków zespołu jako wyraz ich fascynacji historią i jako wyraz kontrastu między radością (ang. joy) a mrocznymi tematami, które poruszali w swojej muzyce.

Ta mroczna historia związana z pochodzeniem nazwy zespołu, a później także wykresu spowodowała, że postanowiono ją zmienić na neutralną.

Ta ciekawostka pokazuje jak kontekst historyczny może wpływać na odbiór danego terminu. Pomimo początkowej inspiracji okładką zespołu Joy Division, decyzja o zmianie nazwy była koniecza, aby oddzielić technikę wizualizacji danych od tragicznych wydarzeń, które legły u podstaw pierwotnej nazwy związanej z zespołem.

Kod w Python

Można podejść do tego na kilka sposobów. Można samemu stworzyć wykres w matplotlib czy plotly. Jednak my idziemy na łatwiznę i wykorzystamy bibliotekę dla tego wykresu joypy.

Wczytajmy najpierw potrzebne biblioteki:

import joypy
import pandas as pd
from matplotlib import pyplot as plt

from platform import python_version
from matplotlib import __version__ as plt_ver

print(f'python: {python_version()}')
print(f'\njoypy: {joypy.__version__}')
print(f'pandas: {pd.__version__}')
print(f'matplotlib: {plt_ver}')

Znalazłem ciekawe dane, które mogą nam się przydać do tego zestawienia. Zawierają dzienne informacje o temperaturze dla różnych miast na świecie. Możesz je pobrać po zalogowaniu się (darmowa rejestracja, jeśli jeszcze nie masz konta) ze strony Kaggle TUTAJ.

Wczytajmy dane:

df_temp = pd.read_csv('../data/city_temperature.csv', low_memory=False)

# drop specific values
df_temp = df_temp[df_temp['AvgTemperature']!=-99.0]

# sample
df_temp[df_temp.Country=='Poland'].sample(3)

Jak widzisz usunąłem rekordy z wartością -99, ponieważ takie wartości odstające zaburzałyby analizę.

Warto zwrócić uwagę, że temperatura została zapisana w Fahrenheitach, zatem dodajmy jeszcze kolumnę ze skalą w stopniach Celsjusza, do której jesteśmy przyzwyczajeni w Polsce.

# Convert temperature from Fahrenheit to Celsius
df_temp['AvgTemp_C'] = round((df_temp['AvgTemperature'] - 32) * 5/9, 2)
df_temp = df_temp.rename(columns={'AvgTemperature': 'AvgTemp_F'})
df_temp[df_temp.Country=='Poland'].sample(3)

Jeszcze zerknijmy na histogram temperatur, czy wszystko jest ok

df_temp.AvgTemp_C.hist();

i możemy ruszać dalej.

Ridgeline dla jednej kolumny

Narysujmy, jak wyglądają rozkłady temperatur dla wszystkich krajów w poszczególnych miesiącach okresu, kiedy zbierane były dane (lata 1995 – 2020). Składnia jest bardzo prosta i przejrzysta:

fig, ax = joypy.joyplot(
    df_temp, 
    column = "AvgTemp_C",
    by = "Month", 
    figsize=(8, 10),
    title="Avg temperature for months \n daily data from: 1995-2020)")

ax[-1].set_xlabel('Temperature (°C)')
plt.show()

Ridgeline dla grupowania

Wybierzmy kilka krajów, które chcemy ze sobą zestawić. Kolejne kolumny przekazujemy jako lista, dlatego warto jeszcze zmodyfikować odrobinę nasz zbiór korzystajac z funkcji pivot.

df_years = df_temp.pivot_table(
    index=['Region', 'Year', 'Month', 'Day'], 
    columns='Country', 
    values='AvgTemp_C') \
    .reset_index()

fig, ax = joypy.joyplot(
    df_years, 
    column = ["Norway", "Poland", "Spain", "Australia", "Nigeria"],
    by = "Month", 
    figsize=(8, 10),
    title="Avg temperature for selected countries\ndaily data from: 1995-2020)",
    legend = True)

ax[-1].set_xlabel('Temperature (°C)')
plt.show()

Na wykresie możemy zaobserwować m.in. zróżnicowanie temperatury w Polsce pomiędzy zimowymi miesiącami a letnimi oraz to, że w Australii lipiec jest zimniejszy niż styczeń!

Mam nadzieję, że teraz wiesz już wszystko na temat wykresu warstwowego!

Pozdrawiam z całego serducha,

Bibliografia

  1. https://r-graph-gallery.com/ridgeline-plot.html
  2. https://www.python-graph-gallery.com/ridgeline-graph-plotly
  3. https://github.com/leotac/joypy
  4. https://en.wikipedia.org/wiki/Ridgeline_plot
  5. https://www.data-to-viz.com/graph/ridgeline.html

2 komentarze do “#024 Wykres ridgeline (ridgeline plot)”

  1. Hej,
    Warto biblioteczką geopy podzielić zbiór na półkule północną i południową i wtedy jest bardziej czytelnie 🙂 Dzięki za namiar na joypy. Chyba mi najbardziej pasuje z wszystkich typów wykresów.

    1. a. i nie dopisałem: dla którejś z półkul robimy przesunięcie na miesiącach (+6) i wtedy możemy już robić analizę zbiorczą dla całej kuli ziemskiej

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Spodobało Ci się? Udostępnij ten post w social mediach! ❤️❤️❤️