我已成功在 Altair 中创建并渲染带有货币前缀 ($) 的图表,但我需要将其设置为 GBP (\xc2\xa3)。我知道有一个formatLocale可以设置的 Vega-lite,但我不知道如何将我需要的值传递给 Vega-lite。我在 Altair 文档中找不到有关区域设置的任何内容。
def chart_tenders_monthly_value(dataframe=None):\n chart = (\n alt.Chart(dataframe, title="Tender value")\n .mark_bar()\n .encode(\n alt.X(\n "yearmonth(date):O",\n axis=alt.Axis(title="Month") \n ),\n alt.Y("total_monthly_value:Q",\n axis=alt.Axis(title="Monthly cumulative tender value (\xc2\xa3)") \n ),\n tooltip=[\n alt.Tooltip(\'total_monthly_value:Q\', title="Total value", format="$,.4r"), \n alt.Tooltip(\'median_monthly_value:Q\', title="Median value", format="$,.4r"),\n alt.Tooltip(\'no_of_tenders:Q\', title="Total tenders", format=",.2r")\n ],\n color = \'variable:N\'\n )\n )\n\n text = (\n chart.mark_text(align="center", baseline="bottom")\n .encode(text=\'label:N\')\n .transform_calculate(label=f\'format(datum.total_monthly_value,"$,.3s")\')\n )\n return chart+text\nRun Code Online (Sandbox Code Playgroud)\n\n\n [![图表显示没有正确格式的数字][1]][1]
我需要格式化这些条上的标签,以便将它们四舍五入到最接近的整数。我有以下代码:
def chart_tender_response_times(dataframe=None):
chart = (
alt.Chart(dataframe, title="Median time to respond to a tender")
.mark_bar()
.encode(
alt.X("year(date):O"
),
alt.Y("mean(median_duration):Q",
## This is our units section, only describe the units of measurement here.
axis=alt.Axis(title="Unit: days.")
),
alt.Tooltip(["mean(median_duration):Q"], format=",.2r", title="Days to respond to a tender")
)
)
text = (
chart.mark_text(align="center", baseline="bottom")
.encode(text='mean(median_duration):Q')
)
return chart+text
Run Code Online (Sandbox Code Playgroud)
我尝试了以下变体...
text = (
chart.mark_text(align="center", baseline="bottom")
.encode(text='mean(median_duration):Q', format='.,2r')
)
Run Code Online (Sandbox Code Playgroud)
但这会返回以下架构验证错误:
SchemaValidationError: Invalid specification
altair.vegalite.v3.api.Chart, validating 'required'
'data' is a required property
Run Code Online (Sandbox Code Playgroud)
我的直觉是,在将值添加到图表之前,我必须以某种方式调用和格式化该值,但我无法从文档或示例中看到如何执行此操作。
我正在处理标题前带有缓冲区行的 csv 文件,行数各不相同,有些行包含字符串,有些行不包含。唯一一致的是,这些缓冲区行在一个或多个单元格中都包含空值,因此我试图跳过具有空单元格的任何行。
我有以下脚本,但它正在输出一个空白文件。我猜我没有进入“其他”,但我猜如果我把它放在一个循环中,我最终会为每一行创建一个文件......
with open(fileName, 'rb') as inf, open("out_"+fileName, 'wb') as outf:
csvreader = csv.DictReader(inf)
if '' in csvreader.fieldnames:
next(csvreader)
else:
fieldnames = ['url_source','downloaded_at'] + csvreader.fieldnames # add column names to beginning
csvwriter = csv.DictWriter(outf, fieldnames)
csvwriter.writeheader()
for node, row in enumerate(csvreader, 1):
csvwriter.writerow(dict(row, url_source=csvUrl, downloaded_at=today))
return
Run Code Online (Sandbox Code Playgroud) 我已成功向 Altair 图表添加自动工具提示,但无法将文本格式设置为货币。
这是我的代码:
contracts = {'date': ['2015-11-12','2020-11-11','2018-02-28','2021-02-27','2019-04-01','2021-03-31','2016-07-02','2019-11-01','2019-04-23','2019-10-14'],
'type': ['Start date','End date','Start date','End date','Start date','End date','Start date','End date','Start date','End date',],
'value': [2200000,2200000,250000,250000,127000,127000,35000,35000,148723,148723],
'supplier': ['Capita','Capita','Deloitte','Deloitte','KPMG','KPMG','Herbert Smith','Herbert Smith','Spend Network','Spend Network'],
'buyer': ['DWP','DWP','MOD','MOD','HMRC','HMRC','MOJ','MOJ','DFID','DFID']
}
df = pd.DataFrame(contracts, columns=['date','type','value','supplier','buyer'])
# Create a selection that chooses the nearest point & selects based on x-value
nearest = alt.selection(type='single', nearest=True, on='mouseover',
fields=['date'], empty='none')
chart = alt.Chart(df, title="Pipeline").mark_point().encode(
alt.X(
'date:T',
scale=alt.Scale(zero=False),
axis=alt.Axis(grid=False)
),
alt.Y(
'supplier:N',
title="",
sort=alt.EncodingSortField(field='yield', op='sum', order='descending'),
scale=alt.Scale(rangeStep=20),
axis=alt.Axis(grid=True)
),
alt.Size('value:Q',
scale=alt.Scale(range=[40, 400]),
legend=alt.Legend(title='Contract size')
), …Run Code Online (Sandbox Code Playgroud)