Giter VIP home page Giter VIP logo

plotutils.jl's People

Contributors

asinghvi17 avatar babaq avatar beastyblacksmith avatar bioturbonick avatar briochemc avatar crbinz avatar daschw avatar ederag avatar fredrikekre avatar github-actions[bot] avatar goropikari avatar jeffbezanson avatar jkrumbiegel avatar juliatagbot avatar jverzani avatar kristofferc avatar kthyng avatar mileslucas avatar mkborregaard avatar mo-gul avatar oschulz avatar pabloferz avatar rafaelarutjunjan avatar simondanisch avatar staticfloat avatar t-bltg avatar tbreloff avatar timholy avatar wkearn avatar yha avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

plotutils.jl's Issues

adapted_grid, why not use end points of interval

    xs = collect(range(minmax[1]; stop=minmax[2], length=n_points))
    # Move the first and last interior points a bit closer to the end points
    @show xs[1]
    @show xs[2]
    xs[2] = xs[1] + (xs[2] - xs[1]) * 0.25
    @show xs[2]
    xs[end-1] = xs[end] - (xs[end] - xs[end-1]) * 0.25
julia> adapted_grid(plotme, (nextfloat(0.0), 0.1))
xs[1] = 5.0e-324
xs[2] = 0.005
xs[2] = 0.00125

As you can see, there's a huge difference between the endpoint I wanted, and the one actually used. Why not evaluate the function at the desired interval? I remember a long github discussion on this method a few years ago---the answer might be there, but I don't remember how to find it.

Reliable crash in Jupyter notebook on arm64, AS M1

I have some OHLC data here which I'm trying to plot and manipulate in a Jupyter notebook using the IJulia kernel. The following code reliably crashes the kernel, but shows no problems when running in CLI.

using DataFrames
using Plots
gr();

data = CSV.read("ohlc.csv", DataFrame);
plot(data[:, :close])

with crashlog extracted from Jupyter as follows.

10:43:07(write task): EXECUTING plot(data[end-24*60:end, :close])
10:43:07(write task): SENDING IPython Msg [ idents execute_input ] {
  parent_header = Dict{String, Any}("msg_id" => "d4ac6ed086d743558a866fd48908eda8", "msg_type" => "execute_request", "username" => "username", "date" => "2022-02-02T09:43:07.599Z", "version" => "5.2", "session" => "3e188fdcdb4a42e18f1cd0698322c974"),
  header = Dict{String, Any}("msg_id" => "052178aa-0295-40af-ae10-977a5ab837f1", "msg_type" => "execute_input", "username" => "username", "date" => Dates.DateTime("2022-02-02T10:43:07.612"), "version" => "5.3", "session" => "3e188fdcdb4a42e18f1cd0698322c974"),
  metadata = Dict{String, Any}(),
  content = Dict{String, Any}("code" => "plot(data[end-24*60:end, :close])", "execution_count" => 7)
}

signal (11): Segmentation fault: 11
in expression starting at /Users/morpheu5/.julia/packages/IJulia/e8kqU/src/kernel.jl:53
^ at ./math.jl:0 [inlined]
bounding_order_of_magnitude at /Users/morpheu5/.julia/packages/PlotUtils/rTTui/src/ticks.jl:11
optimize_ticks_typed at /Users/morpheu5/.julia/packages/PlotUtils/rTTui/src/ticks.jl:197
unknown function (ip: 0x1156280b3)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
#optimize_ticks#42 at /Users/morpheu5/.julia/packages/PlotUtils/rTTui/src/ticks.jl:154
optimize_ticks##kw at /Users/morpheu5/.julia/packages/PlotUtils/rTTui/src/ticks.jl:152
unknown function (ip: 0x115623e07)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
optimal_ticks_and_labels at /Users/morpheu5/.julia/packages/Plots/Xv2qA/src/axes.jl:170
unknown function (ip: 0x11562314b)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
do_apply at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
get_ticks at /Users/morpheu5/.julia/packages/Plots/Xv2qA/src/axes.jl:320
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
#get_ticks#95 at /Users/morpheu5/.julia/packages/Plots/Xv2qA/src/axes.jl:241
get_ticks at /Users/morpheu5/.julia/packages/Plots/Xv2qA/src/axes.jl:224 [inlined]
_update_min_padding! at /Users/morpheu5/.julia/packages/Plots/Xv2qA/src/backends/gr.jl:888
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
iterate at ./generator.jl:47 [inlined]
_collect at ./array.jl:744
unknown function (ip: 0x115617d4b)
collect_similar at ./array.jl:653 [inlined]
map at ./abstractarray.jl:2849 [inlined]
_update_min_padding! at /Users/morpheu5/.julia/packages/Plots/Xv2qA/src/layouts.jl:290
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
prepare_output at /Users/morpheu5/.julia/packages/Plots/Xv2qA/src/plot.jl:224
show at /Users/morpheu5/.julia/packages/Plots/Xv2qA/src/output.jl:213
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
do_apply at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
#sprint#426 at ./strings/io.jl:114
sprint at ./strings/io.jl:108 [inlined]
_ijulia_display_dict at /Users/morpheu5/.julia/packages/Plots/Xv2qA/src/ijulia.jl:47
display_dict at /Users/morpheu5/.julia/packages/Plots/Xv2qA/src/init.jl:92
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_f__call_latest at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
#invokelatest#2 at ./essentials.jl:716 [inlined]
invokelatest at ./essentials.jl:714 [inlined]
execute_request at /Users/morpheu5/.julia/packages/IJulia/e8kqU/src/execute_request.jl:112
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_f__call_latest at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
#invokelatest#2 at ./essentials.jl:716 [inlined]
invokelatest at ./essentials.jl:714 [inlined]
eventloop at /Users/morpheu5/.julia/packages/IJulia/e8kqU/src/eventloop.jl:8
#15 at ./task.jl:423
unknown function (ip: 0x115351ed7)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
start_task at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
Allocations: 174538587 (Pool: 174480553; Big: 58034); GC: 107
[I 10:43:13.684 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports
kernel 6665f423-b38f-4a16-8dd4-be2f1b514ff9 restarted
PROFILE = Dict{String, Any}("key" => "11d37313-a6793232823424c4cc9f0654", "transport" => "tcp", "signature_scheme" => "hmac-sha256", "shell_port" => 55755, "hb_port" => 55758, "control_port" => 55759, "ip" => "127.0.0.1", "stdin_port" => 55757, "iopub_port" => 55756, "kernel_name" => "ijulia-1.7")
10:43:16(): SENDING IPython Msg [ idents status ] {
  parent_header = Dict("username" => "jlkernel", "session" => "f0233114-d42b-4d38-b664-ad3a9525986b"),
  header = Dict{String, Any}("msg_id" => "a9505189-ece0-446a-a0f6-f8b5fd18dd6e", "msg_type" => "status", "username" => "jlkernel", "date" => Dates.DateTime("2022-02-02T10:43:16.899"), "version" => "5.3", "session" => "f0233114-d42b-4d38-b664-ad3a9525986b"),
  metadata = Dict{String, Any}(),
  content = Dict("execution_state" => "starting")
}
Starting kernel event loops.
10:43:17(write task): got msg part 3e188fdcdb4a42e18f1cd0698322c974
10:43:17(write task): got msg part <IDS|MSG>
10:43:19(write task): RECEIVED IPython Msg [ idents 3e188fdcdb4a42e18f1cd0698322c974 ] {
  parent_header = Dict{String, Any}(),
  header = Dict{String, Any}("msg_id" => "5f1e0c5471b74b659e2b56afe0dc0212", "msg_type" => "kernel_info_request", "username" => "username", "date" => "2022-02-02T09:43:17.162Z", "version" => "5.2", "session" => "3e188fdcdb4a42e18f1cd0698322c974"),
  metadata = Dict{String, Any}(),
  content = Dict{String, Any}()
}
10:43:19(write task): SENDING IPython Msg [ idents status ] {
  parent_header = Dict{String, Any}("msg_id" => "5f1e0c5471b74b659e2b56afe0dc0212", "msg_type" => "kernel_info_request", "username" => "username", "date" => "2022-02-02T09:43:17.162Z", "version" => "5.2", "session" => "3e188fdcdb4a42e18f1cd0698322c974"),
  header = Dict{String, Any}("msg_id" => "731a698b-555b-44bc-8770-125492dc6430", "msg_type" => "status", "username" => "username", "date" => Dates.DateTime("2022-02-02T10:43:19.272"), "version" => "5.3", "session" => "3e188fdcdb4a42e18f1cd0698322c974"),
  metadata = Dict{String, Any}(),
  content = Dict("execution_state" => "busy")
}
10:43:19(write task): SENDING IPython Msg [ idents 3e188fdcdb4a42e18f1cd0698322c974 ] {
  parent_header = Dict{String, Any}("msg_id" => "5f1e0c5471b74b659e2b56afe0dc0212", "msg_type" => "kernel_info_request", "username" => "username", "date" => "2022-02-02T09:43:17.162Z", "version" => "5.2", "session" => "3e188fdcdb4a42e18f1cd0698322c974"),
  header = Dict{String, Any}("msg_id" => "bd156f15-607e-4f55-853d-f309b55d4c8c", "msg_type" => "kernel_info_reply", "username" => "username", "date" => Dates.DateTime("2022-02-02T10:43:19.314"), "version" => "5.3", "session" => "3e188fdcdb4a42e18f1cd0698322c974"),
  metadata = Dict{String, Any}(),
  content = Dict{String, Any}("help_links" => [Dict("text" => "Julia Home Page", "url" => "http://julialang.org/"), Dict("text" => "Julia Documentation", "url" => "http://docs.julialang.org/"), Dict("text" => "Julia Packages", "url" => "http://pkg.julialang.org/")], "language_info" => Dict("file_extension" => ".jl", "name" => "julia", "mimetype" => "application/julia", "version" => "1.7.1"), "status" => "ok", "implementation" => "ijulia", "banner" => "Julia: A fresh approach to technical computing.", "protocol_version" => "5.0")
}
10:43:19(write task): SENDING IPython Msg [ idents status ] {
  parent_header = Dict{String, Any}("msg_id" => "5f1e0c5471b74b659e2b56afe0dc0212", "msg_type" => "kernel_info_request", "username" => "username", "date" => "2022-02-02T09:43:17.162Z", "version" => "5.2", "session" => "3e188fdcdb4a42e18f1cd0698322c974"),
  header = Dict{String, Any}("msg_id" => "e8c2ce06-2703-4b9f-b1ae-52e78d11ee95", "msg_type" => "status", "username" => "username", "date" => Dates.DateTime("2022-02-02T10:43:19.411"), "version" => "5.3", "session" => "3e188fdcdb4a42e18f1cd0698322c974"),
  metadata = Dict{String, Any}(),
  content = Dict("execution_state" => "idle")
}

PlotUtils appears to be where the crash happens, and that's why I'm here, but I'm not too experienced navigating Julia's stack traces so feel free to point me somewhere else :)

This is my configuration:

$ jupyter --version
Selected Jupyter core packages...
IPython          : 8.0.0
ipykernel        : 6.7.0
ipywidgets       : 7.6.5
jupyter_client   : 7.1.0
jupyter_core     : 4.9.1
jupyter_server   : 1.13.2
jupyterlab       : 3.2.8
nbclient         : 0.5.10
nbconvert        : 6.4.0
nbformat         : 5.1.3
notebook         : 6.4.7
qtconsole        : 5.2.2
traitlets        : 5.1.1

$ echo "using Pkg; Pkg.status()" | julia
      Status `~/.julia/environments/v1.7/Project.toml`
  [336ed68f] CSV v0.10.2
  [324d7699] CategoricalArrays v0.10.2
  [35d6a980] ColorSchemes v3.16.0
  [717857b8] DSP v0.7.4
  [a93c6f00] DataFrames v1.3.2
  [1313f7d8] DataFramesMeta v0.10.0
  [4b11ee91] Gaston v1.0.4
  [f67ccb44] HDF5 v0.16.1
  [09f84164] HypothesisTests v0.10.6
  [7073ff75] IJulia v1.23.2
  [682c06a0] JSON v0.21.2
  [50d2b5c4] Lazy v0.15.1
  [76087f3c] NLopt v0.6.4
  [bac558e1] OrderedCollections v1.4.1
  [91a5bcdd] Plots v1.25.5
  [d330b81b] PyPlot v2.10.0
  [2913bbd2] StatsBase v0.33.14
  [2cb19f9e] StatsKit v0.3.1
  [f3b207a7] StatsPlots v0.14.30

I can only add that if I run the x86_64 build of Julia 1.7.1 via Rosetta 2, the crash mostly disappears (I think I only managed to trigger it once but I can't remember the conditions). OTOH, running via Rosetta 2 in incredibly, painstakingly slow when it comes to reading CSVs into DataFrames, so I'd rather avoid it. I mean, this one I read in a few seconds with the native build, but it takes several minutes with the x86_64 build, and this file is small at just over 200 kB. I have a few CSVs that easily reach into the 10s of MB, and at least a couple closer to 0.5 GB so… :)

Jagged Plot for a simple function

Heya,
This code:

using Plots
gr()
g = x -> 2 + 0.25 * x^-2
plot(g,1,30)

Produces this plot for me:
image

Where it looks like the plotting chooses too few plotpoints.
For e.g. g = x-> 1 + 0.25 * x^-2 the plot is much better, see
image

White curve when palette=:grays

It seems important to support palette=:grays but I always get a white curve, which is then invisible:

plot([cumsum(randn(100)) cumsum(randn(100))], palette=:grays)

grays

Is there a way to select the grays so the lightest one is more visible?

Thanks!

Spurious "no strict ticks" warning for log10 scales

I've noticed that I can get "no strict ticks" warnings for perfectly innocuous data, even when the resulting graph looks fine.

Example:

julia> x = 400:200:6000;
julia> y = x;
julia> scatter(x,y,xscale=:log10)
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/n4I4Q/src/ticks.jl:295
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/n4I4Q/src/ticks.jl:295

julia> x = 100:200:6000;
julia> scatter(x,y,xscale=:log10)
# no warning

This is in Plots v 1.18.1, Julia 1.6.1.

lims not being well defined in relation to ticks

This issue continues the discussion over on PR #26 .
The comment was:

it seems as if the axis limits aren't counted as ticks, which I think they should be if there are 4-8 ticks, and also that makes the plot easier to read. Here's an example:

plot([sin, cos], 0, 20, ribbon = 0.5) 

skaermbillede 2017-10-03 kl 22 34 51

I'd expect the ticks to be at 0, 5, 10, 15 and 20. Not sure about the y axis - but -2:2 would possibly be easier to read.

`palette()` with n=1 fails

This is unexpected:

julia> palette(:tab10,1)
ERROR: ArgumentError: range(0.0, stop=1.0, length=1): endpoints differ
Stacktrace:
  [1] _linspace1(#unused#::Type{Float64}, start::Float64, stop::Float64, len::Int64)
    @ Base ./twiceprecision.jl:741
  [2] _linspace(#unused#::Type{Float64}, start_n::Int64, stop_n::Int64, len::Int64, den::Int64)
    @ Base ./twiceprecision.jl:721
  [3] _linspace
    @ ./twiceprecision.jl:718 [inlined]
  [4] range_start_stop_length
    @ ./range.jl:578 [inlined]
  [5] _range
    @ ./range.jl:161 [inlined]
  [6] #range#70
    @ ./range.jl:142 [inlined]
  [7] range
    @ ./range.jl:142 [inlined]
  [8] get_range
    @ ~/.julia/packages/PlotUtils/mHQ0Q/src/colorschemes.jl:291 [inlined]
  [9] palette(cs::Symbol, n::Int64; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ PlotUtils ~/.julia/packages/PlotUtils/mHQ0Q/src/colorschemes.jl:285
 [10] palette(cs::Symbol, n::Int64)
    @ PlotUtils ~/.julia/packages/PlotUtils/mHQ0Q/src/colorschemes.jl:283
 [11] top-level scope
    @ REPL[9]:1

I assume

get_range(n::Int) = range(0, stop = 1, length = n)
should be special cased for this. e.g.:

get_range(n::Int) = n == 1 ? range(0,0,1) : range(0, stop = 1, length = n)

`scale` keyword for `cgrad` is broken.

julia> using Plots
julia> contour(x, y, (x,y)->cos(x)+cos(y), fill=(true,cgrad(:Spectral, scale = :log)))
# some depwarns and
Error showing value of type Plots.Plot{Plots.GRBackend}:
ERROR: AssertionError: n > 0 && n == length(vs)

Missing Project.toml

I recently made a PR to this project and when I tried to test my changes with ]test in the REPL, I got an error: "ERROR: trying to test unnamed project". I suspect this is because the package is missing a Project.toml. Is this intentional? I thought this was required as part of the package specification for Pkg.

Floating point error in optimize_ticks

optimize_ticks uses 10.0^z as part of the calculation for tickspan code. This has the potential to produce floating point errors, eg. 3 * 10.0^-2, 6 * 10.0^-2, 3 * 10.0^-5.

optimized_ticks_typed produces persistent warnings

I tried this in Juno first:
Some plots trigger the warning "No strict ticks found", which appears over and over, and doesn't go away until the name is set to "nothing" or the session is restarted:

 julia> p = plot(my_fitted_parameters)
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
GKS: Rectangle definition is invalid in routine SET_WINDOW
GKS: Rectangle definition is invalid in routine SET_WINDOW
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
GKS: Rectangle definition is invalid in routine SET_WINDOW
GKS: Rectangle definition is invalid in routine SET_WINDOW
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
GKS: Rectangle definition is invalid in routine SET_WINDOW
GKS: Rectangle definition is invalid in routine SET_WINDOW
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
GKS: Rectangle definition is invalid in routine SET_WINDOW
GKS: Rectangle definition is invalid in routine SET_WINDOW
julia> a = 1
1
julia> ┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
julia> 
julia> p = nothing
julia> a = 1
1

Using REPL in the system terminal, this behavior dissapears.

> julia> typeof(my_fitted_parameters)
Turing.Utilities.Chain{AbstractRange{Int64}}
julia> p = plot(my_fitted_params)
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
GKS: Rectangle definition is invalid in routine SET_WINDOW
GKS: Rectangle definition is invalid in routine SET_WINDOW
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
GKS: Rectangle definition is invalid in routine SET_WINDOW
GKS: Rectangle definition is invalid in routine SET_WINDOW
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
GKS: Rectangle definition is invalid in routine SET_WINDOW
GKS: Rectangle definition is invalid in routine SET_WINDOW
┌ Warning: No strict ticks found
└ @ PlotUtils ~/.julia/packages/PlotUtils/GxT73/src/ticks.jl:173
GKS: Rectangle definition is invalid in routine SET_WINDOW
GKS: Rectangle definition is invalid in routine SET_WINDOW
julia> a = 1
1
julia> 

But I'm still not sure if this is a Juno issue or a PlotUtils issue. I'm new to Julia but lot's of googling didn't turn up anything related to this behavior.

Here is the code to generate the plotted data:

using Turing
using StatsPlots
@model gdemo(x, y) = begin
  s ~ InverseGamma(2,3)
  m ~ Normal(0,sqrt(s))
  x ~ Normal(m, sqrt(s))
  y ~ Normal(m, sqrt(s))
end
my_fitted_parameters = sample(gdemo(1.5, 2), HMC(1000, 0.1, 5))

Precompiling PlotUtils fails - LoadError, premature end of input

I tried to precompile Plots, and got this error in PlotUtils (fully updated and built). I'm running Julia 1.1.1 on Ubuntu 16.04

using PlotUtils
[ Info: Precompiling PlotUtils [995b91a9-d308-5afd-9ec6-746e21dbc043]
ERROR: LoadError: LoadError: LoadError: syntax: incomplete: premature end of input
Stacktrace:
 [1] include at ./boot.jl:326 [inlined]
 [2] include_relative(::Module, ::String) at ./loading.jl:1038
 [3] include at ./sysimg.jl:29 [inlined]
 [4] include(::String) at /home/chantal/.julia/packages/PlotUtils/35TGG/src/PlotUtils.jl:4
 [5] top-level scope at none:0
 [6] include at ./boot.jl:326 [inlined]
 [7] include_relative(::Module, ::String) at ./loading.jl:1038
 [8] include at ./sysimg.jl:29 [inlined]
 [9] include(::String) at /home/chantal/.julia/packages/PlotUtils/35TGG/src/PlotUtils.jl:4
 [10] top-level scope at none:0
 [11] include at ./boot.jl:326 [inlined]
 [12] include_relative(::Module, ::String) at ./loading.jl:1038
 [13] include(::Module, ::String) at ./sysimg.jl:29
 [14] top-level scope at none:2
 [15] eval at ./boot.jl:328 [inlined]
 [16] eval(::Expr) at ./client.jl:404
 [17] top-level scope at ./none:3
in expression starting at /home/chantal/.julia/packages/PlotUtils/35TGG/src/gradients/colorcet.jl:3630
in expression starting at /home/chantal/.julia/packages/PlotUtils/35TGG/src/color_gradients.jl:246
in expression starting at /home/chantal/.julia/packages/PlotUtils/35TGG/src/PlotUtils.jl:30
ERROR: Failed to precompile PlotUtils [995b91a9-d308-5afd-9ec6-746e21dbc043] to /home/chantal/.julia/compiled/v1.1/PlotUtils/YveHG.ji.
Stacktrace:
 [1] compilecache(::Base.PkgId, ::String) at ./loading.jl:1197
 [2] _require(::Base.PkgId) at ./loading.jl:960
 [3] require(::Base.PkgId) at ./loading.jl:858
 [4] require(::Module, ::Symbol) at ./loading.jl:853

Plots.jl does not precompile when using PlotUtils 1.0.7, but works with 1.0.6

Compiling with PlotUtils 1.0.7 results in the following error when trying to use Plots:

[ Info: Precompiling Plots [91a5bcdd-55d7-5caf-9e0b-520d859cae80]
ERROR: LoadError: TypeError: in Type{...} expression, expected UnionAll, got Type{ColorSchemes.ColorScheme}
Stacktrace:
 [1] _precompile_() at /home/stalker/.julia/packages/PlotUtils/3Ttrk/src/precompile.jl:5
 [2] top-level scope at /home/stalker/.julia/packages/PlotUtils/3Ttrk/src/PlotUtils.jl:44
 [3] top-level scope at none:2
 [4] eval at ./boot.jl:331 [inlined]
in expression starting at /home/stalker/.julia/packages/PlotUtils/3Ttrk/src/PlotUtils.jl:42
ERROR: LoadError: Failed to precompile PlotUtils [995b91a9-d308-5afd-9ec6-746e21dbc043] to /home/stalker/.julia/compiled/v1.5/PlotUtils/YveHG_teLiY.ji.
Stacktrace:
 [1] top-level scope at none:2
 [2] eval at ./boot.jl:331 [inlined]
in expression starting at /home/stalker/.julia/packages/Plots/vsE7b/src/Plots.jl:20
ERROR: LoadError: Failed to precompile Plots [91a5bcdd-55d7-5caf-9e0b-520d859cae80] to /home/stalker/.julia/compiled/v1.5/Plots/ld3vC_teLiY.ji.

It works with 1.0.6, however. Is this expected?

adapted_grid return both x and f(x) values

Hi,
I belive it is useful to have adapted_grid returning both x values and f(x) vector.
like return xs[2:end-1], fs[2:end-1]
Otherwise you have to calculate f(x) values twice to get a plot, which can be computationally expensive for complicated "black-box" functions.

optimize_ticks not working right for small values

optimize_ticks(-1e-10, 1e-10)
([-1.0e-10, 0.0, 1.0e-10], -1.0e-10, 1.0e-10)  # looks fine

optimize_ticks(-1e-16, 1e-16)
([-1.0e-16], -1.0, 0.9999999999999999)  # pretty bad, should at least return 2 ticks.

In short, I strongly think that optimize_ticks should at least return 2 arguments (the worst case), but never 1 tick. @mkborregaard looks like you have the most commit lines here perhaps you could know the reason why this happens?

This is related to JuliaPlots/Plots.jl#1858, not the formatting part (which will be fixed in Showoff pretty soon), but the fact that only 1 tick is returned which looks very odd to me 🤔. I nailed down to this function that sometimes returns only 1 tick

Generalize color palettes

Categorical palettes like colorbrewer:Dark2 can not be represented with the existing ColorGradient since it's spectrum of colors can not be interpolated like the normal color gradients.

A ColorPalette is really an instance that can be obtained from a ColorGradient or is directly specified in the case of a categorical palette.

zscale test failures

As pointed out in #110 zscale tests are failing on julia nightly. This is almost certainly due to random number generation changing, which invalidates the hard-coded values we test against. There's a few ways to fix this and I'm happy to PR, but I want the maintainers to weigh the options before I start.

  1. The first option is to add StableRNGs.jl as a test dependency and change all the random number generation. This may affect other tests, so I'm not sure how annoying that would be, but I think this is the best option.

  2. The next option is to add another if-else branch in the test (there already is one), but frankly the current number generation isn't even seeded, so I think this is a fragile solution at best.

  3. The last option would be to loosen the test restrictions, either testing the values are within some range or switching to very basic tests that ensure the output is finite and within the input range. This is the simplest and least-breaking option, but greatly diminishes the quality of the testing.

Thoughts?

zscale performance

I like your zscale implementation in intervals.jl. I notice that the performance leaves a bit to be desired; I find a big improvement by moving the isfinite filter on line 91 to after the sample selection on line 93 (20 ms to 300 microseconds on a 2k x 4k CCD). IIRC this is where the iraf implementation does the filter as well

The exponential color scale is broken

Hi!

I like Plots.jl a lot, and I'm trying to use it for academic purposes, unfortunatley I think I just caught a bug running the examples from there :

C(g::ColorGradient) = RGB[g[z] for z=(-1:0.1:1)]
g = :inferno
cgrad(g, scale=:log) |> C

outputs the right thing, but

cgrad(g, scale=:exp) |> C

threw this at my poor face:

MethodError: no method matching -(::Array{Float64,1}, ::Int64)
Closest candidates are:
  -(!Matched::Complex{Bool}, ::Real) at complex.jl:298
  -(!Matched::Missing, ::Number) at missing.jl:93
  -(!Matched::Base.CoreLogging.LogLevel, ::Integer) at logging.jl:107
  ...

Stacktrace:
 [1] #cgrad#21(::Nothing, ::Symbol, ::Function, ::Symbol) at C:\Users\user\.julia\packages\PlotUtils\GxT73\src\color_gradients.jl:222
 [2] (::getfield(PlotUtils, Symbol("#kw##cgrad")))(::NamedTuple{(:scale,),Tuple{Symbol}}, ::typeof(cgrad), ::Symbol) at .\none:0
 [3] top-level scope at In[52]:3

Thanks for your time!

Issue on newer versions on optimize_ticks?

I documented the issue on Documenter itself but it seems to be linked to some update on PlotUtils?
JuliaDocs/Documenter.jl#1741
Copying the stacktrace:

ERROR: ArgumentError: start and stop must be finite, got NaN and 2.354814349665326
Stacktrace:
  [1] _linspace(start::Float64, stop::Float64, len::Int64)
    @ Base ./twiceprecision.jl:658
  [2] range_start_stop_length(start::Float64, stop::Float64, len::Int64)
    @ Base ./twiceprecision.jl:653
  [3] _range
    @ ./range.jl:128 [inlined]
  [4] #range#59
    @ ./range.jl:111 [inlined]
  [5] fallback_ticks
    @ ~/.julia/packages/PlotUtils/mTm8x/src/ticks.jl:37 [inlined]
  [6] optimize_ticks_typed(x_min::Float64, x_max::Float64, extend_ticks::Bool, Q::Vector{Tuple{Float64, Float64}}, k_min::Int64, k_max::Int64, k_ideal::Int64, granularity_weight::Float64, simplicity_weight::Float64, coverage_weight::Float64, niceness_weight::Float64, strict_span::Bool, span_buffer::Nothing, scale::Symbol)
    @ PlotUtils ~/.julia/packages/PlotUtils/mTm8x/src/ticks.jl:302
  [7] optimize_ticks_typed(x_min::Float64, x_max::Float64, extend_ticks::Bool, Q::Vector{Tuple{Float64, Float64}}, k_min::Int64, k_max::Int64, k_ideal::Int64, granularity_weight::Float64, simplicity_weight::Float64, coverage_weight::Float64, niceness_weight::Float64, strict_span::Bool, span_buffer::Nothing, scale::Symbol)
    @ PlotUtils ~/.julia/packages/PlotUtils/mTm8x/src/ticks.jl:297
  [8] optimize_ticks(x_min::Float64, x_max::Float64; extend_ticks::Bool, Q::Vector{Tuple{Float64, Float64}}, k_min::Int64, k_max::Int64, k_ideal::Int64, granularity_weight::Float64, simplicity_weight::Float64, coverage_weight::Float64, niceness_weight::Float64, strict_span::Bool, span_buffer::Nothing, scale::Symbol)
    @ PlotUtils ~/.julia/packages/PlotUtils/mTm8x/src/ticks.jl:140
  [9] optimal_ticks_and_labels(ticks::Nothing, alims::Tuple{Float64, Float64}, scale::Symbol, formatter::Symbol)
    @ Plots ~/.julia/packages/Plots/UeTBV/src/axes.jl:170
 [10] get_ticks(::Symbol, ::Vector{Float64}, ::Vector{Any}, ::Tuple{Float64, Float64}, ::Vararg{Any})
    @ Plots ~/.julia/packages/Plots/UeTBV/src/axes.jl:320
 [11] get_ticks(sp::Plots.Subplot{Plots.GRBackend}, axis::Plots.Axis; update::Bool)
    @ Plots ~/.julia/packages/Plots/UeTBV/src/axes.jl:241
 [12] get_ticks
    @ ~/.julia/packages/Plots/UeTBV/src/axes.jl:224 [inlined]
 [13] _update_min_padding!(sp::Plots.Subplot{Plots.GRBackend})
    @ Plots ~/.julia/packages/Plots/UeTBV/src/backends/gr.jl:888
 [14] iterate
    @ ./generator.jl:47 [inlined]
 [15] _collect(c::Matrix{RecipesBase.AbstractLayout}, itr::Base.Generator{Matrix{RecipesBase.AbstractLayout}, typeof(Plots._update_min_padding!)}, #unused#::Base.EltypeUnknown, isz::Base.HasShape{2})
    @ Base ./array.jl:744
 [16] collect_similar
    @ ./array.jl:653 [inlined]
 [17] map
    @ ./abstractarray.jl:2849 [inlined]
 [18] _update_min_padding!(layout::Plots.GridLayout)
    @ Plots ~/.julia/packages/Plots/UeTBV/src/layouts.jl:290
 [19] iterate
    @ ./generator.jl:47 [inlined]
 [20] _collect(c::Matrix{RecipesBase.AbstractLayout}, itr::Base.Generator{Matrix{RecipesBase.AbstractLayout}, typeof(Plots._update_min_padding!)}, #unused#::Base.EltypeUnknown, isz::Base.HasShape{2})
    @ Base ./array.jl:744
 [21] collect_similar
    @ ./array.jl:653 [inlined]
 [22] map
    @ ./abstractarray.jl:2849 [inlined]
 [23] _update_min_padding!(layout::Plots.GridLayout)
    @ Plots ~/.julia/packages/Plots/UeTBV/src/layouts.jl:290
 [24] prepare_output(plt::Plots.Plot{Plots.GRBackend})
    @ Plots ~/.julia/packages/Plots/UeTBV/src/plot.jl:224
 [25] show(io::IOContext{IOBuffer}, m::MIME{Symbol("text/html")}, plt::Plots.Plot{Plots.GRBackend})
    @ Plots ~/.julia/packages/Plots/UeTBV/src/output.jl:213
 [26] __binrepr
    @ ./multimedia.jl:161 [inlined]
 [27] _textrepr
    @ ./multimedia.jl:151 [inlined]
 [28] stringmime(m::MIME{Symbol("text/html")}, x::Plots.Plot{Plots.GRBackend}; context::Pair{Symbol, Bool})
    @ Base64 ~/programs/julia-17/share/julia/stdlib/v1.7/Base64/src/Base64.jl:43
 [29] display_dict(x::Plots.Plot{Plots.GRBackend}; context::Pair{Symbol, Bool})
    @ Documenter.Utilities ~/.julia/packages/Documenter/qdbx6/src/Utilities/Utilities.jl:667
 [30] invokelatest(f::Any, args::Any; kwargs::Base.Pairs{Symbol, Pair{Symbol, Bool}, Tuple{Symbol}, NamedTuple{(:context,), Tuple{Pair{Symbol, Bool}}}})
    @ Base ./essentials.jl:718
 [31] runner(#unused#::Type{Documenter.Expanders.ExampleBlocks}, x::Markdown.Code, page::Documenter.Documents.Page, doc::Documenter.Documents.Document)
    @ Documenter.Expanders ~/.julia/packages/Documenter/qdbx6/src/Expanders.jl:610
 [32] dispatch(::Type{Documenter.Expanders.ExpanderPipeline}, ::Markdown.Code, ::Vararg{Any})
    @ Documenter.Utilities.Selectors ~/.julia/packages/Documenter/qdbx6/src/Utilities/Selectors.jl:170
 [33] expand(doc::Documenter.Documents.Document)
    @ Documenter.Expanders ~/.julia/packages/Documenter/qdbx6/src/Expanders.jl:42
 [34] runner(#unused#::Type{Documenter.Builder.ExpandTemplates}, doc::Documenter.Documents.Document)
    @ Documenter.Builder ~/.julia/packages/Documenter/qdbx6/src/Builder.jl:226
 [35] dispatch(#unused#::Type{Documenter.Builder.DocumentPipeline}, x::Documenter.Documents.Document)
    @ Documenter.Utilities.Selectors ~/.julia/packages/Documenter/qdbx6/src/Utilities/Selectors.jl:170
 [36] #2
    @ ~/.julia/packages/Documenter/qdbx6/src/Documenter.jl:266 [inlined]
 [37] cd(f::Documenter.var"#2#3"{Documenter.Documents.Document}, dir::String)
    @ Base.Filesystem ./file.jl:110
 [38] #makedocs#1
    @ ~/.julia/packages/Documenter/qdbx6/src/Documenter.jl:265 [inlined]
 [39] top-level scope
    @ REPL[7]:2

Problems with conversion of `Unsigned` to `RGB`

I've accidentally been using Base.convert method from this package that converts Unsigned to RGB. This is type-unstable (which is easy to fix) but it also looks like type piracy, so this method likely shouldn't even be in this package. Here is that method:

function Base.convert(::Type{RGB}, h::Unsigned)
mask = 0x0000FF
RGB([(x & mask) / 0xFF for x in (h >> 16, h >> 8, h)]...)
end
. What do you think should be done about it?

Unnecessary warning for matplotlib.jl with :gray?

The basic problem is that I want to set a plot element to the color :gray but I get a library clash (cmocean and colorcet) even though I've already specified :Plots as my library with clibrary(:Plots). Here's a MWE:

using Plots
gr()
clibrary(:Plots)
plot(rand(10), seriescolor = :blue)
plot(rand(10), seriescolor = :lightgray)
plot(rand(10), seriescolor = :gray)

Resulting in the following warning:

┌ Warning: gray is found in more than one library: cmocean, colorcet. Choosing cmocean
└ @ PlotUtils C:\Users\AKeith\.julia\packages\PlotUtils\GxT73\src\color_gradients.jl:40

I took a look at the gradients folder, but I don't really understand how the gradients defined in matplotlib.jl (which I think corresponds to :Plots) translates to the color names used in symbols. I'm not sure why :blue and :lightgray don't cause name conflicts but :gray does. It's just a warning, so it's not affecting my code negatively but it seemed like it might be some kind of bug.

Tagging a new release?

If possible, could this be done soon so that plotting of functions utilizes the adaptive grid of points?

persistent deprecation warning in IJulia

On Julia v0.6, changing the:

Array(RGBA{Float64}, size(cs))

to:

Array{RGBA{Float64}}(size(cs))

in colors.jl fixes things, similarly in ticks.jl (two instances of Array{typeof(1.0 * one_t)}(Int(3 * k_best))).

TagBot trigger issue

This issue is used to trigger TagBot; feel free to unsubscribe.

If you haven't already, you should update your TagBot.yml to include issue comment triggers.
Please see this post on Discourse for instructions and more details.

If you'd like for me to do this for you, comment TagBot fix on this issue.
I'll open a PR within a few hours, please be patient!

Using color collections for gradients

With the addition of the ocean gradient schemes there are now a lot of cool new colors in PlotUtils. However, these colors are designed for oceanography - for other scientific uses other colors may be ideal. I would thus suggest sorting color gradients in collections - apart from a :default collection (with :magma, :plasma etc.), and an :ocean collection (with the ocean colours) I could imagine :elevation, :monochromes, :ColorBrewer, :HCLwizard, :colorblind etc.

The idea is similar to swatch libraries in Adobe Illustrator. An advantage is that it would allow PlotUtils to make available a big library of color gradients without cluttering the workspace with names.

Collections may be required to specify keywords :sequential, :diverging, for easy convenience. They may also specify :individual color schemes for when different series have different colors.

This is part of the enhancement suggest in #3. I would be willing to find and define some collections if people like the idea.

Reduce PlotUtils load time

PlotUtils contributes a significant chunk to the load time of Plots (see JuliaPlots/Plots.jl#1825).

Measuring the load time of PlotUtils via

for i in 1 2 3 4 5; do julia -e '@time import PlotUtils'; done

I get:

  • PlotUtils: 1.5 s

Successively removing includes results in these load times:

  • No "colors.jl", "adapted_grid.jl" and "gradients/*.jl": 1.5 s
  • No "color_gradients.jl" : 0.7 s
  • Empty PlotUtils (no code, only deps): 0.67 s

So the culprit seems to be "color_gradients.jl" itself (without the gradient files it includes).

Enhancing color gradient support

I suggest enhancing the interface for color gradients. I will try to implement this myself, so this issue is to discuss the applicability and the interface.

The suggested interface is a magic attribute (color?) with the following elements:

  • color : the name of the gradient, e.g. :magma, but also offers
    • :default : the default value, probably equal to :sequential
    • :sequential : a sequential gradient, such as :magma
    • :diverging : a diverging gradient, such as :redsblues, e.g. used when the color variable is a standard variation
    • :dark : or something else - this is an example of other defaults that may be implemented
  • collection: the gradient collection to look in; see issue #4
  • clim : the current clim argument but with extra keywords for common specifications
    • :max_0 : clims are [minimum(x), 0], where x is the vector of values for the colors
    • :min_0 : clims are [0, maximum(x)]
    • :center_0: clims are [-y, y]; y = maximum(abs([extrema(x)...]))
  • gradtype : one of
    • :stretched : the current default, choose colors from a continuous gradient
    • :equal_interval : divide the numerical gradient into classesnumber of bins (makes it easier to read values from plots). The default when classes is an integer
    • :classified : a common synonym for :equal_interval
    • :quantiles : divide x into classes bins with the same number of observations in each
    • :custom : rarely specified directly, but the default when classes is passed a vector. Useful for e.g. classes = [-2, 1, 0, 1, 2] when the color reflects a standard deviation (or other standardized measure)
  • classes : can take either
    • an Int specifying the number of bins for :equal_interval and :quantiles
    • a Vector{T <: Number} specifying custom break points for the color scales. If gradtype is :quantiles this may be a vector of percentile values (e.g. classes = [0.025, 0.5, 0.975])

This interface would allow the users to use color much more succinctly and powerfully for scientific graphing, choropleths etc.

Note that the :color keyword is currently used to refer to both colors and gradients - with @oxinabox very increased number of named colours it may be necessary to rename to avoid confusion?

Bug: `cgrad` changes alphas (to illegal values above 1)

I stumbled upon this when making my own custom colormaps. Makie would not show me the plot. I narrowed the problem down to illegal alpha values strangely introduced by cgrad. This seems to happen when the alpha of one of the colors is specified. MWE:

julia> collect(cgrad([:black, RGBA{Float64}(1,1,1,1)], 5; categorical=true))
5-element Vector{Any}:
 RGBA{Float64}(0.0,0.0,0.0,1.0)
 RGBA{Float64}(0.25,0.25,0.25,1.25) # <- note the alpha > 1
 RGBA{Float64}(0.5,0.5,0.5,1.5) # <- note the alpha > 1
 RGBA{Float64}(0.75,0.75,0.75,1.75) # <- note the alpha > 1
 RGBA{Float64}(1.0,1.0,1.0,1.0)

EDIT
A simple workaround is to specify alpha in the cgrad call, but I still think this is a bug that should be fixed!

isconcrete not defined

On both PlotUtils master and latest tagged release for Julia v0.6.0

   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: https://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.6.0 (2017-06-19 13:05 UTC)
 _/ |\__'_|_|_|\__'_|  |  Official http://julialang.org/ release
|__/                   |  x86_64-pc-linux-gnu

julia> using Plots
INFO: Precompiling module PlotUtils.
ERROR: LoadError: UndefVarError: isconcrete not defined
Stacktrace:
 [1] include_from_node1(::String) at ./loading.jl:569
 [2] include(::String) at ./sysimg.jl:14
 [3] anonymous at ./<missing>:2
while loading /local/home/fredrikb/.julia/v0.6/ColorTypes/src/ColorTypes.jl, in expression starting on line 9
ERROR: LoadError: Failed to precompile ColorTypes to /local/home/fredrikb/.julia/lib/v0.6/ColorTypes.ji.
Stacktrace:
 [1] compilecache(::String) at ./loading.jl:703
 [2] _require(::Symbol) at ./loading.jl:456
 [3] require(::Symbol) at ./loading.jl:398
 [4] _include_from_serialized(::String) at ./loading.jl:157
 [5] _require_from_serialized(::Int64, ::Symbol, ::String, ::Bool) at ./loading.jl:200
 [6] _require_search_from_serialized(::Int64, ::Symbol, ::String, ::Bool) at ./loading.jl:236
 [7] _require(::Symbol) at ./loading.jl:434
 [8] require(::Symbol) at ./loading.jl:398
 [9] include_from_node1(::String) at ./loading.jl:569
 [10] include(::String) at ./sysimg.jl:14
 [11] anonymous at ./<missing>:2
while loading /local/home/fredrikb/.julia/v0.6/PlotUtils/src/PlotUtils.jl, in expression starting on line 7
ERROR: LoadError: Failed to precompile PlotUtils to /local/home/fredrikb/.julia/lib/v0.6/PlotUtils.ji.
Stacktrace:
 [1] compilecache(::String) at ./loading.jl:703
 [2] _require(::Symbol) at ./loading.jl:490
 [3] require(::Symbol) at ./loading.jl:398
 [4] include_from_node1(::String) at ./loading.jl:569
 [5] eval(::Module, ::Any) at ./boot.jl:235
 [6] _require(::Symbol) at ./loading.jl:483
 [7] require(::Symbol) at ./loading.jl:398
while loading /local/home/fredrikb/.julia/v0.6/Plots/src/Plots.jl, in expression starting on line 13

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.