juliapy / seaborn.jl Goto Github PK
View Code? Open in Web Editor NEWJulia wrapper for Seaborn
License: Other
Julia wrapper for Seaborn
License: Other
@JuliaRegistrator register
There is a major release in seaborn v0.11.0 (September 2020) with some API changes and deprecations. Any plan to update Seaborn.jl
for it? I can try to make a PR in the next few weeks if needed.
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!
Hello,
I am using Julia pro v. 1.2 and I have imported the Seaborn library. When I add Seaborn I see a log reporting that Seaborn v0.4.1 has been added.
julia> Pkg.add("Seaborn")
Resolving package versions...
Updating
/.juliapro/JuliaPro_v1.2.0-1/environments/v1.2/Project.toml/.juliapro/JuliaPro_v1.2.0-1/environments/v1.2/Manifest.toml`[d2ef9438] + Seaborn v0.4.1 Updating
[d2ef9438] + Seaborn v0.4.1
However, by having a look at some blogs, I saw that Seaborn v.0.9 is needed for line plot.
Could anyone please help fixing this issue?
Thanks!
UndefVarError: lineplot not defined
getproperty(::Module, ::Symbol) at sys.dylib:?
top-level scope at Train_ML_regression.jl:972
include_string(::Module, ::String, ::String) at sys.dylib:?
include_string(::Module, ::String, ::String, ::Int64) at eval.jl:30
(::getfield(Atom, Symbol("##127#132")){String,Int64,String,Bool})() at eval.jl:94
withpath(::getfield(Atom, Symbol("##127#132")){String,Int64,String,Bool}, ::String) at utils.jl:30
withpath at eval.jl:47 [inlined]
#126 at eval.jl:93 [inlined]
with_logstate(::getfield(Atom, Symbol("##126#131")){String,Int64,String,Bool}, ::Base.CoreLogging.LogState) at logging.jl:395
with_logger at logging.jl:491 [inlined]
#125 at eval.jl:92 [inlined]
hideprompt(::getfield(Atom, Symbol("##125#130")){String,Int64,String,Bool}) at repl.jl:85
macro expansion at eval.jl:91 [inlined]
macro expansion at dynamic.jl:24 [inlined]
(::getfield(Atom, Symbol("##124#129")))(::Dict{String,Any}) at eval.jl:86
handlemsg(::Dict{String,Any}, ::Dict{String,Any}) at comm.jl:164
(::getfield(Atom, Symbol("##19#21")){Array{Any,1}})() at task.jl:268
Generally I find that Seaborn.jl works smoothly, but came across the
sns.despine()
function, which doesn't seem to work. Is there a workaround, apart from using PyCall?
https://seaborn.pydata.org/generated/seaborn.despine.html
Thanks.
Doing the following,
using Pandas
using Seaborn
df = Pandas.DataFrame(Dict("a" => [12,3,14,8,7,9], "b"=> [120,33,714,.8,887,99]))
g = Seaborn.PairGrid(df)
g.map_diag(Seaborn.kdeplot)
Leads to this error,
ERROR: PyError ($(Expr(:escape, :(ccall(#= /Users/traj/.julia/packages/PyCall/l64G5/src/pyfncall.jl:43 =# @pysym(:PyObject_Call), PyPtr, (PyPtr, PyPtr, PyPtr), o, pyargsptr, kw))))) <class 'ValueError'>
ValueError('callable <PyCall.jlwrap kdeplot> is not supported by signature')
File "/Users/traj/Documents/Discover/venv/lib/python3.8/site-packages/seaborn/axisgrid.py", line 1351, in map_diag
if "hue" not in signature(func).parameters:
File "/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/inspect.py", line 3093, in signature
return Signature.from_callable(obj, follow_wrapped=follow_wrapped)
File "/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/inspect.py", line 2842, in from_callable
return _signature_from_callable(obj, sigcls=cls,
File "/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/inspect.py", line 2405, in _signature_from_callable
raise ValueError('callable {!r} is not supported by signature'.format(obj))
PyCall 1.90.0 and PyPlot 2.8.0 are now released, which change o[:foo]
and o["foo"]
to o.foo
and o."foo"
, respectively, for python objects o
; see also JuliaPy/PyCall.jl#629.
The old getindex
methods still work but are deprecated, so you'll want to put out a new release that uses the new methods and REQUIREs the new versions to avoid having zillions of deprecation messages.
For any graph I try to use, I get errors. For example, trying to use a catplot I get:
ERROR: PyError ($(Expr(:escape, :(ccall(#= /home/egolep/.julia/packages/PyCall/BD546/src/pyfncall.jl:43 =# @pysym(:PyObject_Call), PyPtr, (PyPtr, PyPtr, PyPtr), o, pyargsptr, kw))))) <class 'TypeError'>
TypeError("'PyCall.jlwrap' object is not subscriptable")
File "/home/egolep/.local/lib/python3.9/site-packages/seaborn/_decorators.py", line 46, in inner_f
return f(**kwargs)
File "/home/egolep/.local/lib/python3.9/site-packages/seaborn/regression.py", line 605, in lmplot
data = data[cols]
Stacktrace:
[1] pyerr_check
@ ~/.julia/packages/PyCall/BD546/src/exception.jl:62 [inlined]
[2] pyerr_check
@ ~/.julia/packages/PyCall/BD546/src/exception.jl:66 [inlined]
[3] _handle_error(msg::String)
@ PyCall ~/.julia/packages/PyCall/BD546/src/exception.jl:83
[4] macro expansion
@ ~/.julia/packages/PyCall/BD546/src/exception.jl:97 [inlined]
[5] #107
@ ~/.julia/packages/PyCall/BD546/src/pyfncall.jl:43 [inlined]
[6] disable_sigint
@ ./c.jl:458 [inlined]
[7] __pycall!
@ ~/.julia/packages/PyCall/BD546/src/pyfncall.jl:42 [inlined]
[8] _pycall!(ret::PyObject, o::PyObject, args::Tuple{}, nargs::Int64, kw::PyObject)
@ PyCall ~/.julia/packages/PyCall/BD546/src/pyfncall.jl:29
[9] _pycall!
@ ~/.julia/packages/PyCall/BD546/src/pyfncall.jl:11 [inlined]
[10] (::PyObject)(; kwargs::Base.Iterators.Pairs{Symbol, DataFrames.DataFrame, Tuple{Symbol}, NamedTuple{(:data,), Tuple{DataFrames.DataFrame}}})
@ PyCall ~/.julia/packages/PyCall/BD546/src/pyfncall.jl:86
[11] lmplot(; kwargs::Base.Iterators.Pairs{Symbol, DataFrames.DataFrame, Tuple{Symbol}, NamedTuple{(:data,), Tuple{DataFrames.DataFrame}}})
@ Seaborn ~/.julia/packages/Seaborn/vfmph/src/Seaborn.jl:61
[12] top-level scope
@ REPL[53]:1
Or for a lmplot I get:
ERROR: PyError ($(Expr(:escape, :(ccall(#= /home/egolep/.julia/packages/PyCall/BD546/src/pyfncall.jl:43 =# @pysym(:PyObject_Call), PyPtr, (PyPtr, PyPtr, PyPtr), o, pyargsptr, kw))))) <class 'TypeError'>
TypeError("'PyCall.jlwrap' object is not subscriptable")
File "/home/egolep/.local/lib/python3.9/site-packages/seaborn/_decorators.py", line 46, in inner_f
return f(**kwargs)
File "/home/egolep/.local/lib/python3.9/site-packages/seaborn/regression.py", line 605, in lmplot
data = data[cols]
Stacktrace:
[1] pyerr_check
@ ~/.julia/packages/PyCall/BD546/src/exception.jl:62 [inlined]
[2] pyerr_check
@ ~/.julia/packages/PyCall/BD546/src/exception.jl:66 [inlined]
[3] _handle_error(msg::String)
@ PyCall ~/.julia/packages/PyCall/BD546/src/exception.jl:83
[4] macro expansion
@ ~/.julia/packages/PyCall/BD546/src/exception.jl:97 [inlined]
[5] #107
@ ~/.julia/packages/PyCall/BD546/src/pyfncall.jl:43 [inlined]
[6] disable_sigint
@ ./c.jl:458 [inlined]
[7] __pycall!
@ ~/.julia/packages/PyCall/BD546/src/pyfncall.jl:42 [inlined]
[8] _pycall!(ret::PyObject, o::PyObject, args::Tuple{}, nargs::Int64, kw::PyObject)
@ PyCall ~/.julia/packages/PyCall/BD546/src/pyfncall.jl:29
[9] pycall!(ret::PyObject, o::PyObject, args::Tuple{}, kwargs::Base.Iterators.Pairs{Symbol, Any, NTuple{7, Symbol}, NamedTuple{(:x, :y, :hue, :col, :data, :col_wrap, :height), Tuple{String, String, String, String, DataFrames.DataFrame, Int64, Int64}}})
@ PyCall ~/.julia/packages/PyCall/BD546/src/pyfncall.jl:11
[10] ##114
@ ~/.julia/packages/PyCall/BD546/src/pyfncall.jl:86 [inlined]
[11] lmplot(; kwargs::Base.Iterators.Pairs{Symbol, Any, NTuple{7, Symbol}, NamedTuple{(:x, :y, :hue, :col, :data, :col_wrap, :height), Tuple{String, String, String, String, DataFrames.DataFrame, Int64, Int64}}})
@ Seaborn ~/.julia/packages/Seaborn/vfmph/src/Seaborn.jl:61
[12] top-level scope
@ REPL[56]:1
Is it a problem with my version o Python? I also tried to use PyCall with Conda instead of my system version of Python, but with no difference (I don't also know if Seaborn.jl actually uses PyCall)
Hi! Would you mind adding "boxenplot" to the export list and the @DeleGate list. It seems to work fine as soon as it is added. Thanks!
the version installed in my Mac when trying ] add Seaborn
is v0.4.1, then I tried to install it from GitHub but not succeed
(@v1.4) pkg> add Seaborn#master
Updating git-repo `https://github.com/JuliaPy/Seaborn.jl.git`
ERROR: could not find project file in package at https://github.com/JuliaPy/Seaborn.jl.git
can you please tell me where maybe the problem? Thanks
Thanks for this excellent package. I like the convenience of Seaborn and use it regularly.
But I do have a question. Is there a reason why the Seaborn functions lineplot
and scatterplot
are not included? For example, the following scatterplot code errors:
using Seaborn; scatterplot(rand(50), rand(50))
whereas using PyCall works for scatterplots:
using PyCall; snspy = pyimport("seaborn"); snspy.scatterplot(rand(50), rand(50))
WARNING: Base.Test is deprecated, run `using Test` instead
likely near /home/glynch/.julia/packages/Seaborn/OUpGU/test/runtests.jl:2
using Seaborn
Seaborn.set(style="ticks")
yields:
ERROR: MethodError: no method matching getproperty(::PyCall.PyObject, ::QuoteNode)
Closest candidates are:
getproperty(::PyCall.PyObject, ::Symbol) at /home/simoncor/.julia/packages/PyCall/RQjD7/src/PyCall.jl:309
getproperty(::PyCall.PyObject, ::AbstractString) at /home/simoncor/.julia/packages/PyCall/RQjD7/src/PyCall.jl:298
getproperty(::Any, ::Symbol) at sysimg.jl:18
Stacktrace:
[1] #set#27(::Base.Iterators.Pairs{Symbol,String,Tuple{Symbol},NamedTuple{(:style,),Tuple{String}}}, ::Function) at /home/simoncor/.julia/packages/Seaborn/Dyyhg/src/Seaborn.jl:55
[2] (::getfield(Seaborn, Symbol("#kw##set")))(::NamedTuple{(:style,),Tuple{String}}, ::typeof(Seaborn.set)) at ./none:0
[3] top-level scope at none:0
System: Julia 1.2.0 on Jupyter, Julia 1.10 on my other laptop has the same issue.
using PyPlot, Plots
using CSV, DataFrames
using Seaborn; sns = Seaborn;
df = CSV.read("Pokemon.csv", header=1);
sns.lmplot(x=df.Attack, y=df.Defense, data=df, fit_reg=false)
runs into error:
PyError ($(Expr(:escape, :(ccall(#= C:\Users\jhsu.julia\packages\PyCall\zqDXB\src\pyfncall.jl:43 =# @pysym(:PyObject_Call), PyPtr, (PyPtr, PyPtr, PyPtr), o, pyargsptr, kw))))) <class 'TypeError'>
TypeError("'PyCall.jlwrap' object is not subscriptable",)
File "C:\Users\jhsu.julia\conda\3\lib\site-packages\seaborn\regression.py", line 551, in lmplot
data = data[cols]
Stacktrace:
[1] pyerr_check at C:\Users\jhsu.julia\packages\PyCall\zqDXB\src\exception.jl:60 [inlined]
[2] pyerr_check at C:\Users\jhsu.julia\packages\PyCall\zqDXB\src\exception.jl:64 [inlined]
[3] _handle_error(::String) at C:\Users\jhsu.julia\packages\PyCall\zqDXB\src\exception.jl:81
[4] macro expansion at C:\Users\jhsu.julia\packages\PyCall\zqDXB\src\exception.jl:95 [inlined]
[5] #110 at C:\Users\jhsu.julia\packages\PyCall\zqDXB\src\pyfncall.jl:43 [inlined]
[6] disable_sigint at .\c.jl:446 [inlined]
[7] __pycall! at C:\Users\jhsu.julia\packages\PyCall\zqDXB\src\pyfncall.jl:42 [inlined]
[8] _pycall!(::PyCall.PyObject, ::PyCall.PyObject, ::Tuple{}, ::Int64, ::PyCall.PyObject) at C:\Users\jhsu.julia\packages\PyCall\zqDXB\src\pyfncall.jl:29
[9] _pycall!(::PyCall.PyObject, ::PyCall.PyObject, ::Tuple{}, ::Base.Iterators.Pairs{Symbol,Any,NTuple{4,Symbol},NamedTuple{(:x, :y, :data, :fit_reg),Tuple{CSV.Column{Int64,Int64},CSV.Column{Int64,Int64},DataFrame,Bool}}}) at C:\Users\jhsu.julia\packages\PyCall\zqDXB\src\pyfncall.jl:11
[10] #call#117 at C:\Users\jhsu.julia\packages\PyCall\zqDXB\src\pyfncall.jl:86 [inlined]
[11] (::getfield(PyCall, Symbol("#kw#PyObject")))(::NamedTuple{(:x, :y, :data, :fit_reg),Tuple{CSV.Column{Int64,Int64},CSV.Column{Int64,Int64},DataFrame,Bool}}, ::PyCall.PyObject) at .\none:0
[12] #lmplot#4(::Base.Iterators.Pairs{Symbol,Any,NTuple{4,Symbol},NamedTuple{(:x, :y, :data, :fit_reg),Tuple{CSV.Column{Int64,Int64},CSV.Column{Int64,Int64},DataFrame,Bool}}}, ::typeof(lmplot)) at C:\Users\jhsu.julia\packages\Seaborn\E3HS0\src\Seaborn.jl:55
[13] (::getfield(Seaborn, Symbol("#kw##lmplot")))(::NamedTuple{(:x, :y, :data, :fit_reg),Tuple{CSV.Column{Int64,Int64},CSV.Column{Int64,Int64},DataFrame,Bool}}, ::typeof(lmplot)) at .\none:0
[14] top-level scope at In[31]:1
However, using replot:
sns.regplot(x=df.Attack, y=df.Defense, fit_reg=true)
yields expected plot.
I'm using the relplot function and I have to do multiple graphics with different X scales.
In Python, I would use facet_kws=dic(sharex=False), but in Julia I obviously can't do it since the Dict constructor does not have the sharex parameter.
Is there a similar parameter that I'm missing? Or how could I achieve the same result?
Could you please help fix this?
using Seaborn
Seaborn.set_style("white")
ArgumentError: ref of NULL PyObject
Stacktrace:
[1] getindex(::PyObject, ::String) at /home/juliohm/.julia/packages/PyCall/0jMpb/src/PyCall.jl:284
[2] getindex at /home/juliohm/.julia/packages/PyCall/0jMpb/src/PyCall.jl:294 [inlined]
[3] #set_style#21(::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::Function, ::String) at /home/juliohm/.julia/dev/Seaborn/src/Seaborn.jl:55
[4] set_style(::String) at /home/juliohm/.julia/dev/Seaborn/src/Seaborn.jl:55
[5] top-level scope at In[14]:2
The key not found
error occurs when I call any function in Seaborn.jl, which is quite weird.
julia> using Seaborn
julia> Seaborn.load_dataset
load_dataset (generic function with 1 method)
julia> Seaborn.load_dataset("tips")
ERROR: KeyError: key :load_dataset not found
Stacktrace:
[1] __getproperty(o::PyCall.PyObject, s::Symbol)
@ PyCall C:\Users\shuhu\.julia\packages\PyCall\BD546\src\PyCall.jl:307
[2] getproperty
@ C:\Users\shuhu\.julia\packages\PyCall\BD546\src\PyCall.jl:312 [inlined]
[3] load_dataset(name::String)
@ Seaborn C:\Users\shuhu\.julia\packages\Seaborn\vfmph\src\Seaborn.jl:754
[4] top-level scope
@ REPL[4]:1
Version info
(@v1.6) pkg> st
Status `C:\Users\shuhu\.julia\environments\v1.6\Project.toml`
[8f4d0f93] Conda v1.5.2
[7073ff75] IJulia v1.23.2
[5fb14364] OhMyREPL v0.5.10
[438e738f] PyCall v1.92.3
[d2ef9438] Seaborn v1.0.0
julia> versioninfo()
Julia Version 1.6.2
Commit 1b93d53fc4 (2021-07-14 15:36 UTC)
Platform Info:
OS: Windows (x86_64-w64-mingw32)
CPU: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-11.0.1 (ORCJIT, skylake)
Environment:
JULIA_NUM_THREADS = 8
PyCall
info
julia> using PyCall
julia> PyCall.pyversion
v"3.8.3"
julia> PyCall.conda
true
# PyCall seems to work
julia> math = pyimport("math")
PyObject <module 'math' (built-in)>
julia> math.sin(math.pi / 4)
0.7071067811865476
Here is a Julia REPL session:
julia> using Pandas, Seaborn
julia> df = read_csv("data/CH06PR05.txt")
64.0 4.0 2.0
0 73.0 4.0 4.0
1 61.0 4.0 2.0
2 76.0 4.0 4.0
3 72.0 6.0 2.0
4 80.0 6.0 4.0
5 71.0 6.0 2.0
6 83.0 6.0 4.0
7 83.0 8.0 2.0
8 89.0 8.0 4.0
9 86.0 8.0 2.0
10 93.0 8.0 4.0
11 88.0 10.0 2.0
12 95.0 10.0 4.0
13 94.0 10.0 2.0
14 100.0 10.0 4.0
julia> pairplot(df)
ERROR: PyError ($(Expr(:escape, :(ccall(#= /Users/charlie/.julia/packages/PyCall/BcTLp/src/pyfncall.jl:43 =# @pysym(:PyObject_Call), PyPtr, (PyPtr, PyPtr, PyPtr), o, pyargsptr, kw))))) <class 'ValueError'>
ValueError('Number of rows must be a positive integer, not 0')
File "/Users/charlie/.julia/conda/3/lib/python3.8/site-packages/seaborn/_decorators.py", line 46, in inner_f
return f(**kwargs)
File "/Users/charlie/.julia/conda/3/lib/python3.8/site-packages/seaborn/axisgrid.py", line 1925, in pairplot
grid = PairGrid(data, vars=vars, x_vars=x_vars, y_vars=y_vars, hue=hue,
File "/Users/charlie/.julia/conda/3/lib/python3.8/site-packages/seaborn/_decorators.py", line 46, in inner_f
return f(**kwargs)
File "/Users/charlie/.julia/conda/3/lib/python3.8/site-packages/seaborn/axisgrid.py", line 1176, in __init__
fig, axes = plt.subplots(len(y_vars), len(x_vars),
File "/Users/charlie/.julia/conda/3/lib/python3.8/site-packages/matplotlib/cbook/deprecation.py", line 451, in wrapper
return func(*args, **kwargs)
File "/Users/charlie/.julia/conda/3/lib/python3.8/site-packages/matplotlib/pyplot.py", line 1272, in subplots
axs = fig.subplots(nrows=nrows, ncols=ncols, sharex=sharex, sharey=sharey,
File "/Users/charlie/.julia/conda/3/lib/python3.8/site-packages/matplotlib/cbook/deprecation.py", line 451, in wrapper
return func(*args, **kwargs)
File "/Users/charlie/.julia/conda/3/lib/python3.8/site-packages/matplotlib/figure.py", line 1522, in subplots
return (self.add_gridspec(nrows, ncols, figure=self, **gridspec_kw)
File "/Users/charlie/.julia/conda/3/lib/python3.8/site-packages/matplotlib/figure.py", line 2804, in add_gridspec
gs = GridSpec(nrows=nrows, ncols=ncols, figure=self, **kwargs)
File "/Users/charlie/.julia/conda/3/lib/python3.8/site-packages/matplotlib/gridspec.py", line 420, in __init__
GridSpecBase.__init__(self, nrows, ncols,
File "/Users/charlie/.julia/conda/3/lib/python3.8/site-packages/matplotlib/gridspec.py", line 48, in __init__
raise ValueError(
Stacktrace:
[1] pyerr_check at /Users/charlie/.julia/packages/PyCall/BcTLp/src/exception.jl:62 [inlined]
[2] pyerr_check at /Users/charlie/.julia/packages/PyCall/BcTLp/src/exception.jl:66 [inlined]
[3] _handle_error(::String) at /Users/charlie/.julia/packages/PyCall/BcTLp/src/exception.jl:83
[4] macro expansion at /Users/charlie/.julia/packages/PyCall/BcTLp/src/exception.jl:97 [inlined]
[5] #110 at /Users/charlie/.julia/packages/PyCall/BcTLp/src/pyfncall.jl:43 [inlined]
[6] disable_sigint at ./c.jl:446 [inlined]
[7] __pycall! at /Users/charlie/.julia/packages/PyCall/BcTLp/src/pyfncall.jl:42 [inlined]
[8] _pycall!(::PyCall.PyObject, ::PyCall.PyObject, ::Tuple{DataFrame}, ::Int64, ::Ptr{Nothing}) at /Users/charlie/.julia/packages/PyCall/BcTLp/src/pyfncall.jl:29
[9] _pycall! at /Users/charlie/.julia/packages/PyCall/BcTLp/src/pyfncall.jl:11 [inlined]
[10] #_#117 at /Users/charlie/.julia/packages/PyCall/BcTLp/src/pyfncall.jl:86 [inlined]
[11] (::PyCall.PyObject)(::DataFrame) at /Users/charlie/.julia/packages/PyCall/BcTLp/src/pyfncall.jl:86
[12] pairplot(::DataFrame; kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /Users/charlie/.julia/packages/Seaborn/E3HS0/src/Seaborn.jl:55
[13] pairplot(::DataFrame) at /Users/charlie/.julia/packages/Seaborn/E3HS0/src/Seaborn.jl:55
[14] top-level scope at REPL[3]:1
A window pops up, but nothing appears inside of it. I'm very happy to run additional tests or give more info!
Pandas.jl v1.4.0, Seaborn.jl v0.4.1.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.