如何在 Altair 中设置语言环境?

How to set locale in Altair?

我在 Altair 中成功创建并呈现了带有货币前缀 ($) 的图表,但我需要将其设置为英镑 (£)。我知道有一个 Vega-lite formatLocale 可以设置,但我不知道如何将我需要的值传递给 Vega-lite。我在 Altair 文档中找不到有关语言环境的任何内容。

   def chart_tenders_monthly_value(dataframe=None):
        chart = (
            alt.Chart(dataframe, title="Tender value")
                .mark_bar()
                .encode(
                alt.X(
                    "yearmonth(date):O",
                     axis=alt.Axis(title="Month") 
                     ),
                alt.Y("total_monthly_value:Q",
                     axis=alt.Axis(title="Monthly cumulative tender value (£)") 
                     ),
                tooltip=[
                    alt.Tooltip('total_monthly_value:Q', title="Total value", format="$,.4r"), 
                    alt.Tooltip('median_monthly_value:Q', title="Median value", format="$,.4r"),
                    alt.Tooltip('no_of_tenders:Q', title="Total tenders", format=",.2r")
                ],
                color = 'variable:N'
            )
        )

        text = (
            chart.mark_text(align="center", baseline="bottom")
            .encode(text='label:N')
            .transform_calculate(label=f'format(datum.total_monthly_value,"$,.3s")')
        )
        return chart+text

在 Altair 4.0 或更新版本中,您可以通过渲染器嵌入选项设置格式区域设置和时间格式区域设置。语言环境是通过 JSON 对象设置的,这些对象简洁地指定了值的显示方式。

下面是将渲染器设置为使用德国 (DE) 时间和货币格式的示例:

import altair as alt
import pandas as pd
from urllib import request
import json

# fetch & enable a German format & timeFormat locales.
with request.urlopen('https://raw.githubusercontent.com/d3/d3-format/master/locale/de-DE.json') as f:
  de_format = json.load(f)
with request.urlopen('https://raw.githubusercontent.com/d3/d3-time-format/master/locale/de-DE.json') as f:
  de_time_format = json.load(f)
alt.renderers.set_embed_options(formatLocale=de_format, timeFormatLocale=de_time_format)

df = pd.DataFrame({
    'date': pd.date_range('2020-01-01', freq='M', periods=6),
    'revenue': [100000, 110000, 90000, 120000, 85000, 115000]
})

alt.Chart(df).mark_bar().encode(
    y='month(date):O',
    x=alt.X('revenue:Q', axis=alt.Axis(format='$,r'))
)


原答案:

这是可能的,但不幸的是没有得到很好的支持。 formatLocale() 是渲染器必须调用的 javascript 函数。 Jupyter Notebook 和 JupyterLab 使用的 Javascript 代码在各自的 vega 扩展中进行了硬编码,因此无法更改这些前端中可视化的 Altair 图表。

如果您想自己调整语言环境,最简单的方法是将图表导出到 HTML (chart.save('mychart.html')),然后在 javascript 在 HTML 输出中。

如果您想在更多 automatic/repeatable 中执行此操作,您可以修改 Altair 的 html 输出模板 (source) 并创建您自己的导出函数,将图表转换为 HTML 使用语言环境设置或其他自定义 javascript.