Bar Charts
Bar Chart
using VegaLite
@vgplot(
height=200,
padding=5,
marks=[
{
encode={
update={
fill={
value="steelblue"
}
},
hover={
fill={
value="red"
}
},
enter={
x={
field="category",
scale="xscale"
},
y2={
value=0,
scale="yscale"
},
width={
scale="xscale",
band=1
},
y={
field="amount",
scale="yscale"
}
}
},
from={
data="table"
},
type="rect"
},
{
encode={
update={
x={
signal="tooltip.category",
scale="xscale",
band=0.5
},
fillOpacity=[
{
test="datum === tooltip",
value=0
},
{
value=1
}
],
text={
signal="tooltip.amount"
},
y={
offset=-2,
signal="tooltip.amount",
scale="yscale"
}
},
enter={
fill={
value="#333"
},
baseline={
value="bottom"
},
align={
value="center"
}
}
},
type="text"
}
],
axes=[
{
scale="xscale",
orient="bottom"
},
{
scale="yscale",
orient="left"
}
],
data=[
{
name="table",
values=[
{
amount=28,
category="A"
},
{
amount=55,
category="B"
},
{
amount=43,
category="C"
},
{
amount=91,
category="D"
},
{
amount=81,
category="E"
},
{
amount=53,
category="F"
},
{
amount=19,
category="G"
},
{
amount=87,
category="H"
}
]
}
],
scales=[
{
name="xscale",
padding=0.05,
range="width",
domain={
data="table",
field="category"
},
type="band",
round=true
},
{
name="yscale",
nice=true,
range="height",
domain={
data="table",
field="amount"
}
}
],
width=400,
signals=[
{
name="tooltip",
on=[
{
events="rect:mouseover",
update="datum"
},
{
events="rect:mouseout",
update="{}"
}
],
value={
}
}
]
)
Stacked Bar Chart
using VegaLite
@vgplot(
height=200,
padding=5,
marks=[
{
encode={
update={
fillOpacity={
value=1
}
},
hover={
fillOpacity={
value=0.5
}
},
enter={
x={
field="x",
scale="x"
},
y2={
field="y1",
scale="y"
},
width={
offset=-1,
scale="x",
band=1
},
fill={
field="c",
scale="color"
},
y={
field="y0",
scale="y"
}
}
},
from={
data="table"
},
type="rect"
}
],
axes=[
{
zindex=1,
scale="x",
orient="bottom"
},
{
zindex=1,
scale="y",
orient="left"
}
],
data=[
{
name="table",
values=[
{
c=0,
x=0,
y=28
},
{
c=1,
x=0,
y=55
},
{
c=0,
x=1,
y=43
},
{
c=1,
x=1,
y=91
},
{
c=0,
x=2,
y=81
},
{
c=1,
x=2,
y=53
},
{
c=0,
x=3,
y=19
},
{
c=1,
x=3,
y=87
},
{
c=0,
x=4,
y=52
},
{
c=1,
x=4,
y=48
},
{
c=0,
x=5,
y=24
},
{
c=1,
x=5,
y=49
},
{
c=0,
x=6,
y=87
},
{
c=1,
x=6,
y=66
},
{
c=0,
x=7,
y=17
},
{
c=1,
x=7,
y=27
},
{
c=0,
x=8,
y=68
},
{
c=1,
x=8,
y=16
},
{
c=0,
x=9,
y=49
},
{
c=1,
x=9,
y=15
}
],
transform=[
{
sort={
field="c"
},
field="y",
groupby=[
"x"
],
type="stack"
}
]
}
],
scales=[
{
name="x",
range="width",
domain={
data="table",
field="x"
},
type="band"
},
{
name="y",
nice=true,
zero=true,
range="height",
domain={
data="table",
field="y1"
},
type="linear"
},
{
name="color",
range="category",
domain={
data="table",
field="c"
},
type="ordinal"
}
],
width=500
)
Grouped Bar Chart
using VegaLite
@vgplot(
height=240,
padding=5,
marks=[
{
marks=[
{
name="bars",
encode={
enter={
height={
scale="pos",
band=1
},
x2={
value=0,
scale="xscale"
},
x={
field="value",
scale="xscale"
},
fill={
field="position",
scale="color"
},
y={
field="position",
scale="pos"
}
}
},
from={
data="facet"
},
type="rect"
},
{
encode={
enter={
align={
value="right"
},
x={
offset=-5,
field="x2"
},
fill=[
{
test="contrast('white', datum.fill) > contrast('black', datum.fill)",
value="white"
},
{
value="black"
}
],
baseline={
value="middle"
},
text={
field="datum.value"
},
y={
offset={
mult=0.5,
field="height"
},
field="y"
}
}
},
from={
data="bars"
},
type="text"
}
],
encode={
enter={
y={
field="category",
scale="yscale"
}
}
},
scales=[
{
name="pos",
range="height",
domain={
data="facet",
field="position"
},
type="band"
}
],
signals=[
{
name="height",
update="bandwidth('yscale')"
}
],
from={
facet={
name="facet",
data="table",
groupby="category"
}
},
type="group"
}
],
axes=[
{
labelPadding=4,
zindex=1,
scale="yscale",
orient="left",
tickSize=0
},
{
scale="xscale",
orient="bottom"
}
],
data=[
{
name="table",
values=[
{
position=0,
value=0.1,
category="A"
},
{
position=1,
value=0.6,
category="A"
},
{
position=2,
value=0.9,
category="A"
},
{
position=3,
value=0.4,
category="A"
},
{
position=0,
value=0.7,
category="B"
},
{
position=1,
value=0.2,
category="B"
},
{
position=2,
value=1.1,
category="B"
},
{
position=3,
value=0.8,
category="B"
},
{
position=0,
value=0.6,
category="C"
},
{
position=1,
value=0.1,
category="C"
},
{
position=2,
value=0.2,
category="C"
},
{
position=3,
value=0.7,
category="C"
}
]
}
],
scales=[
{
name="yscale",
padding=0.2,
range="height",
domain={
data="table",
field="category"
},
type="band"
},
{
name="xscale",
zero=true,
nice=true,
range="width",
domain={
data="table",
field="value"
},
type="linear",
round=true
},
{
name="color",
range={
scheme="category20"
},
domain={
data="table",
field="position"
},
type="ordinal"
}
],
width=300
)
Nested Bar Chart
using VegaLite
@vgplot(
padding=5,
marks=[
{
marks=[
{
encode={
update={
height={
scale="yscale",
band=1
},
stroke={
value=nothing
},
zindex={
value=0
},
y={
field="b",
scale="yscale"
}
},
hover={
stroke={
value="firebrick"
},
zindex={
value=1
}
},
enter={
x2={
field="c",
scale="xscale"
},
x={
value=0
},
strokeWidth={
value=2
},
fill={
field="a",
scale="color"
}
}
},
from={
data="faceted_tuples"
},
type="rect"
}
],
encode={
update={
y2={
field="y1"
},
y={
field="y0"
}
},
enter={
x={
value=0
},
width={
signal="width"
}
}
},
axes=[
{
domain=false,
labelPadding=4,
scale="yscale",
orient="left",
ticks=false
}
],
scales=[
{
name="yscale",
paddingOuter={
signal="outerPadding"
},
paddingInner={
signal="innerPadding"
},
domain={
data="faceted_tuples",
field="b"
},
range={
step={
signal="rangeStep"
}
},
type="band",
round=true
}
],
from={
data="trellis",
facet={
name="faceted_tuples",
data="tuples",
groupby="a"
}
},
type="group"
}
],
axes=[
{
domain=true,
scale="xscale",
orient="bottom"
}
],
data=[
{
name="tuples",
values=[
{
c=6.3,
b="a",
a=0
},
{
c=4.2,
b="a",
a=0
},
{
c=6.8,
b="b",
a=0
},
{
c=5.1,
b="c",
a=0
},
{
c=4.4,
b="b",
a=1
},
{
c=3.5,
b="b",
a=2
},
{
c=6.2,
b="c",
a=2
}
],
transform=[
{
fields=[
"c"
],
ops=[
"average"
],
as=[
"c"
],
groupby=[
"a",
"b"
],
type="aggregate"
}
]
},
{
name="trellis",
source="tuples",
transform=[
{
groupby=[
"a"
],
type="aggregate"
},
{
as="span",
expr="rangeStep * bandspace(datum.count, innerPadding, outerPadding)",
type="formula"
},
{
field="span",
type="stack"
},
{
field="y1",
signal="trellisExtent",
type="extent"
}
]
}
],
scales=[
{
name="xscale",
nice=true,
zero=true,
range="width",
domain={
data="tuples",
field="c"
},
round=true
},
{
name="color",
range="category",
domain={
data="trellis",
field="a"
},
type="ordinal"
}
],
width=300,
autosize="pad",
signals=[
{
name="rangeStep",
bind={
step=1,
max=50,
min=5,
input="range"
},
value=20
},
{
name="innerPadding",
bind={
step=0.01,
max=0.7,
min=0,
input="range"
},
value=0.1
},
{
name="outerPadding",
bind={
step=0.01,
max=0.4,
min=0,
input="range"
},
value=0.2
},
{
name="height",
update="trellisExtent[1]"
}
]
)
Population Pyramid
using VegaLite, VegaDatasets
@vgplot(
height=400,
padding=5,
marks=[
{
encode={
enter={
align={
value="center"
},
x={
signal="chartWidth + chartPad / 2"
},
text={
field="age"
},
baseline={
value="middle"
},
fill={
value="#000"
},
y={
field="age",
scale="y",
band=0.5
}
}
},
interactive=false,
from={
data="ageGroups"
},
type="text"
},
{
marks=[
{
encode={
enter={
height={
offset=-1,
scale="y",
band=1
},
x2={
value=0,
scale="x"
},
x={
field="people",
scale="x"
},
fillOpacity={
value=0.6
},
fill={
field="sex",
scale="c"
},
y={
field="age",
scale="y"
}
}
},
from={
data="females"
},
type="rect"
}
],
encode={
update={
height={
signal="height"
},
x={
value=0
}
}
},
axes=[
{
format="s",
title="Females",
scale="x",
orient="bottom"
}
],
scales=[
{
name="x",
nice=true,
zero=true,
range=[
{
signal="chartWidth"
},
0
],
domain={
data="population",
field="people"
},
type="linear"
}
],
type="group"
},
{
marks=[
{
encode={
enter={
height={
offset=-1,
scale="y",
band=1
},
x2={
value=0,
scale="x"
},
x={
field="people",
scale="x"
},
fillOpacity={
value=0.6
},
fill={
field="sex",
scale="c"
},
y={
field="age",
scale="y"
}
}
},
from={
data="males"
},
type="rect"
}
],
encode={
update={
height={
signal="height"
},
x={
signal="chartWidth + chartPad"
}
}
},
axes=[
{
format="s",
title="Males",
scale="x",
orient="bottom"
}
],
scales=[
{
name="x",
nice=true,
zero=true,
range=[
0,
{
signal="chartWidth"
}
],
domain={
data="population",
field="people"
},
type="linear"
}
],
type="group"
}
],
data=[
:population => dataset("population"),
{
name="popYear",
source="population",
transform=[
{
expr="datum.year == year",
type="filter"
}
]
},
{
name="males",
source="popYear",
transform=[
{
expr="datum.sex == 1",
type="filter"
}
]
},
{
name="females",
source="popYear",
transform=[
{
expr="datum.sex == 2",
type="filter"
}
]
},
{
name="ageGroups",
source="population",
transform=[
{
groupby=[
"age"
],
type="aggregate"
}
]
}
],
scales=[
{
name="y",
range=[
{
signal="height"
},
0
],
domain={
data="ageGroups",
field="age"
},
type="band",
round=true
},
{
name="c",
range=[
"#d5855a",
"#6c4e97"
],
domain=[
1,
2
],
type="ordinal"
}
],
signals=[
{
name="chartWidth",
value=300
},
{
name="chartPad",
value=20
},
{
name="width",
update="2 * chartWidth + chartPad"
},
{
name="year",
bind={
step=10,
max=2000,
min=1850,
input="range"
},
value=2000
}
]
)