我们可以在 Altair 中绘制图像数据吗?

Posted

技术标签:

【中文标题】我们可以在 Altair 中绘制图像数据吗?【英文标题】:Can we plot image data in Altair? 【发布时间】:2020-05-18 00:22:18 【问题描述】:

我正在尝试在 altair 中绘制图像数据,特别是尝试在 Jake VDP 的书中的此链接中复制人脸识别示例 - https://jakevdp.github.io/PythonDataScienceHandbook/05.07-support-vector-machines.html

任何人都幸运地在 altair 中绘制图像数据?

【问题讨论】:

【参考方案1】:

Altair 具有image mark,如果您想绘制 URL 上可用的图像,可以使用它;例如:

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

Altair 不太适合将二维数据数组显示为图像,因为该语法主要用于处理结构化表格数据。但是,可以使用 flatten transforms 和 window transforms 的组合。

这是一个使用您链接到的页面中的数据的示例:

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
)

【讨论】:

谢谢@jakevdp。你和你的书都很棒。我们是否可以期待 altair-viz 中的新功能,让我们可以直接从 numpy 数组中可视化数据,而无需将其转换为 pandas 数据帧,还是我们将不得不长期依赖 matplotlib? 不,Altair 的语法与结构化的表格数据密切相关。我预计不会支持指定为未标记的多维数组的数据。

以上是关于我们可以在 Altair 中绘制图像数据吗?的主要内容,如果未能解决你的问题,请参考以下文章

对从大型数据集中聚合的数据使用 Altair

如何在 altair.layered 图中配置条形图?

如何更改 altair 中 geo_shape 的限制(python vega-lite)

如何使 Altair 绘图响应

Altair 等值线图,基于折线图选择的颜色高亮

Python 数据可视化:Altair 使用全解析