¿Podemos trazar datos de imagen en Altair?

Respuestas:

16

Altair presenta una marca de imagen que se puede utilizar si desea trazar imágenes que están disponibles en una URL; por ejemplo:

import altair as alt
import pandas as pd

source = pd.DataFrame.from_records([
      {"x": 0.5, "y": 0.5, "img": "https://vega.github.io/vega-datasets/data/ffox.png"},
      {"x": 1.5, "y": 1.5, "img": "https://vega.github.io/vega-datasets/data/gimp.png"},
      {"x": 2.5, "y": 2.5, "img": "https://vega.github.io/vega-datasets/data/7zip.png"}
])

alt.Chart(source).mark_image(
    width=50,
    height=50
).encode(
    x='x',
    y='y',
    url='img'
)

ingrese la descripción de la imagen aquí

Altair no es tan adecuado para mostrar matrices de datos bidimensionales como las imágenes, porque la gramática está diseñada principalmente para trabajar con datos tabulares estructurados. Sin embargo, es posible hacerlo usando una combinación de transformaciones de aplanamiento y transformaciones de ventana .

Aquí hay un ejemplo usando los datos de la página a la que se vinculó:

import altair as alt
import pandas as pd
from sklearn.datasets import fetch_lfw_people
faces = fetch_lfw_people(min_faces_per_person=60)

data = pd.DataFrame({
    'image': list(faces.images[:12])  # list of 2D arrays
})

alt.Chart(data).transform_window(
    index='count()'           # number each of the images
).transform_flatten(
    ['image']                 # extract rows from each image
).transform_window(
    row='count()',            # number the rows...
    groupby=['index']         # ...within each image
).transform_flatten(
    ['image']                 # extract the values from each row
).transform_window(
    column='count()',         # number the columns...
    groupby=['index', 'row']  # ...within each row & image
).mark_rect().encode(
    alt.X('column:O', axis=None),
    alt.Y('row:O', axis=None),
    alt.Color('image:Q',
        scale=alt.Scale(scheme=alt.SchemeParams('greys', extent=[1, 0])),
        legend=None
    ),
    alt.Facet('index:N', columns=4)
).properties(
    width=100,
    height=120
)

ingrese la descripción de la imagen aquí

jakevdp
fuente
Gracias @jakevdp. Tú y tus libros son increíbles. ¿Podemos esperar nuevas características en altair-viz que nos permitan visualizar datos directamente de matrices numpy sin tener que convertirlos en un marco de datos de pandas o vamos a tener que confiar en matplotlib durante mucho tiempo?
Arjan-hada
No, la gramática de Altair está estrechamente vinculada a datos tabulados estructurados. No preveo que se admitan datos especificados como matrices multidimensionales sin etiquetar.
jakevdp