diff --git a/docs/example_generation.jl b/docs/example_generation.jl index 842b5555..664b84cc 100644 --- a/docs/example_generation.jl +++ b/docs/example_generation.jl @@ -17,26 +17,38 @@ type PlotExample end +function fakedata(sz...) + y = Array(Float64, sz...) + for r in 2:size(y,1) + y[r,:] = 0.9 * y[r-1,:] + randn(size(y,2))' + end + y +end + + # the examples we'll run for each const examples = PlotExample[ PlotExample("Lines", "A simple line plot of the columns.", - [:(plot(cumsum(randn(50,10),1), w=3))]), + [:(plot(fakedata(50,5), w=3))]), PlotExample("Functions", "Plot multiple functions. You can also put the function first, or use the form `plot(f, xmin, xmax)` where f is a Function or AbstractVector{Function}.", [:(plot(0:0.01:4π, [sin,cos]))]), PlotExample("", "Or make a parametric plot (i.e. plot: (fx(u), fy(u))) with plot(fx, fy, umin, umax).", [:(plot(sin, x->sin(2x), 0, 2π, leg=false, fill=(0,:orange)))]), + PlotExample("Colors", + "Access predefined palettes (or build your own with the `colorscheme` method). Line/marker colors are auto-generated from the plot's palette, unless overridden. Set the `z` argument to turn on series gradients.", + [:(y = rand(100)), :(plot(0:10:100,rand(11,4),lab="lines",w=3, palette=:grays, fill=(0.5,:auto))), :(scatter!(y, z=abs(y-.5), m=(10,:heat), lab="grad"))]), PlotExample("Global", "Change the guides/background/limits/ticks. Convenience args `xaxis` and `yaxis` allow you to pass a tuple or value which will be mapped to the relevant args automatically. The `xaxis` below will be replaced with `xlabel` and `xlims` args automatically during the preprocessing step. You can also use shorthand functions: `title!`, `xaxis!`, `yaxis!`, `xlabel!`, `ylabel!`, `xlims!`, `ylims!`, `xticks!`, `yticks!`", [:(plot(rand(20,3), title="TITLE", xaxis=("XLABEL",(-5,30),0:2:20,:flip), yaxis=("YLABEL",:log10), background_color = RGB(0.2,0.2,0.2), leg=false))]), PlotExample("Two-axis", "Use the `axis` arguments.\n\nNote: Currently only supported with Qwt and PyPlot", [:(plot(Vector[randn(100), randn(100)*100]; axis = [:l :r], ylabel="LEFT", yrightlabel="RIGHT"))]), - PlotExample("Vectors w/ pluralized args", - "Plot multiple series with different numbers of points. Mix arguments that apply to all series (marker/markersize) with arguments unique to each series (colors).", - [:(plot(Vector[rand(10), rand(20)]; marker=:ellipse, markersize=8, c=(:red, :blue)))]), + PlotExample("Arguments", + "Plot multiple series with different numbers of points. Mix arguments that apply to all series (marker/markersize) with arguments unique to each series (colors). Special arguments `line`, `marker`, and `fill` will automatically figure out what arguments to set (for example, we are setting the `linestyle`, `linewidth`, and `color` arguments with `line`.) Note that we pass a matrix of colors, and this applies the colors to each series.", + [:(plot(Vector[rand(10), rand(20)]; marker=(:ellipse,8), line=(:dot,3,[:black :orange])))]), PlotExample("Build plot in pieces", "Start with a base plot...", [:(plot(rand(100)/3, reg=true, fill=(0,:green)))]), diff --git a/examples/colors.ipynb b/examples/colors.ipynb index 3a50cfa4..224bf332 100644 --- a/examples/colors.ipynb +++ b/examples/colors.ipynb @@ -31,44 +31,21 @@ ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - " color: grays\n", - " legend: false\n", - " linetype: scatter\n", - " markershape: ellipse\n", - " markersize: [10,20]\n", - " z: Any[" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "Plot{Plots.ImmersePackage() n=1}" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0.27853175064701796,0.41005743564094055,0.4063126392263827,0.2227202188515267,0.3926713695534525,0.2596126521922748,0.42346127648949694,0.2155346768462798,0.10352958811599677,0.23854544914289266,0.11688317388934877,0.31510851311804466,0.4239011048063106,0.0995502504856749,0.1440353988287133,0.11852741846756754,0.48379726721176297,0.07411191199726552,0.35665479824705204,0.38516706619680496,0.2601261740877805,0.2156045177840471,0.47660425282149754,0.39816976908097024,0.10197962587167986,0.23490466850429836,0.36706947902273046,0.4730237262175585,0.16304520070920558,0.32818754622023594,0.16036808127002145,0.016905953253691042,0.2800359476141836,0.3009637201542943,0.3521757258631424,0.49304300758679154,0.17917575203753633,0.12779566703113532,0.18879626812694994,0.47564626124687126,0.09720946540914577,0.14374336239874452,0.2538369321250771,0.44603959490999023,0.2108592273867793,0.07819553584560412,0.21991375795506252,0.4453523734005935,0.19775969509089286,0.3977347266837521,0.14910367686242987,0.10617942678247605,0.45677927402048835,0.12269031348970527,0.3585690597632265,0.45950431659372937,0.44833848432784884,0.0896034288015033,0.28830454518189863,0.2304593100057608,0.018744598791068157,0.34705258384758797,0.38568157833653416,0.05260114131149618,0.11403280901109847,0.0678843447891655,0.4806195646615925,0.3414477958088731,0.40407509522489304,0.27471878139107186,0.39754697924212534,0.3478981492237385,0.09133118477925439,0.37666906323757576,0.36548696809049286,0.39632017207749004,0.09754309041303477,0.2790733730858359,0.26234777082702365,0.46964119968075924,0.24192708990500345,0.37944870261861974,0.17758705609667458,0.06531819053032062,0.11527716940451405,0.46404187595514257,0.34985150795551223,0.49041147317180434,0.2503069840508909,0.3409577363973104,0.4585246230423392,0.364794887589206,0.27097831057657507,0.2496886358770931,0.11064542614546058,0.0810952834830716,0.26107796036177344,0.1764350740953342,0.08077546430390825,0.43359918006515485]]\n", - "\n" + "ename": "LoadError", + "evalue": "LoadError: Unknown key: color_palette\nwhile loading In[1], in expression starting on line 5", + "output_type": "error", + "traceback": [ + "LoadError: Unknown key: color_palette\nwhile loading In[1], in expression starting on line 5", + "" ] } ], "source": [ "using Plots\n", - "default(size=(400,250), leg=false)\n", + "default(size=(500,300), leg=true)\n", "y = rand(100)\n", - "p = scatter(Any[y], z=Any[abs(y-.5)], m=[10,20], leg=false, c=:grays)" + "scatter(y, z=abs(y-.5), m=10, c=:heat, lab=\"grad\")\n", + "plot!(0:10:100,rand(11,4),lab=\"lines\", palette=:grays)" ] }, { @@ -345,17 +322,19 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "RGB[@colorant_str(\"green\"),@colorant_str(\"lightgreen\"),@colorant_str(\"darkgreen\"),RGB(0,1,0)] = ColorTypes.RGB[RGB{U8}(0.0,0.502,0.0),RGB{U8}(0.565,0.933,0.565),RGB{U8}(0.0,0.392,0.0),RGB{U8}(0.0,1.0,0.0)]" - ] + "data": { + "text/plain": [ + ":blues" + ] + }, + "metadata": {}, + "output_type": "display_data" }, { "data": { @@ -364,44 +343,1109 @@ "\n", "\n", "\n", + " width=\"4.0mm\" height=\"25.0mm\"\n", + " fill=\"#ADD8E6\" stroke=\"none\" />\n", + "\n", + "\n", "\n", + " width=\"4.0mm\" height=\"25.0mm\"\n", + " fill=\"#93B8D8\" stroke=\"none\" />\n", + "\n", + "\n", "\n", + " width=\"4.0mm\" height=\"25.0mm\"\n", + " fill=\"#7997CB\" stroke=\"none\" />\n", + "\n", + "\n", "\n", + " width=\"4.0mm\" height=\"25.0mm\"\n", + " fill=\"#5F77BD\" stroke=\"none\" />\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "" ], "text/plain": [ - "4-element Array{ColorTypes.RGB{T<:Union{AbstractFloat,FixedPointNumbers.FixedPoint}},1}:\n", - " RGB{U8}(0.0,0.502,0.0) \n", - " RGB{U8}(0.565,0.933,0.565)\n", - " RGB{U8}(0.0,0.392,0.0) \n", - " RGB{U8}(0.0,1.0,0.0) " + "21-element Array{ColorTypes.RGB{T<:Union{AbstractFloat,FixedPointNumbers.FixedPoint}},1}:\n", + " RGB{U8}(0.678,0.847,0.902) \n", + " RGB{Float64}(0.64451,0.804706,0.884118) \n", + " RGB{Float64}(0.610588,0.762353,0.866275) \n", + " RGB{Float64}(0.576667,0.72,0.848431) \n", + " RGB{Float64}(0.542745,0.677647,0.830588) \n", + " RGB{Float64}(0.508824,0.635294,0.812745) \n", + " RGB{Float64}(0.474902,0.592941,0.794902) \n", + " RGB{Float64}(0.44098,0.550588,0.777059) \n", + " RGB{Float64}(0.407059,0.508235,0.759216) \n", + " RGB{Float64}(0.373137,0.465882,0.741373) \n", + " RGB{Float64}(0.339216,0.423529,0.723529) \n", + " RGB{Float64}(0.305294,0.381176,0.705686) \n", + " RGB{Float64}(0.271373,0.338824,0.687843) \n", + " RGB{Float64}(0.237451,0.296471,0.67) \n", + " RGB{Float64}(0.203529,0.254118,0.652157) \n", + " RGB{Float64}(0.169608,0.211765,0.634314) \n", + " RGB{Float64}(0.135686,0.169412,0.616471) \n", + " RGB{Float64}(0.101765,0.127059,0.598627) \n", + " RGB{Float64}(0.0678431,0.0847059,0.580784)\n", + " RGB{Float64}(0.0339216,0.0423529,0.562941)\n", + " RGB{Float64}(0.0,0.0,0.545098) " ] }, - "execution_count": 13, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] + "data": { + "text/plain": [ + ":bluesreds" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "21-element Array{ColorTypes.RGB{T<:Union{AbstractFloat,FixedPointNumbers.FixedPoint}},1}:\n", + " RGB{U8}(0.0,0.0,0.545) \n", + " RGB{Float64}(0.08,0.085,0.570588)\n", + " RGB{Float64}(0.16,0.17,0.596078) \n", + " RGB{Float64}(0.24,0.255,0.621569)\n", + " RGB{Float64}(0.32,0.34,0.647059) \n", + " RGB{Float64}(0.4,0.425,0.672549) \n", + " RGB{Float64}(0.48,0.51,0.698039) \n", + " RGB{Float64}(0.56,0.595,0.723529)\n", + " RGB{Float64}(0.64,0.68,0.74902) \n", + " RGB{Float64}(0.72,0.765,0.77451) \n", + " RGB{Float64}(0.8,0.85,0.8) \n", + " RGB{Float64}(0.77451,0.765,0.72) \n", + " RGB{Float64}(0.74902,0.68,0.64) \n", + " RGB{Float64}(0.723529,0.595,0.56)\n", + " RGB{Float64}(0.698039,0.51,0.48) \n", + " RGB{Float64}(0.672549,0.425,0.4) \n", + " RGB{Float64}(0.647059,0.34,0.32) \n", + " RGB{Float64}(0.621569,0.255,0.24)\n", + " RGB{Float64}(0.596078,0.17,0.16) \n", + " RGB{Float64}(0.570588,0.085,0.08)\n", + " RGB{Float64}(0.545098,0.0,0.0) " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + ":darkrainbow" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "21-element Array{ColorTypes.RGB{T<:Union{AbstractFloat,FixedPointNumbers.FixedPoint}},1}:\n", + " RGB{Float64}(0.0,0.0,0.9) \n", + " RGB{Float64}(0.0803922,0.0,0.800392) \n", + " RGB{Float64}(0.160784,0.0,0.700784) \n", + " RGB{Float64}(0.241176,0.0,0.601176) \n", + " RGB{Float64}(0.321569,0.0,0.501569) \n", + " RGB{Float64}(0.401961,0.0,0.401961) \n", + " RGB{Float64}(0.321569,0.0803922,0.321569) \n", + " RGB{Float64}(0.241176,0.160784,0.241176) \n", + " RGB{Float64}(0.160784,0.241176,0.160784) \n", + " RGB{Float64}(0.0803922,0.321569,0.0803922)\n", + " RGB{Float64}(0.0,0.401961,0.0) \n", + " RGB{Float64}(0.18,0.43098,0.0) \n", + " RGB{Float64}(0.36,0.46,0.0) \n", + " RGB{Float64}(0.54,0.48902,0.0) \n", + " RGB{Float64}(0.72,0.518039,0.0) \n", + " RGB{Float64}(0.9,0.547059,0.0) \n", + " RGB{Float64}(0.9,0.437647,0.0) \n", + " RGB{Float64}(0.9,0.328235,0.0) \n", + " RGB{Float64}(0.9,0.218824,0.0) \n", + " RGB{Float64}(0.9,0.109412,0.0) \n", + " RGB{Float64}(0.9,0.0,0.0) " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + ":grays" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "21-element Array{ColorTypes.RGB{T<:Union{AbstractFloat,FixedPointNumbers.FixedPoint}},1}:\n", + " RGB{Float64}(0.95,0.95,0.95) \n", + " RGB{Float64}(0.905,0.905,0.905)\n", + " RGB{Float64}(0.86,0.86,0.86) \n", + " RGB{Float64}(0.815,0.815,0.815)\n", + " RGB{Float64}(0.77,0.77,0.77) \n", + " RGB{Float64}(0.725,0.725,0.725)\n", + " RGB{Float64}(0.68,0.68,0.68) \n", + " RGB{Float64}(0.635,0.635,0.635)\n", + " RGB{Float64}(0.59,0.59,0.59) \n", + " RGB{Float64}(0.545,0.545,0.545)\n", + " RGB{Float64}(0.5,0.5,0.5) \n", + " RGB{Float64}(0.455,0.455,0.455)\n", + " RGB{Float64}(0.41,0.41,0.41) \n", + " RGB{Float64}(0.365,0.365,0.365)\n", + " RGB{Float64}(0.32,0.32,0.32) \n", + " RGB{Float64}(0.275,0.275,0.275)\n", + " RGB{Float64}(0.23,0.23,0.23) \n", + " RGB{Float64}(0.185,0.185,0.185)\n", + " RGB{Float64}(0.14,0.14,0.14) \n", + " RGB{Float64}(0.095,0.095,0.095)\n", + " RGB{Float64}(0.05,0.05,0.05) " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + ":greens" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "21-element Array{ColorTypes.RGB{T<:Union{AbstractFloat,FixedPointNumbers.FixedPoint}},1}:\n", + " RGB{U8}(0.565,0.933,0.565) \n", + " RGB{Float64}(0.536471,0.906275,0.536471) \n", + " RGB{Float64}(0.508235,0.879216,0.508235) \n", + " RGB{Float64}(0.48,0.852157,0.48) \n", + " RGB{Float64}(0.451765,0.825098,0.451765) \n", + " RGB{Float64}(0.423529,0.798039,0.423529) \n", + " RGB{Float64}(0.395294,0.77098,0.395294) \n", + " RGB{Float64}(0.367059,0.743922,0.367059) \n", + " RGB{Float64}(0.338824,0.716863,0.338824) \n", + " RGB{Float64}(0.310588,0.689804,0.310588) \n", + " RGB{Float64}(0.282353,0.662745,0.282353) \n", + " RGB{Float64}(0.254118,0.635686,0.254118) \n", + " RGB{Float64}(0.225882,0.608627,0.225882) \n", + " RGB{Float64}(0.197647,0.581569,0.197647) \n", + " RGB{Float64}(0.169412,0.55451,0.169412) \n", + " RGB{Float64}(0.141176,0.527451,0.141176) \n", + " RGB{Float64}(0.112941,0.500392,0.112941) \n", + " RGB{Float64}(0.0847059,0.473333,0.0847059)\n", + " RGB{Float64}(0.0564706,0.446275,0.0564706)\n", + " RGB{Float64}(0.0282353,0.419216,0.0282353)\n", + " RGB{Float64}(0.0,0.392157,0.0) " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + ":heat" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "21-element Array{ColorTypes.RGB{T<:Union{AbstractFloat,FixedPointNumbers.FixedPoint}},1}:\n", + " RGB{U8}(1.0,1.0,0.878) \n", + " RGB{Float64}(1.0,0.964706,0.790588) \n", + " RGB{Float64}(1.0,0.929412,0.702745) \n", + " RGB{Float64}(1.0,0.894118,0.614902) \n", + " RGB{Float64}(1.0,0.858824,0.527059) \n", + " RGB{Float64}(1.0,0.823529,0.439216) \n", + " RGB{Float64}(1.0,0.788235,0.351373) \n", + " RGB{Float64}(1.0,0.752941,0.263529) \n", + " RGB{Float64}(1.0,0.717647,0.175686) \n", + " RGB{Float64}(1.0,0.682353,0.0878431)\n", + " RGB{Float64}(1.0,0.647059,0.0) \n", + " RGB{Float64}(0.95451,0.582353,0.0) \n", + " RGB{Float64}(0.90902,0.517647,0.0) \n", + " RGB{Float64}(0.863529,0.452941,0.0) \n", + " RGB{Float64}(0.818039,0.388235,0.0) \n", + " RGB{Float64}(0.772549,0.323529,0.0) \n", + " RGB{Float64}(0.727059,0.258824,0.0) \n", + " RGB{Float64}(0.681569,0.194118,0.0) \n", + " RGB{Float64}(0.636078,0.129412,0.0) \n", + " RGB{Float64}(0.590588,0.0647059,0.0)\n", + " RGB{Float64}(0.545098,0.0,0.0) " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + ":lightrainbow" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "21-element Array{ColorTypes.RGB{T<:Union{AbstractFloat,FixedPointNumbers.FixedPoint}},1}:\n", + " RGB{Float64}(0.3,0.3,1.0) \n", + " RGB{Float64}(0.400392,0.3,0.960392) \n", + " RGB{Float64}(0.500784,0.3,0.920784) \n", + " RGB{Float64}(0.601176,0.3,0.881176) \n", + " RGB{Float64}(0.701569,0.3,0.841569) \n", + " RGB{Float64}(0.801961,0.3,0.801961) \n", + " RGB{Float64}(0.701569,0.400392,0.701569)\n", + " RGB{Float64}(0.601176,0.500784,0.601176)\n", + " RGB{Float64}(0.500784,0.601176,0.500784)\n", + " RGB{Float64}(0.400392,0.701569,0.400392)\n", + " RGB{Float64}(0.3,0.801961,0.3) \n", + " RGB{Float64}(0.44,0.83098,0.3) \n", + " RGB{Float64}(0.58,0.86,0.3) \n", + " RGB{Float64}(0.72,0.88902,0.3) \n", + " RGB{Float64}(0.86,0.918039,0.3) \n", + " RGB{Float64}(1.0,0.947059,0.3) \n", + " RGB{Float64}(1.0,0.817647,0.3) \n", + " RGB{Float64}(1.0,0.688235,0.3) \n", + " RGB{Float64}(1.0,0.558824,0.3) \n", + " RGB{Float64}(1.0,0.429412,0.3) \n", + " RGB{Float64}(1.0,0.3,0.3) " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + ":rainbow" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "21-element Array{ColorTypes.RGB{T<:Union{AbstractFloat,FixedPointNumbers.FixedPoint}},1}:\n", + " RGB{U8}(0.0,0.0,1.0) \n", + " RGB{Float64}(0.100392,0.0,0.900392) \n", + " RGB{Float64}(0.200784,0.0,0.800784) \n", + " RGB{Float64}(0.301176,0.0,0.701176) \n", + " RGB{Float64}(0.401569,0.0,0.601569) \n", + " RGB{Float64}(0.501961,0.0,0.501961) \n", + " RGB{Float64}(0.401569,0.100392,0.401569)\n", + " RGB{Float64}(0.301176,0.200784,0.301176)\n", + " RGB{Float64}(0.200784,0.301176,0.200784)\n", + " RGB{Float64}(0.100392,0.401569,0.100392)\n", + " RGB{Float64}(0.0,0.501961,0.0) \n", + " RGB{Float64}(0.2,0.53098,0.0) \n", + " RGB{Float64}(0.4,0.56,0.0) \n", + " RGB{Float64}(0.6,0.58902,0.0) \n", + " RGB{Float64}(0.8,0.618039,0.0) \n", + " RGB{Float64}(1.0,0.647059,0.0) \n", + " RGB{Float64}(1.0,0.517647,0.0) \n", + " RGB{Float64}(1.0,0.388235,0.0) \n", + " RGB{Float64}(1.0,0.258824,0.0) \n", + " RGB{Float64}(1.0,0.129412,0.0) \n", + " RGB{Float64}(1.0,0.0,0.0) " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + ":reds" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "21-element Array{ColorTypes.RGB{T<:Union{AbstractFloat,FixedPointNumbers.FixedPoint}},1}:\n", + " RGB{U8}(1.0,0.714,0.757) \n", + " RGB{Float64}(0.977255,0.678039,0.71902) \n", + " RGB{Float64}(0.95451,0.642353,0.681176) \n", + " RGB{Float64}(0.931765,0.606667,0.643333) \n", + " RGB{Float64}(0.90902,0.57098,0.60549) \n", + " RGB{Float64}(0.886275,0.535294,0.567647) \n", + " RGB{Float64}(0.863529,0.499608,0.529804) \n", + " RGB{Float64}(0.840784,0.463922,0.491961) \n", + " RGB{Float64}(0.818039,0.428235,0.454118) \n", + " RGB{Float64}(0.795294,0.392549,0.416275) \n", + " RGB{Float64}(0.772549,0.356863,0.378431) \n", + " RGB{Float64}(0.749804,0.321176,0.340588) \n", + " RGB{Float64}(0.727059,0.28549,0.302745) \n", + " RGB{Float64}(0.704314,0.249804,0.264902) \n", + " RGB{Float64}(0.681569,0.214118,0.227059) \n", + " RGB{Float64}(0.658824,0.178431,0.189216) \n", + " RGB{Float64}(0.636078,0.142745,0.151373) \n", + " RGB{Float64}(0.613333,0.107059,0.113529) \n", + " RGB{Float64}(0.590588,0.0713725,0.0756863)\n", + " RGB{Float64}(0.567843,0.0356863,0.0378431)\n", + " RGB{Float64}(0.545098,0.0,0.0) " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + ":redsblues" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "21-element Array{ColorTypes.RGB{T<:Union{AbstractFloat,FixedPointNumbers.FixedPoint}},1}:\n", + " RGB{U8}(0.545,0.0,0.0) \n", + " RGB{Float64}(0.570588,0.085,0.08)\n", + " RGB{Float64}(0.596078,0.17,0.16) \n", + " RGB{Float64}(0.621569,0.255,0.24)\n", + " RGB{Float64}(0.647059,0.34,0.32) \n", + " RGB{Float64}(0.672549,0.425,0.4) \n", + " RGB{Float64}(0.698039,0.51,0.48) \n", + " RGB{Float64}(0.723529,0.595,0.56)\n", + " RGB{Float64}(0.74902,0.68,0.64) \n", + " RGB{Float64}(0.77451,0.765,0.72) \n", + " RGB{Float64}(0.8,0.85,0.8) \n", + " RGB{Float64}(0.72,0.765,0.77451) \n", + " RGB{Float64}(0.64,0.68,0.74902) \n", + " RGB{Float64}(0.56,0.595,0.723529)\n", + " RGB{Float64}(0.48,0.51,0.698039) \n", + " RGB{Float64}(0.4,0.425,0.672549) \n", + " RGB{Float64}(0.32,0.34,0.647059) \n", + " RGB{Float64}(0.24,0.255,0.621569)\n", + " RGB{Float64}(0.16,0.17,0.596078) \n", + " RGB{Float64}(0.08,0.085,0.570588)\n", + " RGB{Float64}(0.0,0.0,0.545098) " + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "@show RGB[colorant\"green\", colorant\"lightgreen\", colorant\"darkgreen\", RGB(0,1,0)]" + "using Plots\n", + "zs = 0:0.05:1\n", + "for gradientsym in sort(collect(keys(Plots._gradients)))\n", + " display(gradientsym)\n", + " gradient = ColorGradient(gradientsym)\n", + " display(RGB[getColorZ(gradient,z) for z in zs])\n", + "end" ] }, { diff --git a/src/Plots.jl b/src/Plots.jl index 4a91d228..1f828340 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -15,7 +15,6 @@ export current, default, - colorscheme, scatter, scatter!, @@ -59,6 +58,16 @@ export dataframes, OHLC, + colorscheme, + ColorScheme, + ColorGradient, + ColorVector, + ColorWrapper, + ColorFunction, + ColorZFunction, + getColor, + getColorZ, + supportedArgs, supportedAxes, supportedTypes, diff --git a/src/args.jl b/src/args.jl index 6c6bd6db..8a76ef0e 100644 --- a/src/args.jl +++ b/src/args.jl @@ -149,6 +149,7 @@ _plotDefaults[:layout] = nothing _plotDefaults[:n] = -1 _plotDefaults[:nr] = -1 _plotDefaults[:nc] = -1 +_plotDefaults[:color_palette] = :auto @@ -257,6 +258,7 @@ const _keyAliases = Dict( :wtitle => :windowtitle, :gui => :show, :display => :show, + :palette => :color_palette, ) # add all pluralized forms to the _keyAliases dict @@ -314,9 +316,16 @@ trueOrAllTrue(f::Function, x) = f(x) function handleColors!(d::Dict, arg, csym::Symbol) try - c = colorscheme(arg) - d[csym] = c + # @show arg typeof(arg) + if arg == :auto + d[csym] = :auto + else + c = colorscheme(arg) + d[csym] = c + end return true + # catch err + # dump(err) end false end diff --git a/src/backends/gadfly.jl b/src/backends/gadfly.jl index c5ff5124..32e5a618 100644 --- a/src/backends/gadfly.jl +++ b/src/backends/gadfly.jl @@ -14,8 +14,9 @@ supportedArgs(::GadflyPackage) = [ # :axis, :background_color, :color, + :color_palette, :fillrange, - # :fillcolor, + :fillcolor, # :foreground_color, :group, # :heatmap_c, @@ -157,15 +158,20 @@ function addGadflySeries!(gplt, d::Dict, initargs::Dict) line_width = d[:linewidth] * (d[:linetype] in (:none, :ohlc, :scatter) ? 0 : 1) * Gadfly.px # 0 linewidth when we don't show a line # line_color = isa(d[:color], AbstractVector) ? colorant"black" : d[:color] line_color = getColor(d[:color]) + fillcolor = getColor(d[:fillcolor]) + @show fillcolor # fg = initargs[:foreground_color] theme = Gadfly.Theme(; default_color = line_color, line_width = line_width, - default_point_size = 0.5 * d[:markersize] * Gadfly.px, + default_point_size = d[:markersize] * Gadfly.px, # grid_color = fg, # minor_label_color = fg, # major_label_color = fg, # key_title_color = fg, # key_label_color = fg, + lowlight_color = x->RGB(fillcolor), + lowlight_opacity = alpha(fillcolor), + bar_highlight = RGB(line_color), extra_theme_args...) push!(gfargs, theme) @@ -222,7 +228,7 @@ function addGadflySeries!(gplt, d::Dict, initargs::Dict) if !isa(d[:markercolor], ColorGradient) d[:markercolor] = colorscheme(:bluesreds) end - push!(gplt.scales, Gadfly.Scale.ContinuousColorScale(p -> getColorZ(d[:markercolor], p))) # minz + p * (maxz - minz)))) + push!(gplt.scales, Gadfly.Scale.ContinuousColorScale(p -> RGB(getColorZ(d[:markercolor], p)))) # minz + p * (maxz - minz)))) # nothing special... else diff --git a/src/colors.jl b/src/colors.jl index 57d31f94..e50af8ec 100644 --- a/src/colors.jl +++ b/src/colors.jl @@ -70,11 +70,11 @@ const _masterColorList = [ function darken(c, v=0.1) - rgb = RGB(c) - r = max(0, min(rgb.r - v, 1)) - g = max(0, min(rgb.g - v, 1)) - b = max(0, min(rgb.b - v, 1)) - RGB(r,g,b) + rgba = RGBA(c) + r = max(0, min(rgba.r - v, 1)) + g = max(0, min(rgba.g - v, 1)) + b = max(0, min(rgba.b - v, 1)) + RGBA(r,g,b,rgba.alpha) end function lighten(c, v=0.3) darken(c, -v) @@ -103,7 +103,7 @@ colorscheme(cs::AVec, vs::AVec) = ColorGradient(cs, vs) colorscheme{T<:Colorant}(cs::AVec{T}) = ColorGradient(cs) colorscheme(f::Function) = ColorFunction(f) colorscheme(v::AVec) = ColorVector(v) -colorscheme(m::AMat) = Any[ColorVector(m[:,i]) for i in 1:size(m,2)] +colorscheme(m::AMat) = size(m,1) == 1 ? map(colorscheme, m) : [colorscheme(m[:,i]) for i in 1:size(m,2)]' colorscheme(c::Colorant) = ColorWrapper(c) const _rainbowColors = [colorant"blue", colorant"purple", colorant"green", colorant"orange", colorant"red"] @@ -147,7 +147,7 @@ function ColorGradient{T<:Real}(s::Symbol, vals::AVec{T} = 0:1) ColorGradient(cs, vals) end -getColor(gradient::ColorGradient, idx::Int) = gradient.cs[mod1(idx, length(gradient.cs))] +getColor(gradient::ColorGradient, idx::Int) = gradient.colors[mod1(idx, length(gradient.colors))] function getColorZ(gradient::ColorGradient, z::Real) cs = gradient.colors @@ -173,22 +173,23 @@ end getColorVector(gradient::ColorGradient) = gradient.colors -function interpolate_lab(c1::Colorant, c2::Colorant, w::Real) - lab1 = Lab(c1) - lab2 = Lab(c2) - l = interpolate(lab1.l, lab2.l, w) - a = interpolate(lab1.a, lab2.a, w) - b = interpolate(lab1.b, lab2.b, w) - RGB(Lab(l, a, b)) -end +# function interpolate_lab(c1::Colorant, c2::Colorant, w::Real) +# lab1 = Lab(c1) +# lab2 = Lab(c2) +# l = interpolate(lab1.l, lab2.l, w) +# a = interpolate(lab1.a, lab2.a, w) +# b = interpolate(lab1.b, lab2.b, w) +# RGB(Lab(l, a, b)) +# end function interpolate_rgb(c1::Colorant, c2::Colorant, w::Real) - rgb1 = RGB(c1) - rgb2 = RGB(c2) + rgb1 = RGBA(c1) + rgb2 = RGBA(c2) r = interpolate(rgb1.r, rgb2.r, w) g = interpolate(rgb1.g, rgb2.g, w) b = interpolate(rgb1.b, rgb2.b, w) - RGB(r, g, b) + a = interpolate(rgb1.alpha, rgb2.alpha, w) + RGBA(r, g, b, a) end @@ -233,6 +234,8 @@ immutable ColorWrapper{C<:Colorant} <: ColorScheme c::C end +ColorWrapper(s::Symbol) = ColorWrapper(parse(Colorant, s)) + getColor(scheme::ColorWrapper, idx::Int) = scheme.c getColorZ(scheme::ColorWrapper, z::Real) = scheme.c @@ -297,10 +300,15 @@ function getPaletteUsingColorDiffFromBackground(bgcolor::Colorant, numcolors::In filter(c -> colordiff(c, bgcolor) >= mindiff, _allColors) end -function getPaletteUsingRainbow(bgcolor::Colorant, numcolors::Int = _defaultNumColors) - grad = ColorGradient(_gradients[isdark(bgcolor) ? :lightrainbow : :darkrainbow]) +function getPaletteUsingGradientSymbol(bgcolor::Colorant, numcolors::Int = _defaultNumColors; gradientsym::Symbol = :auto) + # @show gradientsym + if gradientsym == :auto + grad = ColorGradient(_gradients[isdark(bgcolor) ? :lightrainbow : :darkrainbow]) + else + grad = ColorGradient(gradientsym) + end zrng = getpctrange(numcolors) - RGB[getColorZ(grad, z) for z in zrng] + RGBA[getColorZ(grad, z) for z in zrng] end # ---------------------------------------------------------------------------------- @@ -345,7 +353,7 @@ function handlePlotColors(::PlottingPackage, d::Dict) # d[:color_palette] = getPaletteUsingDistinguishableColors(bgcolor) # d[:color_palette] = getPaletteUsingFixedColorList(bgcolor) # d[:color_palette] = getPaletteUsingColorDiffFromBackground(bgcolor) - d[:color_palette] = getPaletteUsingRainbow(bgcolor) + d[:color_palette] = getPaletteUsingGradientSymbol(bgcolor; gradientsym = get(d, :color_palette, :auto)) # set the foreground color (text, ticks, gridlines) to be white or black depending # on how dark the background is. diff --git a/src/plot.jl b/src/plot.jl index f8f549d5..277562c0 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -117,7 +117,7 @@ function plot!(plt::Plot, args...; kw...) warnOnUnsupportedScales(plt.backend, d) - dumpdict(d, "Updating plot items:") + dumpdict(d, "Updating plot items") # add title, axis labels, ticks, etc updatePlotItems(plt, d)