Public
Edited
Jan 28, 2023
Insert cell
Insert cell
import {vl} from "@vega/vega-lite-api-v5"
Insert cell
import {printTable} from '@uwdata/data-utilities'

Insert cell
import {aq, op} from "@uwdata/arquero"
Insert cell
df = FileAttachment("full_df@8.csv").csv({typed:true})
Insert cell
printTable(df.slice(0,5))
Insert cell
vl.markPoint({filled: true})
.data(df)
.transform(
vl.filter('datum.Side == "Red" && datum.avg_sig_str_pct > .01 && datum.opp_avg_sig_str_pct > .01')
)
.encode(
vl.x().fieldQ('opp_avg_sig_str_pct'),
vl.y().fieldQ('avg_sig_str_pct'),
vl.color().fieldN('Winner'),
vl.opacity(0.5)
)
.render()
Insert cell
vl.markRect({filled: true})
.data(df)
.transform(
vl.filter('datum.avg_sig_str_pct > .01 && datum.opp_avg_sig_str_pct > .01 && abs(datum.reach_dif) < 25')
)
.encode(
vl.x().fieldQ(vl.repeat('column')).bin({maxbins: 10}),
vl.y().fieldQ(vl.repeat('row')).bin({maxbins: 10}),
vl.color().mean('Winner').scale({domain:[0.25,0.75]}).title('Win Rate'),
).width(150)
.height(150).repeat({
row: ['height_dif', 'age_dif', 'reach_dif',],
column: ['height_dif', 'age_dif', 'reach_dif',]
})
.render()
Insert cell
vl.markPoint({filled: true})
.data(df)
.transform(
vl.filter('datum.avg_sig_str_pct > 0.1 && datum.reach_cms > 150'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('height-to-weight-ratio')
)
.encode(
vl.x().fieldQ('height-to-weight-ratio').bin,
vl.y().fieldQ('avg_sig_str_landed'),
)
.render()
Insert cell
vl.markBar()
.data(df)
.transform(
vl.filter('datum.Side == "Red" && abs(datum.reach_dif) < 25'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('reach_dif').bin({maxbins: 20}),
vl.y().mean('winrate').scale({scheme:'turbo'}),
vl.color().mean('winrate').scale({scheme:'turbo'}),
)
.render()
Insert cell
vl.markBar()
.data(df)
.transform(
vl.filter('abs(datum.reach_dif) < 25'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('reach_dif').bin({maxbins: 20}),
vl.y().count(),
vl.color().mean('Winner').scale({scheme:'turbo'}),
)
.render()
Insert cell
vl.markPoint({filled:true})
.data(df)
.transform(
vl.filter('abs(datum.reach_dif) < 25'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('reach_dif').bin({maxbins: 30}).title('Reach Advantage (cm)'),
vl.y().mean('Winner').scale({scheme:'turbo'}).title('Win Rate'),
vl.color().mean('odds').scale({scheme:'purpleorange'}),
vl.size().count().title('# of Occurences')
).title('Reach Advantage vs Win Rate')
.render()
Insert cell
vl.markPoint()
.data(df)
.transform(
vl.filter('abs(datum.reach_dif) < 25'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('reach_dif').bin({maxbins: 30}).title('Reach Advantage (cm)'),
vl.y().mean('Winner').scale({scheme:'turbo'}).title('Win Rate'),
vl.color(),
vl.size().count().scale({type:'log'}).title('# of Occurences')
).title('Reach Advantage vs')
.render()
Insert cell
{
const sub = vl.markLine({color:"#0000ff"})
.encode(
vl.x().fieldQ('reach_dif').bin({maxbins: 20}).title('Reach Advantage (cm)'),
vl.y().mean('oc_by_sub').title('% of Wins'),
vl.color().legend('Wins By Sub')
);
const dec = vl.markLine(({color:'#008080'}))
.encode(
vl.x().fieldQ('reach_dif').bin({maxbins: 20}),
vl.y().mean('oc_by_decision'),
);
const ko = vl.markLine({color:"#800000"})
.encode(
vl.x().fieldQ('reach_dif').bin({maxbins: 20}),
vl.y().mean('oc_by_ko/tko'),
);
return vl.layer(sub, dec, ko)
.data(df)
.transform(
vl.filter('abs(datum.reach_dif) < 25 & datum.Winner==1'),
).resolve({legend:{color:'independent'}}).title('Reach Advantage V.S. % of Wins by Different Methods')
.render();
}
Insert cell
vl.markPoint({filled:true})
.data(df)
.transform(
vl.filter('abs(datum.reach_dif) < 20'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('height_dif').bin({maxbins: 30}).title('Height Advantage (cm)'),
vl.y().mean('Winner').scale({scheme:'turbo'}).title('Win Rate'),
vl.color().mean('odds').scale({scheme:'turbo'}),
vl.size().count().title('# of Occurences')
).title('Height Advantage vs Win Rate')
.render()
Insert cell
vl.markPoint({filled:true})
.data(df)
.transform(
//vl.filter('abs(datum.reach_dif) < 20'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('age_dif').bin({maxbins: 30}).title('Age Difference (years)'),
vl.y().mean('Winner').scale({scheme:'turbo', domain:[0.3, 0.75]}).title('Win Rate'),
vl.color().mean('odds').scale({scheme:'turbo'}),
vl.size().count().title('# of Occurences')
).title('Age Difference vs Win Rate')
.render()
Insert cell
vl.markPoint({filled:true})
.data(df)
.transform(
//vl.filter('abs(datum.reach_dif) < 20'),
vl.calculate('min(datum.total_rounds_fought, 50)').as('rf_norm')
)
.encode(
vl.x().fieldQ('rf_norm').bin({maxbins: 20}).title('Total Number of Rounds Fought'),
vl.y().mean('Winner').scale({scheme:'turbo', domain:[0.35, 0.6]}).title('Win Rate'),
vl.color().mean('odds').scale({scheme:'turbo'}),
vl.size().count().scale({type:'log'}).title('# of Occurences')
).title('Rounds Fought vs Win Rate')
.render()
Insert cell
vl.markPoint({filled:true})
.data(df)
.transform(
//vl.filter('abs(datum.reach_dif) < 20'),
vl.calculate('min(40,datum.wins+datum.losses)').as('total_fights')
)
.encode(
vl.x().fieldQ('total_fights').bin({maxbins: 20}).title('Total Fights'),
vl.y().mean('Winner').scale({scheme:'turbo'}).title('Win Rate'),
vl.color().mean('odds').scale({scheme:'turbo'}),
vl.size().count().scale({type:'log'}).title('# of Occurences')
).title('Total Fights vs Win Rate')
.render()
Insert cell
vl.markPoint({filled:true})
.data(df)
.transform(
//vl.filter('abs(datum.reach_dif) < 20'),
vl.calculate('min(14, datum.losses)').as('losses_norm')
)
.encode(
vl.x().fieldQ('losses_norm').bin({maxbins: 20}).title('Total Losses'),
vl.y().mean('Winner').scale({scheme:'turbo'}).title('Win Rate'),
vl.color().mean('odds').scale({scheme:'turbo'}),
vl.size().count().scale({type:'log'}).title('# of Occurences')
).title('Total Losses vs Win Rate')
.render()
Insert cell
vl.markBar({filled:true})
.data(df)
.transform(
//vl.filter('abs(datum.reach_dif) < 20'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate'),
vl.calculate('min(datum.total_rounds_fought, 80)').as('rf_norm')
)
.encode(
vl.x().fieldQ('rf_norm').bin({maxbins: 100}).title('Age Difference (years)'),
vl.y().count(),//.mean('Winner').scale({scheme:'turbo'}).title('Win Rate'),
//vl.color().mean('odds').scale({scheme:'turbo'}),
//vl.size().count().title('# of Occurences')
).title('Age Difference vs Win Rate')
.render()
Insert cell
vl.markPoint({filled:true})
.data(df)
.transform(
//vl.filter('abs(datum.reach_dif) < 20'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('age').bin({maxbins: 30}).title('Age (years)'),
vl.y().mean('Winner').scale({scheme:'turbo'}).title('Win Rate'),
vl.color().mean('odds').scale({scheme:'turbo'}),
vl.size().count().title('# of Occurences')
).title('Age vs Win Rate')
.render()
Insert cell
{
const sub = vl.markLine({color:"#0000ff"})
.encode(
vl.x().fieldQ('height_dif').bin({maxbins: 20}).title('Height Advantage (cm)'),
vl.y().mean('oc_by_sub').title('% of Wins'),
vl.color().legend('Wins By Sub')
);
const dec = vl.markLine(({color:'#008080'}))
.encode(
vl.x().fieldQ('height_dif').bin({maxbins: 20}),
vl.y().mean('oc_by_decision'),
);
const ko = vl.markLine({color:"#800000"})
.encode(
vl.x().fieldQ('height_dif').bin({maxbins: 20}),
vl.y().mean('oc_by_ko/tko'),
);
return vl.layer(sub, dec, ko)
.data(df)
.transform(
vl.filter('abs(datum.height_dif) < 20 & datum.Winner==1'),
).resolve({legend:{color:'independent'}}).title('Height Advantage V.S. % of Wins by Different Methods')
.render();
}
Insert cell
vl.markBar()
.data(df)
.transform(
vl.filter('abs(datum.reach_dif) < 25 & datum.Winner==1 & datum.finish!=null'),
)
.encode(
vl.x().fieldQ('reach_dif').bin({maxbins: 20}).title('Reach Advantage (cm)').scale({domain:[-25, 25]}),
vl.y().count('finish').title('Wins'),
vl.color().fieldN('finish').scale({
domain: ['DEC', 'KO/TKO', 'SUB'],
range: ['#008080', "#800000", "#0000ff"]
}).title('Method of Victory')
).title('Reach Advantage v.s. Method of Victory').render()
Insert cell
vl.markBar()
.data(df)
.transform(
vl.filter('abs(datum.reach_dif) < 25 & datum.Winner==1 & datum.finish!=null'),
)
.encode(
vl.x().fieldQ('height_dif').bin({maxbins: 20}).title('Reach Advantage (cm)').scale({domain:[-25, 25]}),
vl.y().count('finish').title('Wins'),
vl.color().fieldN('finish').scale({
domain: ['DEC', 'KO/TKO', 'SUB'],
range: ['#008080', "#800000", "#0000ff"]
}).title('Method of Victory')
).title('Reach Advantage v.s. Method of Victory').render()
Insert cell
vl.markBar()
.data(df)
.transform(
vl.filter('abs(datum.reach_dif) < 25'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('reach_dif').bin({maxbins: 30}).title('Reach Advantage (cm)'),
vl.y().mean('Winner').scale({scheme:'turbo'}).title('Win rate'),
vl.color().mean('odds').scale({scheme:'purplegreen'}),
).title('Reach Advantage vs Win Rate')
.render()
Insert cell
df_no_dupes = FileAttachment("no_dupes@3.csv").csv({typed:true})
Insert cell
vl.markPoint({filled: true})
.data(df_no_dupes)
.transform(
vl.filter('datum.avg_sig_str_pct > 0.1 && datum.reach_cms > 150 && datum.wins >= 1'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('reach-to-weight-ratio').scale({domain:[0.6, 1.6]}).bin({maxbins: 10}),
vl.y().fieldQ('avg_sig_str_pct').bin({maxbins: 10}),
vl.color().mean('winrate').scale({scheme:'turbo'}),
vl.size().count().scale({type:'log'}),//.mean('winrate'),
vl.opacity(0.8)
)
.render()
Insert cell
vl.markPoint()
.data(df_no_dupes)
.transform(
vl.filter('datum.avg_sig_str_pct > 0.1 && datum.reach_cms > 50 && datum.wins >= 1'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('reach-to-weight-ratio').scale({domain:[0.6, 1.6]}),
vl.y().fieldQ('avg_sig_str_landed').scale({domain:[0, 50]}),
//vl.color().mean('winrate').scale({scheme:'turbo'}),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
vl.opacity(0.8)
)
.render()
Insert cell
vl.markPoint()
.data(df_no_dupes)
.transform(
vl.filter('datum.avg_sig_str_pct > 0.1 && datum.reach_cms > 50 && datum.wins >= 1'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('reach-to-weight-ratio').scale({domain:[0.6, 1.6]}).bin({maxbins: 10}),
vl.y().mean('win_by_submission'),
vl.size().count(),

//vl.color().mean('winrate').scale({scheme:'turbo'}),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
vl.opacity(0.8)
)
.render()
Insert cell
vl.markPoint()
.data(df_no_dupes)
.transform(
vl.filter('datum.avg_sig_str_pct > 0.1 && datum.reach_cms > 50 && datum.wins >= 1'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('reach-to-weight-ratio').scale({domain:[0.6, 1.6]}).bin({maxbins: 20}),
vl.y().mean('win_by_submission'),
vl.size().count(),
//vl.color().mean('winrate').scale({scheme:'turbo'}),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
vl.opacity(0.8)
)
.render()
Insert cell
vl.markPoint()
.data(df_no_dupes)
.transform(
vl.filter('datum.avg_sig_str_pct > 0.1 && datum.reach_cms > 50 && datum.wins >= 1'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate'),
vl.calculate('datum.win_by_submission/(datum.wins)').as('sub_rate')
)
.encode(
vl.x().fieldQ('reach-to-weight-ratio').scale({domain:[0.6, 1.6]}).bin({maxbins: 40}),
vl.y().mean('sub_rate'),
vl.size().count(),
//vl.color().mean('winrate').scale({scheme:'turbo'}),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
vl.opacity(0.8)
)
.render()
Insert cell
vl.markPoint({filled:true})
.data(df_no_dupes)
.transform(
vl.filter('datum.avg_sig_str_pct > 0.1 && datum.reach_cms > 50 && datum.wins >= 1'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate'),
vl.calculate('(datum.win_by_submission + datum.win_by_ko)/(datum.wins)').as('finish_rate')
)
.encode(
vl.x().fieldQ('reach-to-weight-ratio').axis({tickCount:2}).scale({domain:[0.6, 1.6]}).bin({maxbins: 40}).title('Reach-To-Weight Ratio'),
vl.y().mean('finish_rate').title('Finish Rate'),
vl.size().count(),
vl.color().mean('odds').scale({scheme:'turbo'}).title('Mean Odds'),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
).width(500)
.render()
Insert cell
vl.markBar({filled:true})
.data(df_no_dupes)
.transform(
vl.filter('datum.avg_sig_str_pct > 0.1 && datum.reach_cms > 50 && datum.wins >= 1'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate'),
vl.calculate('(datum.win_by_submission + datum.win_by_ko)/(datum.wins)').as('finish_rate')
)
.encode(
vl.x().fieldQ('reach-to-weight-ratio').scale({domain:[0.6, 1.6]}).bin({maxbins: 40}),
vl.y().count(),
vl.color().mean('odds').scale({scheme:'turbo'}),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
)
.render()
Insert cell
vl.markBar({filled:true})
.data(df_no_dupes)
.transform(
vl.filter('datum.avg_sig_str_pct > 0.1 && datum.reach_cms > 50 && datum.wins >= 1 && datum.weight_class !="Catch Weight"'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate'),
vl.calculate('(datum.win_by_submission + datum.win_by_ko)/(datum.wins)').as('finish_rate'),
vl.calculate('(datum.win_by_submission)/(datum.wins)').as('sub_rate')
)
.encode(
vl.y().fieldN('weight_class').scale({domain:
['Flyweight','Bantamweight', 'Featherweight','Lightweight','Welterweight','Middleweight','Light Heavyweight','Heavyweight']}).title('Weight Class'),
vl.x().mean('finish_rate').title('Mean Finishing Rate'),
//vl.x().mean('sub_rate').title('Mean Finishing Rate')
//vl.color().mean('odds').scale({scheme:'turbo'}),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
).title('Weight Class vs Mean Finishing Rate (Male Divisions)')
.render()
Insert cell
vl.markBar({filled:true})
.data(df)
.transform(
vl.filter('datum.weight_class !="Catch Weight" & datum.Winner==1 & datum.finish!=null'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate'),
vl.calculate('(datum.win_by_submission + datum.win_by_ko)/(datum.wins)').as('finish_rate'),
vl.calculate('(datum.win_by_submission)/(datum.wins)').as('sub_rate')
)
.encode(
vl.y().fieldN('weight_class').scale({domain:
['Flyweight','Bantamweight', 'Featherweight','Lightweight','Welterweight','Middleweight','Light Heavyweight','Heavyweight', 'Women\'s Strawweight','Women\'s Flyweight','Women\'s Bantamweight', 'Women\'s Featherweight']}).title('Weight Class'),
vl.x().count('finish'),
//vl.x().mean('sub_rate').title('Mean Finishing Rate')
vl.color().fieldN('finish').title('Method of Victory'),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
).title('Weight Class vs Method of Victory').height(500)
.render()
Insert cell
vl.markBar({filled:true})
.data(df_no_dupes)
.transform(
vl.filter('datum.weight_class !="Catch Weight" & datum.Winner==1 & datum.finish!=null '),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate'),
vl.calculate('(datum.win_by_submission + datum.win_by_ko)/(datum.wins)').as('finish_rate')
)
.encode(
vl.y().fieldN('weight_class').scale({domain:
['Flyweight','Bantamweight', 'Featherweight','Lightweight','Welterweight','Middleweight','Light Heavyweight','Heavyweight', 'Women\'s Strawweight','Women\'s Flyweight','Women\'s Bantamweight', 'Women\'s Featherweight']}).title('Weight Class'),
vl.x().mean('finish_rate').title('Mean Finishing Rate'),
//vl.color().mean('odds').scale({scheme:'turbo'}),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
).title('Weight Class vs Mean Finishing Rate').height(500)
.render()
Insert cell
vl.markBar({filled:true})
.data(df_no_dupes)
.transform(
vl.filter('datum.weight_class !="Catch Weight" & datum.Winner==1 & datum.finish!=null '),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate'),
vl.calculate('(datum.win_by_submission)/(datum.wins)').as('sub_rate')
)
.encode(
vl.y().fieldN('weight_class').scale({domain:
['Flyweight','Bantamweight', 'Featherweight','Lightweight','Welterweight','Middleweight','Light Heavyweight','Heavyweight', 'Women\'s Strawweight','Women\'s Flyweight','Women\'s Bantamweight', 'Women\'s Featherweight']}).title('Weight Class'),
vl.x().mean('sub_rate').title('Sub Rate'),
//vl.color().mean('odds').scale({scheme:'turbo'}),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
).title('Weight Class vs Sub Rate').height(500)
.render()
Insert cell
vl.markBar({filled:true})
.data(df_no_dupes)
.transform(
vl.filter('datum.weight_class !="Catch Weight" & datum.Winner==1 & datum.finish!=null '),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate'),
vl.calculate('(datum.win_by_ko)/(datum.wins)').as('ko_rate')
)
.encode(
vl.y().fieldN('weight_class').scale({domain:
['Flyweight','Bantamweight', 'Featherweight','Lightweight','Welterweight','Middleweight','Light Heavyweight','Heavyweight', 'Women\'s Strawweight','Women\'s Flyweight','Women\'s Bantamweight', 'Women\'s Featherweight']}).title('Weight Class'),
vl.x().mean('ko_rate').title('KO Rate'),
//vl.color().mean('odds').scale({scheme:'turbo'}),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
).title('Weight Class vs KO Rate').height(500)
.render()
Insert cell
vl.markBar()
.data(df_no_dupes)
.transform(
vl.filter('datum.avg_sig_str_pct > 0.1 && datum.reach_cms > 50 && datum.wins >= 1'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('reach-to-weight-ratio').scale({domain:[0.6, 1.6]}).bin({maxbins: 40}),
vl.y().count(),
//vl.color().mean('winrate').scale({scheme:'turbo'}),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
vl.opacity(0.8)
)
.render()
Insert cell
vl.markPoint()
.data(df_no_dupes)
.transform(
vl.filter('datum.avg_sig_str_pct > 0.1 && datum.reach_cms > 50 && datum.wins >= 1'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('reach-to-weight-ratio').scale({domain:[0.6, 1.6]}).bin({maxbins: 20}),
vl.y().mean('avg_sig_str_landed').scale({domain:[0, 25]}),
vl.size().count(),
//vl.color().mean('winrate').scale({scheme:'turbo'}),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
vl.opacity(0.8)
)
.render()
Insert cell
vl.markBoxplot()
.data(df_no_dupes)
.transform(
vl.filter('datum.avg_sig_str_pct > 0.1 && datum.reach_cms > 50 && datum.wins >= 1'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('reach-to-weight-ratio').scale({domain:[0.6, 1.6]}).bin({maxbins: 10}),
vl.y().fieldQ('avg_sub_att'),
//vl.size().count(),
//vl.color().mean('win_by_submission').scale({scheme:'turbo'}),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
vl.opacity(0.8)
)
.render()
Insert cell
vl.markPoint()
.data(df_no_dupes)
.transform(
vl.filter('datum.avg_sig_str_pct > 0.1 && datum.reach_cms > 50 && datum.wins >= 1'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('reach-to-weight-ratio').scale({domain:[0.6, 1.6]}).bin({maxbins: 10}),
vl.y().mean('win_by_submission'),
//vl.color().mean('winrate').scale({scheme:'turbo'}),
//vl.size().count().scale({type:'log'}),//.mean('winrate'),
vl.opacity(0.8)
)
.render()
Insert cell
vl.markPoint({filled: true})
.data(df)
.transform(
vl.filter('datum.avg_sig_str_pct > 0.1 && datum.opp_avg_sig_str_pct > 0.1 && datum.reach_cms > 150 && datum.wins >= 1 && abs(datum.reach_dif) < 100'),
vl.calculate('datum.reach_cms/datum.weight_lbs').as('reach-to-weight-ratio'),
vl.calculate('datum.wins/(datum.wins + datum.losses)').as('winrate')
)
.encode(
vl.x().fieldQ('reach_dif').bin({maxbins: 10}),
vl.y().fieldQ('height_dif').bin({maxbins: 10}),
vl.color().mean('Winner').scale({scheme:'turbo',step:0.1}),
vl.size().count().scale({type:'log'}),
vl.opacity(0.8)
)
.render()
Insert cell
vl.markBar()
.data(df)
.encode(
vl.x().fieldQ('age_dif').bin({maxbins: 20}),
vl.y().count(),
vl.color().mean('Winner').scale({scheme:'turbo'}),
)
.render()
Insert cell
vl.markBar()
.data(df)
.transform(
vl.filter('abs(datum.win_streak_dif) < 7'),
)
.encode(
vl.x().fieldQ('win_streak_dif').bin({maxbins: 20}),
vl.y().count(),
vl.color().mean('Winner').scale({scheme:'turbo'}),
)
.render()
Insert cell
vl.markBar()
.data(df)
.transform(
vl.filter('abs(datum.total_round_dif) < 40'),
)
.encode(
vl.x().fieldQ('total_round_dif').bin({maxbins: 20}),
vl.y().mean('Winner').scale({scheme:'turbo', domain:[0.4, 0.6]}),
vl.color().mean('odds').scale({scheme:'turbo'}),
)
.render()
Insert cell
vl.markLine()
.data(df)
.transform(
vl.filter('abs(datum.total_round_dif) < 40'),
)
.encode(
vl.x().fieldQ('total_round_dif').bin({maxbins: 20}),
vl.y().mean('Winner').scale({scheme:'turbo', domain:[0.4, 0.6]}),
)
.render()
Insert cell
vl.markPoint({filled: true})
.data(df)
.transform(
vl.filter('datum.reach_cms > 15 && datum.opp_reach_cms > 15'),

)
.encode(
vl.y().fieldQ('reach_cms').bin({maxbins: 10}),
vl.x().fieldQ('opp_reach_cms').bin({maxbins: 10}),
vl.color().mean('Winner').scale({scheme:'turbo',step:0.1}),
vl.size().count().scale({type:'log'}),
vl.opacity(0.8)
)
.render()
Insert cell
vl.markBar()
.data(df)
.transform(
vl.filter('abs(datum.avg_td_dif) < 8'),
)
.encode(
vl.x().fieldQ('avg_td_dif').bin({maxbins: 20}),
vl.y().mean('Winner').scale({scheme:'turbo'}),
vl.color().mean('Winner').scale({scheme:'turbo'}),
)
.render()
Insert cell
vl.markBar()
.data(df)
.transform(
vl.filter('abs(datum.avg_sub_att_dif) < 8'),
)
.encode(
vl.x().fieldQ('avg_sub_att_dif').bin({maxbins: 20}),
vl.y().count().scale({type:'log'}),
vl.color().mean('Winner').scale({scheme:'turbo'}),
)
.render()
Insert cell
vl.markBar()
.data(df)
.transform(
vl.filter('abs(datum.sig_str_dif) < 20'),
)
.encode(
vl.x().fieldQ('sig_str_dif').bin({maxbins: 20}),
vl.y().mean('Winner').scale({scheme:'turbo'}),
//.count().scale({type:'log'}),
vl.color().mean('Winner').scale({scheme:'turbo'}),
)
.render()
Insert cell
vl.markBar()
.data(df)
.transform(
vl.filter('abs(datum.ko_dif) < 10'),
)
.encode(
vl.x().fieldQ('ko_dif').bin({maxbins: 20}),
//vl.color().count().scale({scheme:'turbo'}),
vl.y().mean('Winner').scale({domain:[0.35,0.7]}),
)
.render()
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