geom_bracket()¶import pandas as pd
from lets_plot import *
LetsPlot.setup_html()
def dodged_coord(group_id, subgroup_id, subgroups_count, width=.95):
median = (subgroups_count - 1) / 2
offset = (subgroup_id - median) * width
scaler = 1.0 / subgroups_count
return group_id + offset * scaler
df = pd.read_csv("https://raw.githubusercontent.com/JetBrains/lets-plot-docs/refs/heads/master/data/mpg.csv")
print(df.shape)
df.head()
p = ggplot(df, aes("drv", "hwy")) + geom_boxplot()
grouped_p = ggplot(df, aes(x="drv", y="hwy")) + geom_boxplot(aes(fill=as_discrete("year")))
brackets_data = {
"xmin": ["f", "f"],
"xmax": ["4", "r"],
"y": [46, 48],
"lower_y": [10, 8],
"label": [0.01, 0.02],
"g": ["A", "B"]
}
bracket_plot = p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data)
bracket_plot
brackets_grouped_data = {
"xmin": [-.2375, 0.7625, 1.7625],
"xmax": [.2375, 1.2375, 2.2375],
"y": [46, 30, 28],
"label": [0.01, 0.02, 0.03],
"g": ["A", "B", "C"],
}
grouped_p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_grouped_data)
ggplot() + \
geom_boxplot(aes("hwy", "drv"), data=df) + \
geom_bracket(aes(ymin="xmin", ymax="xmax", x="y", label="label"), data=brackets_data)
gggrid([
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y"), data=brackets_data),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, size=0),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, alpha=0, segment_alpha=1),
], ncol=2)
tip_length_start/tip_length_end¶gggrid([
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data) + \
ggtitle("Default"),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label", tip_length_end=[40, 50]), data=brackets_data) + \
ggtitle("aes(tip_length_end=...)"),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, tip_length_end=15) + \
ggtitle("tip_length_end=15"),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="lower_y", label="label"), data=brackets_data, tip_length_start=-5, tip_length_end=-5) + \
ggtitle("tip_length_xxx=-5"),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="lower_y", label="label"), data=brackets_data, tip_length_start=-5) + \
ggtitle("tip_length_start=-5"),
], ncol=2)
def aes_plots(name, const_value, value="g"):
mapping = dict(xmin="xmin", xmax="xmax", y="y", label="label")
return [
p + geom_bracket(aes(**{**mapping, **{name: value}}), data=brackets_data) + ggtitle(f"aes({name}='{value}')"),
p + geom_bracket(aes(**mapping), data=brackets_data, **{name: const_value}) + ggtitle(f"{name}: {const_value}"),
]
gggrid(aes_plots("alpha", .5))
gggrid(aes_plots("color", "green"))
gggrid(aes_plots("size", 5))
aes_plots("family", "courier")[1]
aes_plots("fontface", 'bold_italic')[1]
gggrid([
aes_plots("hjust", 0)[1],
aes_plots("hjust", .5)[1],
aes_plots("hjust", 1)[1],
])
gggrid([
aes_plots("vjust", 0)[1],
aes_plots("vjust", .5)[1],
aes_plots("vjust", 1)[1],
])
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="lower_y", label="label"), data=brackets_data,
tip_length_start=-5, tip_length_end=-5, vjust=2) + \
ggtitle("tip_length_xxx=-5, vjust=2")
aes_plots("angle", 30)[1]
gggrid([
ggplot() + geom_bracket(xmin=-1, xmax=1, label="ABC\nDEF") + ggtitle("Default lineheight"),
ggplot() + geom_bracket(xmin=-1, xmax=1, label="ABC\nDEF", lineheight=2) + ggtitle("lineheight=2"),
]) + ggtitle("Multiline label")
gggrid(aes_plots("linetype", 'dotted'))
gggrid(aes_plots("segment_color", "green"))
gggrid(aes_plots("segment_size", 4))
gggrid(aes_plots("segment_alpha", .5))
bracket_shorten¶gggrid([
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data) + ggtitle("Default"),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, bracket_shorten=.75) + ggtitle("bracket_shorten=.75"),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, bracket_shorten=1.25) + ggtitle("bracket_shorten=1.25"),
])
tip_length_unit¶gggrid([
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data) + \
ggtitle("Default"),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, tip_length_unit='px') + \
ggtitle("tip_length_unit='px'"),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, tip_length_unit='identity') + \
ggtitle("tip_length_unit='identity'"),
])
label_format¶p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, label_format=".2~e")
na_text¶brackets_na_data = {
"xmin": ["f", "f"],
"xmax": ["4", "r"],
"y": [46, 48],
"label": [0.01, None],
"g": ["A", "B"]
}
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_na_data, na_text="None")
nudge_x/nudge_y, nudge_unit¶gggrid([
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data) + ggtitle("Default"),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, nudge_y=-2) + ggtitle("nudge_y=-2"),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, nudge_x=.25) + ggtitle("nudge_x=.25"),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, nudge_x=10, nudge_unit='px') + \
ggtitle("nudge_x=10, nudge_unit='px'"),
], ncol=2)
size_unit¶gggrid([
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, size=5) + ggtitle("Default size_unit"),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, size=5, size_unit='y') + ggtitle("size_unit='y'"),
]) + ggsize(800, 600)
position¶brackets_grouped_data2 = {
"xmin": ["f", "f", "f", "f"],
"xmax": ["4", "4", "r", "r"],
"y": [50, 50, 56, 56],
"label": [0.01, 0.03, 0.02, 0.04],
"year": [1999, 2008, 1999, 2008]
}
gggrid([
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, position=position_nudge(x=.25)) + \
ggtitle("position_nudge(x=.25)"),
p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, position=position_nudge(y=-2)) + \
ggtitle("position_nudge(y=-2)"),
grouped_p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label", color=as_discrete("year")), data=brackets_grouped_data2, position=position_dodgev()),
], ncol=2)
show_legend¶p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label",
size="g", angle="g", linetype="g", segment_color="g", segment_alpha="g", segment_size="g"),
data=brackets_data, show_legend=True)
manual_key¶p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, color="blue", manual_key="p-value")
sampling¶p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=brackets_data, sampling=sampling_random(1))
color_by¶p + geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label", paint_a="g"), data=brackets_data, color_by="paint_a")
bracket_plot + ggmarginal("r", layer=geom_histogram())
bracket_plot + ggtb()
grouped_p + \
geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label", color=as_discrete("year")), data=brackets_grouped_data2) + \
facet_grid(x="year")
bracket_plot + coord_flip()
tests = [
{
'title': "Empty data",
'data': {
'xmin': [],
'xmax': [],
'y': [],
'label': [],
}
},
{
'title': "One element",
'data': {
'xmin': [0],
'xmax': [1],
'y': [0],
'label': ["a"],
}
},
{
'title': "NaN's in data",
'data': {
'xmin': [0, None, 0, 0, 0],
'xmax': [1, 1, None, 1, 1],
'y': [0, 1, 2, None, 4],
'label': ["a", "a", "a", "a", None],
}
},
]
gggrid([
ggplot(t['data']) + \
geom_bracket(aes(xmin='xmin', xmax='xmax', y='y', label='label')) + \
ggtitle(t['title'])
for t in tests
], ncol=2)
def get_test_plot(dy, shift):
y_base = shift * dy
box_data = {
"x": ["A", "B", "C"],
"y": [y_base, y_base + dy, y_base - dy],
"ymin": [y_base - 5 * dy, y_base - 4 * dy, y_base - 6 * dy],
"ymax": [y_base + 5 * dy, y_base + 6 * dy, y_base + 4 * dy],
}
bracket_data = {
"xmin": ["A", "A"],
"xmax": ["B", "C"],
"y": [y_base + 7 * dy, y_base + 8 * dy],
"label": [0.01, 0.02],
}
return ggplot() + \
geom_crossbar(aes(x="x", y="y", ymin="ymin", ymax="ymax"), data=box_data) + \
geom_bracket(aes(xmin="xmin", xmax="xmax", y="y", label="label"), data=bracket_data)
gggrid([
get_test_plot(1e-11, 3.14e6),
get_test_plot(1e-11, -3.14e6),
get_test_plot(1e11, 3.14e6),
get_test_plot(1e11, -3.14e6),
], ncol=2)