Site icon Mirosław Mamczur

#024 Wykres ridgeline (ridgeline plot)

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:

Wady

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

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
Exit mobile version