Czy możemy wykreślić dane obrazu w Altair?

Odpowiedzi:

16

Altair posiada znak graficzny, którego można użyć, jeśli chcesz drukować obrazy dostępne pod adresem URL; na przykład:

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'
)

wprowadź opis zdjęcia tutaj

Altair nie nadaje się tak dobrze do wyświetlania dwuwymiarowych tablic danych jak obrazy, ponieważ gramatyka jest zaprojektowana przede wszystkim do pracy ze strukturalnymi danymi tabelarycznymi. Możliwe jest jednak użycie kombinacji spłaszczonych transformat i transformat okiennych .

Oto przykład wykorzystujący dane ze strony, do której linkujesz:

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
)

wprowadź opis zdjęcia tutaj

jakevdp
źródło
Dziękuję @jakevdp. Ty i twoje książki jesteście niesamowici. Czy możemy spodziewać się nowych funkcji w altair-viz, które pozwolą nam wizualizować dane prosto z tablic numpy bez konieczności konwertowania ich na ramkę danych pandy, czy też będziemy musieli polegać na matplotlib przez długi czas?
arjan-hada
Nie, gramatyka Altair jest ściśle powiązana z ustrukturyzowanymi danymi tabelarycznymi. Nie przewiduję, że kiedykolwiek będę wspierać dane określone jako tablice wielowymiarowe bez etykiety.
jakevdp