Під час роботи з бібліотекою візуалізації даних Vega-Altair у мові програмування Python, користувачі можуть стикатися з питанням використання alt.condition() у поєднанні з mark_point() та mark_line(). Проаналізуємо дану проблему та розглянемо можливі альтернативні шляхи вирішення.
Розглянемо зазначений код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import altair as alt import numpy as np import pandas as pd x = np.arange(100) source_1 = pd.DataFrame({'x': x, 'f(x)': np.sin(x / 5)}) source_2 = pd.DataFrame({'x': x, 'f(x)': np.cos(x / 5)}) source_1['Valid'] = source_1['x'].apply(lambda x: x < 50) source_1['Sample'] = 1 source_2['Valid'] = source_2['x'].apply(lambda x: x < 50) source_2['Sample'] = 2 source = pd.concat([source_1, source_2]) curve_mp = alt.Chart(source).mark_point().encode( x='x', y='f(x)', color=alt.condition(alt.expr.datum['Valid'] == True, alt.Color('Sample:N'), alt.ColorValue('lightgrey')), detail='Sample' ) curve_ml = alt.Chart(source).mark_line().encode( x='x', y='f(x)', color=alt.condition(alt.expr.datum['Valid'] == True, alt.Color('Sample:N'), alt.ColorValue('lightgrey')), detail='Sample' ) curve_mp | curve_ml |
У цьому коді ми створюємо два набори даних source_1 та source_2, що містять значення x та f(x) для синусоїди та косинусоїди відповідно. Далі ми додаємо стовпці Valid та Sample, де Valid визначається як значення x менше 50, а Sample присвоюється значення 1 та 2 відповідно для двох джерел даних. Після цього ми об’єднуємо ці два набори даних у source.
Далі ми створюємо дві графічні візуалізації curve_mp та curve_ml за допомогою mark_point() та mark_line() відповідно. Обидва графіки кодують x, y та колір. Колір задається умовно за допомогою alt.condition(): якщо значення Valid дорівнює True, то колір залежить від значення Sample, інакше використовується світло-сірий колір.
Зазначений код працює коректно для графіку curve_mp (точкового графіку), але не для curve_ml (лінійного графіку). Це може бути зумовлено особливостями роботи функцій mark_point() та mark_line() в Vega-Altair.
Для вирішення цієї проблеми ми можемо скористатися альтернативним підходом, а саме створення шару з двома графіками, використовуючи підмножину даних, де значення Valid дорівнює True. У даному випадку, ми створюємо графік curves2:
1 2 3 |
curves2 = alt.Chart(source[source['Valid'] == True]).mark_line().encode(x='x', y='f(x)', color=alt.Color('Sample:N'), detail='Sample') |
Цей підхід дає можливість об’єднати два графіки у шарі та використати підмножину даних, що відповідає умові Valid == True.
Хоча зазначений підхід працює, можливо існують інші альтернативи, які також варто розглянути для вирішення цієї проблеми візуалізації в Vega-Altair.
Дякуємо за увагу!