spec = ({
vconcat: [
{
title: "annual returns, normal distribution params",
width: 250,
height: 150,
mark: { type: "square" },
data: { name: "options" },
params: [
{
name: "option",
select: {
type: "point",
on: "pointerover",
nearest: true,
fields: ["mean", "std_dev"]
}
}
],
encoding: {
x: {
field: "mean",
type: "quantitative",
axis: { format: ".1%" },
scale: { domain: [0, 0.15] }
},
y: {
field: "std_dev",
type: "quantitative",
axis: { format: ".1%" }
},
size: {
value: 100,
condition: { param: "option", value: 400, empty: false }
},
color: {
value: "lightblue",
condition: [
{ param: "option", value: "green", empty: false },
{ test: "datum.std_dev == 0", value: "red", empty: false }
]
}
}
},
{
width: 500,
height: 350,
//resolve: { scale: { x: "independent" } },
layer: [
{
mark: { type: "bar", tooltip: true, clip: false },
encoding: {
x: {
bin: { step: 50000 },
field: "retirement_fund_value",
type: "quantitative",
scale: { zero: true, domain: [0, 2e6] },
axis: {
format: ".2s",
titleFontSize: 20,
values: [2e6, 1e6, 1.5e6, 0.5e6],
grid: true,
gridOpacity: 1
}
},
y: {
aggregate: "count",
title: "count of simulations",
scale: {
zero: true,
domain: [0, num_simulations / 3],
nice: false
},
axis: { grid: false, format: ",.0f", nice: false }
},
order: color ? { field: "simulation_in" } : { sort: "ascending" },
color: color
? {
field: "simulation_in",
type: "nominal",
legend: false
}
: {}
}
},
{
mark: { type: "rule" },
//data: "data_risk_free",
//data: [{ retirement_fund_valuee: 1000000 }],
encoding: {
x: {
//value: 500,
//type: "linear",
//value: "scale('concat_1_layer_0_x',10000)",
field: "retirement_fund_value",
aggregate: "mean",
scale: { type: "linear", zero: true, domain: [0, 2e6] }
},
size: { value: 2 },
color: { value: "green" }
}
},
{
mark: { type: "rule" },
data: { name: "data_risk_free" },
//data: [{ retirement_fund_valuee: 1000000 }],
encoding: {
x: {
//value: 500,
//type: "linear",
//value: "scale('concat_1_layer_0_x',10000)",
field: "retirement_fund_value",
scale: { type: "linear", zero: true, domain: [0, 2e6] }
},
size: { value: 2 },
color: { value: "red" }
}
},
{
mark: { type: "text", align: "left", dx: 20 },
//data: "data_risk_free",
//data: [{ retirement_fund_valuee: 1000000 }],
encoding: {
opacity: { value: 0.2 },
x: {
value: 300
},
y: { value: 100 },
size: { value: 20 },
color: { value: "green" },
text: {
field: "retirement_fund_value",
aggregate: "mean",
format: ",.0f"
}
}
},
text_mark,
text_mark2
]
}
],
data: { name: "data" },
datasets: {
data_risk_free: [
{
retirement_fund_value: retirement_fund_value_risk_free
}
],
data: [],
options /*: _.range(0, 0.101, 0.01)
.map((mean) =>
_.range(0, 0.101, 0.02).map((std_dev) => ({ mean, std_dev }))
)
.flat()*/
//{ mean: 0.05, std_dev: 0.05 },
//{ mean: 0.1, std_dev: 0.1 }
}
//resolve: { scale: { x: "independent" } }
})