using PlotlyJS, DataFrames, CSV, Dates
function linescatter1()
trace1 = scatter(;x=1:4, y=[10, 15, 13, 17], mode="markers")
trace2 = scatter(;x=2:5, y=[16, 5, 11, 9], mode="lines")
trace3 = scatter(;x=1:4, y=[12, 9, 15, 12], mode="lines+markers")
plot([trace1, trace2, trace3])
end
linescatter1()
1 2 3 4 5 6 8 10 12 14 16 trace 0 trace 1 trace 2 function linescatter2()
trace1 = scatter(;x=1:5, y=[1, 6, 3, 6, 1],
mode="markers", name="Team A",
text=["A-1", "A-2", "A-3", "A-4", "A-5"],
marker_size=12)
trace2 = scatter(;x=1:5+0.5, y=[4, 1, 7, 1, 4],
mode="markers", name= "Team B",
text=["B-a", "B-b", "B-c", "B-d", "B-e"])
# setting marker.size this way is _equivalent_ to what we did for trace1
trace2["marker"] = Dict(:size => 12)
data = [trace1, trace2]
layout = Layout(;title="Data Labels Hover", xaxis_range=[0.75, 5.25],
yaxis_range=[0, 8])
plot(data, layout)
end
linescatter2()
1 2 3 4 5 0 1 2 3 4 5 6 7 8 Team A Team B Data Labels Hover function linescatter3()
trace1 = scatter(;x=1:5, y=[1, 6, 3, 6, 1],
mode="markers+text", name="Team A",
textposition="top center",
text=["A-1", "A-2", "A-3", "A-4", "A-5"],
marker_size=12, textfont_family="Raleway, sans-serif")
trace2 = scatter(;x=1:5+0.5, y=[4, 1, 7, 1, 4],
mode="markers+text", name= "Team B",
textposition="bottom center",
text= ["B-a", "B-b", "B-c", "B-d", "B-e"],
marker_size=12, textfont_family="Times New Roman")
data = [trace1, trace2]
layout = Layout(;title="Data Labels on the Plot", xaxis_range=[0.75, 5.25],
yaxis_range=[0, 8], legend_y=0.5, legend_yref="paper",
legend=attr(family="Arial, sans-serif", size=20,
color="grey"))
plot(data, layout)
end
linescatter3()
A-1 A-2 A-3 A-4 A-5 B-a B-b B-c B-d B-e 1 2 3 4 5 0 1 2 3 4 5 6 7 8 Team A Aa Team B Aa Data Labels on the Plot function linescatter4()
trace1 = scatter(;y=fill(5, 40), mode="markers", marker_size=40,
marker_color=0:39)
layout = Layout(title="Scatter Plot with a Color Dimension")
plot(trace1, layout)
end
linescatter4()
0 10 20 30 40 4 4.5 5 5.5 6 Scatter Plot with a Color Dimension function linescatter5()
country = ["Switzerland (2011)", "Chile (2013)", "Japan (2014)",
"United States (2012)", "Slovenia (2014)", "Canada (2011)",
"Poland (2010)", "Estonia (2015)", "Luxembourg (2013)",
"Portugal (2011)"]
votingPop = [40, 45.7, 52, 53.6, 54.1, 54.2, 54.5, 54.7, 55.1, 56.6]
regVoters = [49.1, 42, 52.7, 84.3, 51.7, 61.1, 55.3, 64.2, 91.1, 58.9]
# notice use of `attr` function to make nested attributes
trace1 = scatter(;x=votingPop, y=country, mode="markers",
name="Percent of estimated voting age population",
marker=attr(color="rgba(156, 165, 196, 0.95)",
line_color="rgba(156, 165, 196, 1.0)",
line_width=1, size=16, symbol="circle"))
trace2 = scatter(;x=regVoters, y=country, mode="markers",
name="Percent of estimated registered voters")
# also could have set the marker props above by using a dict
trace2["marker"] = Dict(:color => "rgba(204, 204, 204, 0.95)",
:line => Dict(:color=> "rgba(217, 217, 217, 1.0)",
:width=> 1),
:symbol => "circle",
:size => 16)
data = [trace1, trace2]
layout = Layout(Dict{Symbol,Any}(:paper_bgcolor => "rgb(254, 247, 234)",
:plot_bgcolor => "rgb(254, 247, 234)");
title="Votes cast for ten lowest voting age population in OECD countries",
width=600, height=600, hovermode="closest",
margin=Dict(:l => 140, :r => 40, :b => 50, :t => 80),
xaxis=attr(showgrid=false, showline=true,
linecolor="rgb(102, 102, 102)",
titlefont_color="rgb(204, 204, 204)",
tickfont_color="rgb(102, 102, 102)",
autotick=false, dtick=10, ticks="outside",
tickcolor="rgb(102, 102, 102)"),
legend=attr(font_size=10, yanchor="middle",
xanchor="right"),
)
plot(data, layout)
end
linescatter5()
40 50 60 70 80 90 Switzerland (2011) Chile (2013) Japan (2014) United States (2012) Slovenia (2014) Canada (2011) Poland (2010) Estonia (2015) Luxembourg (2013) Portugal (2011) Percent of estimated voting age population Percent of estimated registered voters Votes cast for ten lowest voting age population in OECD countries function linescatter6()
trace1 = scatter(;x=[52698, 43117], y=[53, 31],
mode="markers",
name="North America",
text=["United States", "Canada"],
marker=attr(color="rgb(164, 194, 244)", size=12,
line=attr(color="white", width=0.5))
)
trace2 = scatter(;x=[39317, 37236, 35650, 30066, 29570, 27159, 23557, 21046, 18007],
y=[33, 20, 13, 19, 27, 19, 49, 44, 38],
mode="markers", name="Europe",
marker_size=12, marker_color="rgb(255, 217, 102)",
text=["Germany", "Britain", "France", "Spain", "Italy",
"Czech Rep.", "Greece", "Poland", "Portugal"])
trace3 = scatter(;x=[42952, 37037, 33106, 17478, 9813, 5253, 4692, 3899],
y=[23, 42, 54, 89, 14, 99, 93, 70],
mode="markers",
name="Asia/Pacific",
marker_size=12, marker_color="rgb(234, 153, 153)",
text=["Australia", "Japan", "South Korea", "Malaysia",
"China", "Indonesia", "Philippines", "India"])
trace4 = scatter(;x=[19097, 18601, 15595, 13546, 12026, 7434, 5419],
y=[43, 47, 56, 80, 86, 93, 80],
mode="markers", name="Latin America",
marker_size=12, marker_color="rgb(142, 124, 195)",
text=["Chile", "Argentina", "Mexico", "Venezuela",
"Venezuela", "El Salvador", "Bolivia"])
data = [trace1, trace2, trace3, trace4]
layout = Layout(;title="Quarter 1 Growth",
xaxis=attr(title="GDP per Capital", showgrid=false, zeroline=false),
yaxis=attr(title="Percent", zeroline=false))
plot(data, layout)
end
linescatter6()
10k 20k 30k 40k 50k 20 40 60 80 100 North America Europe Asia/Pacific Latin America Quarter 1 Growth GDP per Capital Percent function batman()
# reference: https://github.com/alanedelman/18.337_2015/blob/master/Lecture01_0909/The%20Bat%20Curve.ipynb
σ(x) = @. √(1-x.^2)
el(x) = @. 3*σ(x/7)
s(x) = @. 4.2 - 0.5*x - 2.0*σ(0.5*x-0.5)
b(x) = @. σ(abs(2-x)-1) - x.^2/11 + 0.5x - 3
c(x) = [1.7, 1.7, 2.6, 0.9]
p(i, f; kwargs...) = scatter(;x=[-i; 0.0; i], y=[f(i); NaN; f(i)],
marker_color="black", showlegend=false,
kwargs...)
traces = vcat(p(3:0.1:7, el; name="wings 1"),
p(4:0.1:7, t->-el(t); name="wings 2"),
p(1:0.1:3, s; name="Shoulders"),
p(0:0.1:4, b; name="Bottom"),
p([0, 0.5, 0.8, 1], c; name="head"))
plot(traces, Layout(title="Batman"))
end
batman()
−6 −4 −2 0 2 4 6 −3 −2 −1 0 1 2 3 Batman function dumbell()
# reference: https://plot.ly/r/dumbbell-plots/
# read Data into dataframe
nm = tempname()
url = "https://raw.githubusercontent.com/plotly/datasets/master/school_earnings.csv"
download(url, nm)
df = CSV.read(nm)
rm(nm)
# sort dataframe by male earnings
df = sort(df, :Men, rev=false)
men = scatter(;y=df[:School], x=df[:Men], mode="markers", name="Men",
marker=attr(color="blue", size=12))
women = scatter(;y=df[:School], x=df[:Women], mode="markers", name="Women",
marker=attr(color="pink", size=12))
lines = map(eachrow(df)) do r
scatter(y=fill(r[:School], 2), x=[r[:Women], r[:Men]], mode="lines",
name=r[:School], showlegend=false, line_color="gray")
end
data = Base.typed_vcat(GenericTrace, men, women, lines)
layout = Layout(width=650, height=650, margin_l=100, yaxis_title="School",
xaxis_title="Annual Salary (thousands)",
title="Gender earnings disparity")
plot(data, layout)
end
dumbell()
60 80 100 120 140 160 UCLA SoCal Emory Michigan Berkeley Brown NYU Notre Dame Cornell Tufts Yale Dartmouth Chicago Columbia Duke Georgetown Princeton U.Penn Stanford MIT Harvard Men Women Gender earnings disparity Annual Salary (thousands) School function errorbars1()
trace1 = scatter(;x=vcat(1:10, 10:-1:1),
y=vcat(2:11, 9:-1:0),
fill="tozerox",
fillcolor="rgba(0, 100, 80, 0.2)",
line_color="transparent",
name="Fair",
showlegend=false)
trace2 = scatter(;x=vcat(1:10, 10:-1:1),
y=[5.5, 3.0, 5.5, 8.0, 6.0, 3.0, 8.0, 5.0, 6.0, 5.5, 4.75,
5.0, 4.0, 7.0, 2.0, 4.0, 7.0, 4.4, 2.0, 4.5],
fill="tozerox",
fillcolor="rgba(0, 176, 246, 0.2)",
line_color="transparent",
name="Premium",
showlegend=false)
trace3 = scatter(;x=vcat(1:10, 10:-1:1),
y=[11.0, 9.0, 7.0, 5.0, 3.0, 1.0, 3.0, 5.0, 3.0, 1.0,
-1.0, 1.0, 3.0, 1.0, -0.5, 1.0, 3.0, 5.0, 7.0, 9.],
fill="tozerox",
fillcolor="rgba(231, 107, 243, 0.2)",
line_color="transparent",
name="Fair",
showlegend=false)
trace4 = scatter(;x=1:10, y=1:10,
line_color="rgb(00, 100, 80)",
mode="lines",
name="Fair")
trace5 = scatter(;x=1:10,
y=[5.0, 2.5, 5.0, 7.5, 5.0, 2.5, 7.5, 4.5, 5.5, 5.],
line_color="rgb(0, 176, 246)",
mode="lines",
name="Premium")
trace6 = scatter(;x=1:10, y=vcat(10:-2:0, [2, 4,2, 0]),
line_color="rgb(231, 107, 243)",
mode="lines",
name="Ideal")
data = [trace1, trace2, trace3, trace4, trace5, trace6]
layout = Layout(;paper_bgcolor="rgb(255, 255, 255)",
plot_bgcolor="rgb(229, 229, 229)",
xaxis=attr(gridcolor="rgb(255, 255, 255)",
range=[1, 10],
showgrid=true,
showline=false,
showticklabels=true,
tickcolor="rgb(127, 127, 127)",
ticks="outside",
zeroline=false),
yaxis=attr(gridcolor="rgb(255, 255, 255)",
showgrid=true,
showline=false,
showticklabels=true,
tickcolor="rgb(127, 127, 127)",
ticks="outside",
zeroline=false))
plot(data, layout)
end
errorbars1()
2 4 6 8 10 0 2 4 6 8 10 Fair Premium Ideal function errorbars2()
function random_dates(d1::DateTime, d2::DateTime, n::Int)
map(Date, sort!(rand(d1:Dates.Hour(12):d2, n)))
end
function _random_number(num, mul)
value = []
j = 0
rand = 0
while j <= num+1
rand = rand() * mul
append!(value, [rand])
j += 1
end
return value
end
dates = random_dates(DateTime(2001, 1, 1), DateTime(2005, 12, 31), 50)
trace1 = scatter(;x=dates,
y=20.0 .* rand(50),
line_width=0,
marker_color="444",
mode="lines",
name="Lower Bound")
trace2 = scatter(;x=dates,
y=21.0 .* rand(50),
fill="tonexty",
fillcolor="rgba(68, 68, 68, 0.3)",
line_color="rgb(31, 119, 180)",
mode="lines",
name="Measurement")
trace3 = scatter(;x=dates,
y=22.0 .* rand(50),
fill="tonexty",
fillcolor="rgba(68, 68, 68, 0.3)",
line_width=0,
marker_color="444",
mode="lines",
name="Upper Bound")
data = [trace1, trace2, trace3]
t = "Continuous, variable value error bars<br> Notice the hover text!"
layout = Layout(;title=t, yaxis_title="Wind speed (m/s)")
plot(data, layout)
end
errorbars2()
2002 2003 2004 2005 0 5 10 15 20 Upper Bound Measurement Lower Bound Continuous, variable value error bars Notice the hover text! Wind speed (m/s)