图表配置

Altair 提供了许多钩子来配置图表的外观;我们没有时间在这里详细介绍所有可用的选项,但了解如何访问和探索这些配置设置的位置和方法会很有用。

一般来说,可以通过两到三个位置控制图表的外观,每个位置的优先级都高于前一个。

  1. 顶级图表配置。在 Altair 图表的顶层,您可以指定将应用于图表中每个面板或图层的配置设置。

  2. 局部配置设置。通过指定局部配置,可以在局部覆盖顶级设置。

  3. 编码值。如果指定了编码值,它将具有最高优先级,并覆盖其他选项。

让我们看一个示例。

import altair as alt
import numpy as np
import pandas as pd
np.random.seed(42)

data = pd.DataFrame(np.random.randn(100, 2), columns=['x', 'y'])

示例 1:控制标记属性

假设您想控制散点图中标记的颜色:让我们看看实现此目的的三种选项。我们将使用一个简单的正态分布点数据集

alt.Chart(data).mark_point().encode(
    x='x:Q',
    y='y:Q'
)

顶级配置

在顶层,Altair 有一个 configure_mark() 方法,允许您调整标记的许多通用配置设置,还有一个 configure_point() 属性,专门调整点的属性。

您可以在 Jupyter 中通过问号访问文档字符串来查看可用选项

alt.Chart.configure_point?

顶级配置应被视为图表主题:它们是所有图表元素美学的默认设置。让我们使用 configure_point 来设置点的一些属性

alt.Chart(data).mark_point().encode(
    x='x:Q',
    y='y:Q'
).configure_point(
    size=200,
    color='red',
    filled=True
)

有许多局部配置可用;您可以使用 Jupyter 的 tab 补全和帮助功能来探索它们

    alt.Chart.configure_     # then the TAB key to see available configurations

局部标记配置

mark_point() 方法中,您可以传递局部配置,这些配置将覆盖顶级配置设置。参数与 configure_mark 的参数相同。

alt.Chart(data).mark_point(color='green', filled=False).encode(
    x='x:Q',
    y='y:Q'
).configure_point(
    size=200,
    color='red',
    filled=True
)

请注意,这里的“color”和“fill”配置被局部配置覆盖了,但“size”保持不变。

编码配置

最后,优先级最高的设置是“encoding”设置。这里让我们在编码中将颜色设置为“steelblue”

alt.Chart(data).mark_point(color='green', filled=False).encode(
    x='x:Q',
    y='y:Q',
    color=alt.value('steelblue')
).configure_point(
    size=200,
    color='red',
    filled=True
)

这是一个有点刻意的例子,但有助于理解可以设置标记属性的各个位置。

示例 2:图表和轴标题

图表和轴标题会根据数据源自动设置,但有时更改它们会很有用。例如,这是上面数据的直方图

alt.Chart(data).mark_bar().encode(
    x=alt.X('x', bin=True),
    y=alt.Y('count()')
)

我们可以使用编码的 title 参数显式设置轴标题

alt.Chart(data).mark_bar().encode(
    x=alt.X('x', bin=True, title='binned x values'),
    y=alt.Y('count()', title='counts in x')
)

同样,我们可以在图表属性中设置图表的 title 属性

alt.Chart(data).mark_bar().encode(
    x=alt.X('x', bin=True, title='binned x values'),
    y=alt.Y('count()', title='counts in x')
).properties(
    title='A histogram'
)

示例 3:轴属性

如果您想设置轴的属性,包括网格线,可以使用编码的 axis 参数。

alt.Chart(data).mark_bar().encode(
    x=alt.X('x', bin=True, axis=alt.Axis(labelAngle=45)),
    y=alt.Y('count()', axis=alt.Axis(labels=False, ticks=False, title=None))
)

请注意,如果您希望这些值应用于整个图表,也可以在顶级配置中调整它们。例如

alt.Chart(data).mark_bar().encode(
    x=alt.X('x', bin=True),
    y=alt.Y('count()', axis=alt.Axis(labels=False, ticks=False, title=None))
).configure_axisX(
    labelAngle=45
)

示例 4:比例属性和轴限制

每个编码还有一个 scale,允许您调整轴限制和其他比例属性。

alt.Chart(data).mark_point().encode(
    x=alt.X('x:Q', scale=alt.Scale(domain=[-5, 5])),
    y=alt.Y('y:Q', scale=alt.Scale(domain=[-5, 5])),
)

请注意,如果将比例尺缩小到小于数据范围,数据默认会超出比例尺

alt.Chart(data).mark_point().encode(
    x=alt.X('x:Q', scale=alt.Scale(domain=[-3, 1])),
    y=alt.Y('y:Q', scale=alt.Scale(domain=[-3, 1])),
)

不隐藏数据在探索性可视化中是一个有用的默认设置,因为它可以防止您无意中遗漏数据点。

如果您希望标记在比例尺范围之外被裁剪掉,可以设置标记的 clip 属性

alt.Chart(data).mark_point(clip=True).encode(
    x=alt.X('x:Q', scale=alt.Scale(domain=[-3, 1])),
    y=alt.Y('y:Q', scale=alt.Scale(domain=[-3, 1])),
)

另一种有用的方法是将数据“限制”在比例尺的极端范围内,即使超出范围也保持可见

alt.Chart(data).mark_point().encode(
    x=alt.X('x:Q', scale=alt.Scale(domain=[-3, 1], clamp=True)),
    y=alt.Y('y:Q', scale=alt.Scale(domain=[-3, 1], clamp=True)),
).interactive()

示例 5:颜色比例尺

有时手动调整使用的颜色比例尺很有用

from vega_datasets import data
weather = data.seattle_weather()
weather.head()
日期 降水量 最高温度 最低温度 风速 天气
0 2012-01-01 0.0 12.8 5.0 4.7 毛毛雨
1 2012-01-02 10.9 10.6 2.8 4.5
2 2012-01-03 0.8 11.7 7.2 2.3
3 2012-01-04 20.3 12.2 5.6 4.7
4 2012-01-05 1.3 8.9 2.8 6.1
alt.Chart(weather).mark_point().encode(
    x='date:T',
    y='temp_max:Q',
    color='weather:N'
)

您可以使用颜色比例尺属性并参考 Vega 的命名颜色方案来更改颜色方案

alt.Chart(weather).mark_point().encode(
    x='date:T',
    y='temp_max:Q',
    color=alt.Color('weather:N', scale=alt.Scale(scheme="dark2"))
)

或者,您可以通过指定颜色域和颜色范围来创建自己的颜色方案

colorscale = alt.Scale(domain=['sun', 'fog', 'drizzle', 'rain', 'snow'],
                       range=['goldenrod', 'gray', 'lightblue', 'steelblue', 'midnightblue'])

alt.Chart(weather).mark_point().encode(
    x='date:T',
    y='temp_max:Q',
    color=alt.Color('weather:N', scale=colorscale)
)

练习:调整图表

现在花大约 10 分钟练习调整图表的美观性。

使用您在之前练习中最喜欢的可视化图表,并调整其美观性

  • 自定义标记的外观(大小、描边宽度等)

  • 更改轴和图表标题

  • 更改 x 轴和 y 轴的限制

使用 alt.Chart.configure_ 进行 tab 补全来查看各种配置选项,然后使用 ? 查看选项功能的文档。