Альтаир - сюжетный круг, эллипс, аннотации на граненом графике - PullRequest
1 голос
/ 23 июня 2019

Можно ли построить линии и геометрические фигуры внутри диаграммы Альтаира, которые следуют единицам измерения переменных x и y диаграммы? Диаграмма может быть граненой, а формы и линии зависят от данных в каждом конкретном фасете.

Воспроизводимый пример:

import pandas as pd
import numpy as np
import altair as alt
alt.renderers.enable('notebook')

# make some data to test
N = 1000
df = pd.DataFrame({
    'x1': np.random.normal(0, 1, N),
    'x2': np.random.normal(0, 1, N),
    'facet': np.random.choice(list('ABCDEFGHI'), N),
})

# derived variables 
df['y1'] = np.where(np.sqrt(df['x1']**2 + df['x2']**2) > 2, 'F', 'P')
df['y2'] = 0.5*df['x2'] + 2.0 + np.random.normal(0, .5, N)
df['color'] = np.where(df['y1'].eq('F'), 'red', 'green')

# custom color map
domain = ['F', 'P']
range_ = ['red', 'green']

# create and render the chart
p1 = alt.Chart(df).mark_circle(opacity=1, size=15).encode(
    alt.X('x1', scale=alt.Scale(domain=(-4, 4))),
    alt.Y('x2', scale=alt.Scale(domain=(-4, 4))),
    color=alt.Color('y1', scale=alt.Scale(domain=domain, range=range_)),
    facet='facet'
)

# set some additional properties
p1.properties(width=150, height=150, columns=3).resolve_scale()

, который производит следующий вывод:

enter image description here

Q1: Можно ли нарисовать окружность с центром в 0, 0 с радиусом = 2 в каждой из диаграмм, как показано во 2-м фасете?

Единицы измерения круга будут такими же, как единицы измерения x и y. В этом случае x и y могут представлять физическое линейное измерение, где длина на пиксель одинакова по x и y. то есть это может быть дартс.

Аналогия может быть с R решетчатым аспектом xyplot = 'iso'. Смотрите описание аспекта здесь: https://rdrr.io/cran/lattice/man/xyplot.html

Q2: Можно ли добавить текстовую аннотацию в одном углу графика, который считает число «F» (красный) на каждом графике?

В3: Для случаев, когда ось не является "изо" и имеет разные единицы измерения, можно ли построить линию и эллипс (скажем, эллипс с плотностью 95%), как показано на 2-м фасете ниже? Возможно, с уклоном и пересечением линии соответствия, аннотированной на графике?

Пример:

# create and render the chart
p1 = alt.Chart(df).mark_point().encode(
    x='x2',
    y='y2',
    facet='facet'
)

# set some additional properties
p1.properties(width=150, height=150, columns=3).resolve_scale()

enter image description here

В R Lattice эти типы визуализаций выполнялись с использованием 'аспекта', некоторых конкретных функций решетки / сетки и в некоторых случаях написания пользовательской функции 'панели' (фасет), которая имела доступ к индексам данных. в каждом аспекте и может запускать линейные модели в каждом аспекте и отображать результаты.

1 Ответ

1 голос
/ 24 июня 2019

В Altair нет механизма для создания таких аннотаций, за исключением создания данных, лежащих в основе нужных аннотаций, и их рисования в виде обычных слоев диаграммы.

Поддержка общих аннотаций диаграмм является открытой проблемой в Vega иVega-Lite, библиотеки рендеринга, которые использует Altair.

...