Saya berhasil membuat dan merender bagan di Altair dengan awalan mata uang ($), tetapi saya memerlukan ini untuk disetel ke GBP (£). Saya tahu bahwa ada Vega-lite formatLocale yang dapat disetel, tetapi saya tidak dapat menemukan cara untuk memberikan nilai yang saya perlukan ke Vega-lite. Saya tidak dapat menemukan apa pun di lokal di dokumen 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

screenshot of rendered chart

4
woodbine 19 September 2019, 18:51

1 menjawab

Jawaban Terbaik

Di Altair 4.0 atau yang lebih baru, Anda dapat mengatur lokal format dan lokal format waktu melalui opsi penyematan renderer. Lokal disetel melalui objek JSON yang secara ringkas menentukan bagaimana nilai harus ditampilkan.

Berikut adalah contoh pengaturan penyaji untuk menggunakan format waktu dan mata uang Jerman (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'))
)

enter image description here


Jawaban Asli:

Itu mungkin, tapi sayangnya tidak didukung dengan baik. formatLocale() adalah fungsi javascript yang harus dipanggil oleh renderer. Kode Javascript yang digunakan oleh Jupyter Notebook dan JupyterLab di-hard-code dalam ekstensi vega masing-masing, jadi tidak ada cara untuk mengubah ini untuk bagan Altair yang divisualisasikan di frontend tersebut.

Jika Anda ingin menyesuaikan lokal sendiri, cara termudah adalah mengekspor bagan ke HTML (chart.save('mychart.html')) lalu menambahkan panggilan ke formatLocale di javascript dalam output HTML.

Jika Anda ingin melakukan ini secara lebih otomatis/dapat diulang, Anda dapat memodifikasi templat keluaran html Altair (sumber) dan buat fungsi eksportir Anda sendiri yang mengubah bagan menjadi HTML dengan pengaturan lokal atau javascript khusus lainnya.

4
jakevdp 30 Juli 2020, 15:02