Custom Buttons in Julia
How to add custom buttons to update Plotly chart attributes in Julia.
Plotly Studio: Transform any dataset into an interactive data application in minutes with AI. Try Plotly Studio now.
Note: We are retiring documentation for R, MATLAB, Julia, and F# in November 2025. Learn more about this change here.
Methods
The updatemenu method determines which plotly.js function will be used to modify the chart. There are 4 possible methods:
"restyle"
: modify data or data attributes"relayout"
: modify layout attributes"update"
: modify data and layout attributes; combination of"restyle"
and"relayout"
"animate"
: start or pause an animation)
Restyle Button
The "restyle"
method should be used when modifying the data and data attributes of the graph.<br> Update One Data Attribute<br> This example demonstrates how to update a single data attribute: chart type
with the "restyle"
method.
using PlotlyJS, CSV, DataFrames, HTTP
# load dataset
df = CSV.File(
HTTP.get("https://raw.githubusercontent.com/plotly/datasets/master/volcano.csv").body
) |> DataFrame
# create figure
# Add surface trace
p = plot(surface(z=Matrix{Float64}(df), colorscale="Viridis"))
# Update plot sizing
relayout!(p,
width=800,
height=900,
autosize=false,
margin=attr(t=0, b=0, l=0, r=0),
template="plotly_white",
)
# Update 3D scene options
# fig.update_scenes(
# aspectratio=attr(x=1, y=1, z=0.7),
# aspectmode="manual"
# )
# Add dropdown
relayout!(p,
updatemenus=[
attr(
type = "buttons",
direction = "left",
buttons=[
attr(
args=["type", "surface"],
label="3D Surface",
method="restyle"
),
attr(
args=["type", "heatmap"],
label="Heatmap",
method="restyle"
)
],
pad=attr(r= 10, t=10),
showactive=true,
x=0.11,
xanchor="left",
y=1.1,
yanchor="top"
),
]
)
# Add annotation
relayout!(p,
annotations=[
attr(text="Trace type:", showarrow=false,
x=0, y=1.08, yref="paper", align="left")
]
)
p
Update Several Data Attributes<br> This example demonstrates how to update several data attributes: colorscale, colorscale direction, and line display with the "restyle" method.
using PlotlyJS, CSV, DataFrames, HTTP
# load dataset
df = CSV.File(
HTTP.get("https://raw.githubusercontent.com/plotly/datasets/master/volcano.csv").body
) |> DataFrame
# Create figure
# Add surface trace
p = plot(heatmap(z=Matrix{Float64}(df), colorscale="Viridis"))
# Update plot sizing
relayout!(p,
width=800,
height=900,
autosize=false,
margin=attr(t=100, b=0, l=0, r=0),
)
# # Update 3D scene options
# fig.update_scenes(
# aspectratio=attr(x=1, y=1, z=0.7),
# aspectmode="manual"
# )
# Add drowdowns
# button_layer_1_height = 1.08
button_layer_1_height = 1.12
button_layer_2_height = 1.065
relayout!(p,
updatemenus=[
attr(
buttons=[
attr(
args=["colorscale", "Viridis"],
label="Viridis",
method="restyle"
),
attr(
args=["colorscale", "Cividis"],
label="Cividis",
method="restyle"
),
attr(
args=["colorscale", "Blues"],
label="Blues",
method="restyle"
),
attr(
args=["colorscale", "Greens"],
label="Greens",
method="restyle"
),
],
type = "buttons",
direction="right",
pad=attr(r=10, t=10),
showactive=true,
x=0.1,
xanchor="left",
y=button_layer_1_height,
yanchor="top"
),
attr(
buttons=[
attr(
args=["reversescale", false],
label="False",
method="restyle"
),
attr(
args=["reversescale", true],
label="true",
method="restyle"
)
],
type = "buttons",
direction="right",
pad=attr(r=10, t=10),
showactive=true,
x=0.13,
xanchor="left",
y=button_layer_2_height,
yanchor="top"
),
attr(
buttons=[
attr(
args=[Dict("contours.showlines" => false, "type" => "contour")],
label="Hide lines",
method="restyle"
),
attr(
args=[Dict("contours.showlines" => true, "type" =>"contour")],
label="Show lines",
method="restyle"
),
],
type = "buttons",
direction="right",
pad=attr(r=10, t=10),
showactive=true,
x=0.5,
xanchor="left",
y=button_layer_2_height,
yanchor="top"
),
]
)
relayout!(p,
annotations=[
attr(text="colorscale", x=0, xref="paper", y=1.1, yref="paper",
align="left", showarrow=false),
attr(text="Reverse<br>Colorscale", x=0, xref="paper", y=1.06,
yref="paper", showarrow=false),
attr(text="Lines", x=0.47, xref="paper", y=1.045, yref="paper",
showarrow=false)
])
nothing
Relayout Button
The "relayout"
method should be used when modifying the layout attributes of the graph.<br> Update One Layout Attribute<br> This example demonstrates how to update a layout attribute: chart type
with the "relayout"
method.
using PlotlyJS, Distributions
x0 = rand(Normal(2, 0.4), 400)
y0 = rand(Normal(2, 0.4), 400)
x1 = rand(Normal(3, 0.6), 600)
y1 = rand(Normal(6, 0.4), 400)
x2 = rand(Normal(4, 0.2), 200)
y2 = rand(Normal(4, 0.4), 200)
trace1 = scatter(x=x0, y=y0, mode="markers", marker_color="DarkOrange")
trace2 = scatter(x=x1, y=y1, mode="markers", marker_color="Crimson")
trace3 = scatter(x=x2, y=y2, mode="markers", marker_color="RebeccaPurple")
# Add buttons that add shapes
cluster0 = [attr(type="circle",
xref="x", yref="y",
x0=minimum(x0), y0=minimum(y0),
x1=maximum(x0), y1=maximum(y0),
line=attr(color="DarkOrange"))]
cluster1 = [attr(type="circle",
xref="x", yref="y",
x0=minimum(x1), y0=minimum(y1),
x1=maximum(x1), y1=maximum(y1),
line=attr(color="Crimson"))]
cluster2 = [attr(type="circle",
xref="x", yref="y",
x0=minimum(x2), y0=minimum(y2),
x1=maximum(x2), y1=maximum(y2),
line=attr(color="RebeccaPurple"))]
layout = Layout(
updatemenus=[
attr(
buttons=[
attr(label="None",
method="relayout",
args=["shapes", []]),
attr(label="Cluster 0",
method="relayout",
args=["shapes", cluster0]),
attr(label="Cluster 1",
method="relayout",
args=["shapes", cluster1]),
attr(label="Cluster 2",
method="relayout",
args=["shapes", cluster2]),
attr(label="All",
method="relayout",
args=["shapes", vcat(cluster0, cluster1, cluster2)])
],
)
],
title_text="Highlight Clusters",
showlegend=false
)
plot([trace1, trace2, trace3], layout)
Update Button
The "update"
method should be used when modifying the data and layout sections of the graph.<br> This example demonstrates how to update which traces are displayed while simultaneously updating layout attributes such as the chart title and annotations.
using PlotlyJS, CSV, DataFrames
df = CSV.File(
HTTP.get("https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv").body
) |> DataFrame
x = range(1, stop=size(df)[1])
trace1 = scatter(
df,
x=x,
y=df[!, "AAPL.High"] ,
name="High",
line_color="#33CFA5"
)
trace2 = scatter(
df,
x=x,
y=repeat([mean(df[!, "AAPL.High"])], size(df)[1]),
name="High Average",
visible=false,
line=attr(color="#33CFA5", dash="dash")
)
trace3 = scatter(
df,
x=x,
y=df[!, "AAPL.Low"],
name="Low",
line_color="#F06A6A"
)
trace4 = scatter(
df,
x=x,
y=repeat([mean(df[!, "AAPL.Low"])], size(df)[1]),
name="Low Average",
visible=false,
line=attr(color="#F06A6A", dash="dash")
)
high_annotations = [attr(x="2016-03-01",
y=mean(df[:, "AAPL.High"]),
xref="x", yref="y",
text=string("High Average:<br> ", mean(df[:, "AAPL.High"])),
ax=0, ay=-40),
attr(x=argmax(df[!, "AAPL.High"]),
y=maximum(df[:, "AAPL.High"]),
xref="x", yref="y",
text=string("High Max:<br> ", maximum(df[:, "AAPL.High"])),
ax=0, ay=-40)]
low_annotations = [attr(x="2015-05-01",
y=mean(df[:, "AAPL.Low"]),
xref="x", yref="y",
text=string("Low Average:<br>", mean(df[:, "AAPL.Low"])),
ax=0, ay=40),
attr(x=argmin(df[!, "AAPL.High"]),
y=minimum(df[:, "AAPL.Low"]),
xref="x", yref="y",
text=string("Low Min:<br>", minimum(df[:, "AAPL.Low"])),
ax=0, ay=40)]
layout = Layout(
updatemenus=[
attr(
active=0,
buttons=[
attr(
label="None",
method="update",
args=[
attr(visible= [true, false, true, false]),
attr(title= "Yahoo",
annotations=[]
)
]
),
attr(label="High",
method="update",
args=[
attr(visible= [true, true, false, false]),
attr(
title= "Yahoo High",
annotations=high_annotations
)
]
),
attr(
label="Low",
method="update",
args=[
attr(visible= [false, false, true, true]),
attr(
title= "Yahoo Low",
annotations=low_annotations
)
]
),
attr(
label="Both",
method="update",
args=[
attr(visible=[true, true, true, true]),
attr(
title="Yahoo",
annotations=vcat(high_annotations, low_annotations)
)
]
),
],
)
])
plot([trace1, trace2, trace3, trace4], layout)
Animate Button
Refer to our animation docs: https://plotly.com/julia/#animations for examples on how to use the animate
method with Plotly buttons.
Reference
See https://plotly.com/julia/reference/layout/updatemenus/ for more information about updatemenu
buttons.