Public
Edited
Jan 11, 2024
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
function plot_figure() {
let path_data = []
let utility_data = []
let data_points = [0, unemployment_benefits_length, unemployment_length, 52]
path_data.push({'line': 'empl_path', 't': data_points[0], 'y': wage, 'stroke': '#0000ff'})
path_data.push({'line': 'empl_path', 't': data_points[2], 'y': wage, 'stroke': '#0000ff'})
//path_data.push({'line': 'empl_path', 't': data_points[3], 'y': wage, 'stroke': '#0000ff'})
path_data.push({'line': 'unempl_path', 't': data_points[0], 'y': wage, 'stroke': '#ff0000'})
path_data.push({'line': 'unempl_path', 't': data_points[0], 'y': unemployment_benefits, 'stroke': '#ff0000'})
path_data.push({'line': 'unempl_path', 't': data_points[1], 'y': unemployment_benefits, 'stroke': '#ff0000'})
if (unemployment_benefits_length < unemployment_length) {
path_data.push({'line': 'unempl_path', 't': data_points[1], 'y': 0, 'stroke': '#ff0000'})
path_data.push({'line': 'unempl_path', 't': data_points[2], 'y': 0, 'stroke': '#ff0000'})
} else {
path_data.push({'line': 'unempl_path', 't': data_points[1], 'y': unemployment_benefits, 'stroke': '#ff0000'})
path_data.push({'line': 'unempl_path', 't': data_points[2], 'y': unemployment_benefits, 'stroke': '#ff0000'})
}
path_data.push({'line': 'unempl_path', 't': data_points[2], 'y': new_wage, 'stroke': '#ff0000'})
//path_data.push({'line': 'unempl_path', 't': data_points[3], 'y': new_wage, 'stroke': '#ff0000'})
utility_data.push({'line': 'disutil_eff', 't': data_points[0], 'y': unemployment_benefits + disutility_of_effort, 'stroke': '#000000'})
utility_data.push({'line': 'disutil_eff', 't': data_points[1], 'y': unemployment_benefits + disutility_of_effort, 'stroke': '#000000'})
if (unemployment_benefits_length < unemployment_length) {
utility_data.push({'line': 'disutil_eff', 't': data_points[1], 'y': disutility_of_effort, 'stroke': '#000000'})
utility_data.push({'line': 'disutil_eff', 't': data_points[2], 'y': disutility_of_effort, 'stroke': '#000000'})
} else {
utility_data.push({'line': 'disutil_eff', 't': data_points[1], 'y': unemployment_benefits + disutility_of_effort, 'stroke': '#000000'})
utility_data.push({'line': 'disutil_eff', 't': data_points[2], 'y': unemployment_benefits + disutility_of_effort, 'stroke': '#000000'})
}
utility_data.push({'line': 'disutil_eff', 't': data_points[2], 'y': unemployment_benefits + disutility_of_effort, 'stroke': '#000000'})
utility_data.push({'line': 'empl_rent_lower', 't': data_points[0], 'y': unemployment_benefits + disutility_of_effort - unemployment_costs, 'stroke': '#000000'})
utility_data.push({'line': 'empl_rent_lower', 't': data_points[1], 'y': unemployment_benefits + disutility_of_effort - unemployment_costs, 'stroke': '#000000'})
if (unemployment_benefits_length < unemployment_length) {
utility_data.push({'line': 'empl_rent_lower', 't': data_points[1], 'y': disutility_of_effort - unemployment_costs, 'stroke': '#000000'})
utility_data.push({'line': 'empl_rent_lower', 't': data_points[2], 'y': disutility_of_effort - unemployment_costs, 'stroke': '#000000'})
} else {
utility_data.push({'line': 'empl_rent_lower', 't': data_points[1], 'y': unemployment_benefits + disutility_of_effort - unemployment_costs, 'stroke': '#000000'})
utility_data.push({'line': 'empl_rent_lower', 't': data_points[1], 'y': unemployment_benefits + disutility_of_effort - unemployment_costs, 'stroke': '#000000'})
}
utility_data.push({'line': 'empl_rent_lower', 't': data_points[2], 'y': unemployment_benefits + disutility_of_effort - unemployment_costs, 'stroke': '#000000'})

const empl_rent_ph_0_to_len_unemp_ben = (wage - disutility_of_effort) - (unemployment_benefits - unemployment_costs)
const empl_rent_ph_len_unemp_ben_to_len_unemp = (wage - disutility_of_effort) - ( - unemployment_costs)
const empl_rent_ph_len_unemp_plus = wage - new_wage
let empl_rent_data = []
if (empl_rent_ph_0_to_len_unemp_ben > 0) {
empl_rent_data.push({x1: 0, y1: unemployment_benefits + disutility_of_effort - unemployment_costs, y2: wage, z: 'empl_rent_0_44', fill: 'rgba(77, 99, 173, 0.2)'},
{x1: data_points[1], y1: unemployment_benefits + disutility_of_effort - unemployment_costs, y2: wage, z: 'empl_rent_0_44', fill: 'rgba(77, 99, 173, 0.2)'})
} else {
empl_rent_data.push({x1: 0, y1: unemployment_benefits + disutility_of_effort - unemployment_costs, y2: wage, z: 'empl_rent_0_44', fill: 'rgba(237, 32, 36, 0.2)'},
{x1: data_points[1], y1: unemployment_benefits + disutility_of_effort - unemployment_costs, y2: wage, z: 'empl_rent_0_44', fill: 'rgba(237, 32, 36, 0.2)'})
}

if (empl_rent_ph_len_unemp_ben_to_len_unemp > 0) {
empl_rent_data.push({x1: data_points[1], y1: disutility_of_effort - unemployment_costs, y2: wage, z: 'empl_rent_0_44', fill: 'rgba(77, 99, 173, 0.2)'},
{x1: data_points[2], y1: disutility_of_effort - unemployment_costs, y2: wage, z: 'empl_rent_0_44', fill: 'rgba(77, 99, 173, 0.2)'})
} else {
empl_rent_data.push({x1: data_points[1], y1: disutility_of_effort - unemployment_costs, y2: wage, z: 'empl_rent_0_44', fill: 'rgba(237, 32, 36, 0.2)'},
{x1: data_points[2], y1: disutility_of_effort - unemployment_costs, y2: wage, z: 'empl_rent_0_44', fill: 'rgba(237, 32, 36, 0.2)'})
}

if (empl_rent_ph_len_unemp_plus > 0) {
empl_rent_data.push({x1: data_points[2], y1: new_wage, y2: wage, z: 'empl_rent_44_+', fill: 'rgba(77, 99, 173, 0.2)'}),
empl_rent_data.push({x1: data_points[3], y1: new_wage, y2: wage, z: 'empl_rent_44_+', fill: 'rgba(77, 99, 173, 0.2)'})
} else {
empl_rent_data.push({x1: data_points[2], y1: new_wage, y2: wage, z: 'empl_rent_44_+', fill: 'rgba(237, 32, 36, 0.2)'}),
empl_rent_data.push({x1: data_points[3], y1: new_wage, y2: wage, z: 'empl_rent_44_+', fill: 'rgba(237, 32, 36, 0.2)'})
}

let labels = []
labels.push({'t': data_points[2]+4, 'y': unemployment_benefits, 'stroke': '#ff0000', 'label': `Unemployment Benefits = ${unemployment_benefits.toFixed(2)}`})
labels.push({'t': data_points[2]+4, 'y': unemployment_benefits+disutility_of_effort+0.15, 'stroke': '#000000', 'label': 'Unemployment Benefits + '})
labels.push({'t': data_points[2]+4, 'y': unemployment_benefits+disutility_of_effort-0.15, 'stroke': '#000000', 'label': `Disutility of Effort = ${(unemployment_benefits+disutility_of_effort).toFixed(1)}`})
if (unemployment_costs>0) {
labels.push({'t': data_points[2]+4, 'y': unemployment_benefits+disutility_of_effort-unemployment_costs+0.3,'stroke': '#000000', 'label': 'Unemployment Benefits + '})
labels.push({'t': data_points[2]+4, 'y': unemployment_benefits+disutility_of_effort-unemployment_costs,'stroke': '#000000', 'label': 'Disutility of Effort + '})
labels.push({'t': data_points[2]+4, 'y': unemployment_benefits+disutility_of_effort-unemployment_costs-0.3,'stroke': '#000000', 'label': `Unemployment Cost = ${(unemployment_benefits+disutility_of_effort-unemployment_costs).toFixed(1)}`})
}
if (disutility_of_effort/2 - unemployment_costs <= 0.2 && disutility_of_effort/2 - unemployment_costs > -0.2) {
labels.push({'t': data_points[2]/2-3.5, 'y': unemployment_benefits + disutility_of_effort - unemployment_costs-0.2, 'stroke': '#000000', 'label': 'Disutility of Effort'})
} else {
labels.push({'t': data_points[1]/2-3.5, 'y': unemployment_benefits+disutility_of_effort/2, 'stroke': '#000000', 'label': 'Disutility of Effort'})
}
if (unemployment_costs>0) {
labels.push({'t': data_points[2]/2+4, 'y': unemployment_benefits+disutility_of_effort-unemployment_costs/2, 'stroke': '#000000', 'label': 'Unemployment Costs'})
}
labels.push({'t': data_points[2]/2, 'y': (wage+unemployment_benefits+disutility_of_effort-unemployment_costs)/2, 'stroke': '#0000ff', 'label': 'Employment Rent'})

const plt = Plot.plot({
style: "display: inline-block",
x: {
label: "Number of 35 hour weeks",
line: true,
domain: [0, 52],
ticks: 26,
},
y: {
label: "$",
line: true,
domain: [Math.min(0, disutility_of_effort-unemployment_costs), 15]
},
grid: true,
width: 1000,
height: 700,
marks: [
Plot.line(path_data, {x: 't', y: 'y', z: 'line', stroke: 'stroke'}),
Plot.line(utility_data, {x: 't', y: 'y', z: 'line', stroke: 'stroke', strokeDasharray: '5 5'}),
Plot.arrow([{x1:data_points[2], x2: data_points[3], y1: wage, y2: wage}], {x1:'x1', x2:'x2', y1:'y1', y2:'y2', stroke: '#0000ff'}),
Plot.arrow([{x1:data_points[2], x2: data_points[3], y1: new_wage, y2: new_wage}], {x1:'x1', x2:'x2', y1:'y1', y2:'y2', stroke: '#ff0000'}),
Plot.arrow([{x1:data_points[1]/2-1, x2: data_points[1]/2-1, y1: unemployment_benefits, y2: unemployment_benefits+disutility_of_effort}], {x1:'x1', x2:'x2', y1:'y1', y2:'y2', stroke: '#000000'}),
Plot.arrow([{x1:data_points[2]/2+1, x2: data_points[2]/2+1, y1: unemployment_benefits+disutility_of_effort, y2: unemployment_benefits+disutility_of_effort-unemployment_costs}], {x1:'x1', x2:'x2', y1:'y1', y2:'y2', stroke: '#000000'}),
Plot.area(empl_rent_data,
{x1: 'x1', y1: 'y1', y2: 'y2', z: 'z', fill: 'fill'}
),
Plot.text(labels, {x: 't', y: 'y', text: 'label', fill: 'stroke'}),
//Plot.crosshair(data, {x: 't', y: 'y', color: 'stroke'})
]
})
return plt
}
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more