rostam / graphtea Goto Github PK
View Code? Open in Web Editor NEWThe Graph Theory Software
Home Page: http://graphtheorysoftware.com/
The Graph Theory Software
Home Page: http://graphtheorysoftware.com/
I have been searching for this feature in the program and I didn't find it (sorry if already exists and I didn't see)
The menu in linux (at least in my ubuntu) is so dark. It is hard to read which one is which.
make some fun with facebook,
A feature that would make the program better is being able to zoom. Being able to zoom by pressing ctrl and +, - or ctrl and scroll wheel.
The horizontal line separating the tree area and the top bit is hard to resize because the area that the resize handle appears is so small that it is hard to do on a touchpad
the basic algorithms like dfs and bfs are very old cold. we need to rewrite them with the modern styles presented on :
https://github.com/graphtheorysoftware/GraphTea/blob/master/src/graphtea/extensions/algorithms/SampleAlgorithm.java
i don't see Maximum Weight Branching (with condensation process) feature, i hope next time this feature can be added for enhancement.
I downloaded the latest version , extracted to a directory and run make.sh, but the build failed.
Here is the log -> https://gist.github.com/brunocalou/455404f322d713cb5aaf
I'm using elementary OS 0.3.2 Freya (64-bit)
Reports>General>Number_Of_Edges
seems to not work properly and gives way more edges than exist. I think this might be an issue when multiple edges and vertices have been created and deleted.
Heres the stack trace that the program told me to include:
graphtea.library.exceptions.InvalidVertexException: You are trying to access or use a vertex that does not exist:Invalid
at graphtea.library.ListGraph.checkVertex(Unknown Source)
at graphtea.library.ListGraph.getEdges(Unknown Source)
at graphtea.library.ListGraph.isEdge(Unknown Source)
at graphtea.graph.graph.GraphModel.insertEdge(Unknown Source)
at graphtea.plugins.main.core.actions.edge.AddEdge.doJob(Unknown Source)
at graphtea.plugins.main.core.actions.edge.AddEdge.performAction(Unknown Source)
at graphtea.platform.core.AbstractAction.keyChanged(Unknown Source)
at graphtea.platform.core.BlackBoard.fireListeners(Unknown Source)
at graphtea.platform.core.BlackBoard.setData(Unknown Source)
at graphtea.graph.graph.FastRenderer.ActionPerformed(Unknown Source)
at graphtea.graph.graph.GraphControl.sendEventToBlackBoard(Unknown Source)
at graphtea.graph.graph.GraphControl.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
When I execute the minimum cut reoport from side bar, an exceptios is caught.
Edge Weight is of type integer; this is a undesirable limitation of the tool as sometimes weights are decimal values. I have re-coded the tool to utilize Double instead of integer within a few hours, however reading old data files fail, thus this version is a major change.
I did not investigate the file format to see if there is versioning information held that would allow a conditional check, but if that version number is not in the file, you should consider it for future releases.
get rid of xml representation and introduce json to be able to save/load and cut/copy/paste and connect to other programing languages using redis.
basic implementation, having the view of subgraph visualization
Hi!
I'm currently working on Debian's graphtea package. During the build process, we create the following symlink:
adi@foh:~$ ls -lh /usr/bin/graphtea
lrwxrwxrwx 1 root root 35 Apr 23 17:16 /usr/bin/graphtea -> ../share/graphtea/graphtea-main.jar
However, executing graphtea results in
adi@foh:~$ graphtea
There is no directory with name plugins.
When I run it from /usr/share/graphtea instead, it works as expected.
So graphtea has the notion of always running from a directory in which it also finds the plugin/, extensions/, and lib/ subdirectory.
I've started to make graphtea find its own plugin directory by querying the location of the current jar file. See commit ecb8c8e
Unfortunately, this is not enough. The GUI starts, but the "Generate graphs" menu item is empty. I have absolutely no Java experience, so somebody who knows graphtea should have a look. In the end, it should be possible to say
$ java -jar /path/to/graphtea-main.jar
with full functionality, e.g., omit the "cd binary/" and try
$ java -jar binary/graphtea-main.jar
instead. This has to work.
Cheers
U can zoom to some subgraph,
it mean that the other part of graphs are just a imagical representation.
I got this error when I run the help:
java.lang.UnsupportedOperationException: Desktop API is not supported on the current platform.
It closed GraphTea.
Also, when I click on "more" in the welcome message on the status bar.
Working on GraphTea newrooz 1.5.4
Reports -> General -> Is Eulerian?
Doesn't work properly in my graph, as you see all the vertices have even degrees so it should be an Eulerian graph, correct me if I am wrong.
I have changed the weights of edges, I click "Show weight" but nothing appears. Thanks
java.lang.Throwable: Error while loading graphtea.plugins.main.core.actions.RightClickAction. skipped.
at graphtea.ui.xml.UIHandlerImpl.handle_action(Unknown Source)
at graphtea.ui.xml.UIParser.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at graphtea.ui.xml.UIParser.parse(Unknown Source)
at graphtea.ui.xml.UIParser.parse(Unknown Source)
at graphtea.ui.xml.UIParser.parse(Unknown Source)
at graphtea.ui.UI.loadXML(Unknown Source)
at graphtea.ui.UI.loadXML(Unknown Source)
at graphtea.plugins.main.core.Init.init(Unknown Source)
at graphtea.plugins.main.Init.init(Unknown Source)
at graphtea.platform.plugin.Plugger.load(Unknown Source)
at graphtea.platform.plugin.Plugger.dfs(Unknown Source)
at graphtea.platform.plugin.Plugger.dfs(Unknown Source)
at graphtea.platform.plugin.Plugger.plug(Unknown Source)
at graphtea.platform.Application.loadPlugins(Unknown Source)
at graphtea.platform.Application.run(Unknown Source)
at graphtea.platform.Application.init(Unknown Source)
at graphtea.platform.Application.main(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:65)
at com.exe4j.runtime.WinLauncher.main(WinLauncher.java:101)
at com.install4j.runtime.launcher.WinLauncher.main(WinLauncher.java:26)
Hi guys. I just started using GraphTea and I can't work out how to draw an edge from a vertex to itself. Can you let me know how to do this? Sorry if I'm missing something obvious.
The maximum flow report generates exception sometimes, for example for Generalized Peterson (20,5)
Hello,
I am a teacher in France.
Thank you very much for this beautiful software.
I begin to use it.
Sometimes there is an error using Dijkstra's algorithm.
I sent you an example.
BugExample.pdf
Best regards
It would be nice if edges have delay property .(transit time of the edge)
So following algorithms could be added to GraphTea based on delay of edges :
1-maximum flow over time
2-quickest flow over time
3-earliest flow over time
...
when a lot of reports are open, some parts are un-scrollable
"Make selection complement" isn't deleting existing edges, only adding ones which aren't there
make the representation of the matrix more beautiful. :)
I just clone the repo and tried to build the project but to no effect
[redacted@arch GraphTea]$ uname -a
Linux arch 5.5.4-arch1-1 #1 SMP PREEMPT Sat, 15 Feb 2020 00:36:29 +0000 x86_64 GNU/Linux
[redacted@arch GraphTea]$ ./make.sh
Buildfile: /home/redacted/projects/GraphTea/build.xml
clean:
[delete] Deleting directory /home/redacted/projects/GraphTea/binary
[delete] Deleting directory /home/redacted/projects/GraphTea/build
BUILD SUCCESSFUL
Total time: 0 seconds
Buildfile: /home/redacted/projects/GraphTea/build.xml
depends:
[mkdir] Created dir: /home/redacted/projects/GraphTea/build
[mkdir] Created dir: /home/redacted/projects/GraphTea/binary
[mkdir] Created dir: /home/redacted/projects/GraphTea/binary/lib
[mkdir] Created dir: /home/redacted/projects/GraphTea/binary/plugins
[mkdir] Created dir: /home/redacted/projects/GraphTea/binary/extensions
compile:
[javac] /home/redacted/projects/GraphTea/build.xml:67: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] Compiling 878 source files to /home/tunes/projects/GraphTea/build
[javac] /home/redacted/projects/GraphTea/src/graphtea/extensions/io/GraphSaveObject.java:7: error: package javax.xml.bind does not exist
[javac] import javax.xml.bind.DatatypeConverter;
[javac] ^
[javac] /home/redacted/projects/GraphTea/src/graphtea/plugins/main/core/AlgorithmUtils.java:75: warning: [dep-ann] deprecated item is not annotated with @Deprecated
[javac] ArrayList<ArrayList<Integer>> getAdjList(BaseGraph<VertexType, EdgeType> g) {
[javac] ^
[javac] /home/redacted/projects/GraphTea/src/graphtea/plugins/main/core/AlgorithmUtils.java:96: warning: [dep-ann] deprecated item is not annotated with @Deprecated
[javac] int getDegree(BaseGraph<VertexType, EdgeType> bg, int node) {
[javac] ^
[javac] /home/redacted/projects/GraphTea/src/graphtea/plugins/main/core/AlgorithmUtils.java:116: warning: [dep-ann] deprecated item is not annotated with @Deprecated
[javac] ArrayList<VertexType> getNeighbors(BaseGraph<VertexType, EdgeType> g, VertexType source) {
[javac] ^
[javac] /home/redacted/projects/GraphTea/src/graphtea/plugins/main/core/AlgorithmUtils.java:135: warning: [dep-ann] deprecated item is not annotated with @Deprecated
[javac] ArrayList<VertexType> getNeighbors2(BaseGraph<VertexType, EdgeType> g, VertexType source) {
[javac] ^
[javac] /home/redacted/projects/GraphTea/src/graphtea/extensions/io/GraphSaveObject.java:79: error: cannot find symbol
[javac] return DatatypeConverter.printBase64Binary(getBytesOfGraph(g));
[javac] ^
[javac] symbol: variable DatatypeConverter
[javac] location: class GraphSaveObject
[javac] /home/redacted/projects/GraphTea/src/graphtea/extensions/io/GraphSaveObject.java:83: error: cannot find symbol
[javac] return getGraphFromBytes(DatatypeConverter.parseBase64Binary(s));
[javac] ^
[javac] symbol: variable DatatypeConverter
[javac] location: class GraphSaveObject
[javac] /home/redacted/projects/GraphTea/src/graphtea/extensions/io/GraphSaveObject.java:87: error: cannot find symbol
[javac] return getGraphSaveOobjectfromBytes(DatatypeConverter.parseBase64Binary(s));
[javac] ^
[javac] symbol: variable DatatypeConverter
[javac] location: class GraphSaveObject
[javac] Note: Some input files use or override a deprecated API.
[javac] Note: Recompile with -Xlint:deprecation for details.
[javac] Note: Some input files use unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.
[javac] 4 errors
[javac] 4 warnings
BUILD FAILED
/home/redacted/projects/GraphTea/build.xml:67: Compile failed; see the compiler error output for details.
Total time: 3 seconds
Error: Unable to access jarfile binary/graphtea-main.jar
http://azingoft.blogspot.de/2008/11/blog-post_10.html
with this code:
Init.java:
public class Init implements PluginInterface {
HashSet addedGRs = new HashSet();
static final String CURVE_WIDTH = "Curve Width";
public void init(final BlackBoard blackboard) {
blackboard.addListener(new Event(AbstractGraphRenderer.name), new Listener() {
public void notifyRelevantActions(Event notifierName, Object value) {
AbstractGraphRenderer gr = AbstractGraphRenderer.getCurrentGraphRenderer(blackboard);
if (addedGRs.contains(gr)) return;
gr.addPaintHandler(new Painter());
addedGRs.add(gr);
}
});
VertexModel.addGlobalUserDefinedAttribute(CURVE_WIDTH, 5);
}
}
Painter.java:
public class Painter implements PaintHandler {
GraphData gd = new GraphData(GraphLab.blackboard);
GraphModel G = gd.getGraph();
public void paint(Graphics gr1d, Object destinationComponent) {
final Graphics2D gr = (Graphics2D) gr1d;
final int n = G.getVerticesCount();
if (n == 0) return;
AbstractGraphRenderer.getCurrentGraphRenderer(GraphLab.blackboard).ignoreRepaints(new Runnable() {
public void run() {
boolean[] marks = new boolean[n];
BaseVertex V[] = G.getVertexArray();
final VertexModel parent[] = new VertexModel[n];
//consider the hole structure as a tree
AlgorithmUtils.BFSrun(G, (VertexModel) V[0], new AlgorithmUtils.BFSListener() {
public void visit(VertexModel v, VertexModel p) {
parent[v.getId()] = p;
}
});
for (VertexModel v : G) {
if (v.getId() == 0) continue;
if (v.getColor() == 0) {
VertexModel v1 = parent[v.getId()];
if (v1 == null || v1.getColor() != 0) continue;
VertexModel v2 = parent[v1.getId()];
if (v2 == null || v2.getColor() != 0) continue;
//generate the curve between v1, v2 and v3
GraphPoint p1 = v.getLocation();
GraphPoint p2 = v1.getLocation();
GraphPoint p3 = v2.getLocation();
GraphPoint m1 = AlgorithmUtils.getMiddlePoint(p1, p2);
GraphPoint m2 = AlgorithmUtils.getMiddlePoint(p2, p3);
GraphPoint cp = p2;
Integer w1 = v.getUserDefinedAttribute(CURVE_WIDTH);
Integer w2 = v1.getUserDefinedAttribute(CURVE_WIDTH);
Integer w3 = v2.getUserDefinedAttribute(CURVE_WIDTH);
int startWidth = (w1 + w2) / 2;
int endWidth = (w3 + w2) / 2;
int middleWidth = w2;
double teta1 = AlgorithmUtils.getAngle(p1, p2);
double teta2 = AlgorithmUtils.getAngle(p1, p3);
double teta3 = AlgorithmUtils.getAngle(p2, p3);
//generate boundary curves
java.awt.geom.QuadCurve2D c1 = new QuadCurve2D.Double(
m1.x - startWidth * sin(teta1), m1.y + startWidth * cos(teta1),
cp.x - middleWidth * sin(teta2), cp.y + middleWidth * cos(teta2),
m2.x - endWidth * sin(teta3), m2.y + endWidth * cos(teta3));
java.awt.geom.QuadCurve2D c2 = new QuadCurve2D.Double(
m2.x + endWidth * sin(teta3), m2.y - endWidth * cos(teta3),
cp.x + middleWidth * sin(teta2), cp.y - middleWidth * cos(teta2),
m1.x + startWidth * sin(teta1), m1.y - startWidth * cos(teta1));
//mix them
GeneralPath gp = new GeneralPath(c1);
gp.append(c2, true);
gp.closePath();
gr.setColor(Color.black);
//fill the curve
gr.fill(gp);
}
}
}
}, false /* dont repaint after*/);
}
}
Test
Coloring are not correct. For the bug generation, use Banana Tree with default parameters, i.e. (3,3) and check coloring. However it seems that the report of chromatic number is correct.
I am trying to install the software on ubuntu 15.10. It keeps complaining about the java -jar graphtea-main.jar file. Even the deb version of the software doesn't make a software icon so I can find it in the software library of installed software.
we had a action based undo / redo, which was very problematic. for every action we had to define undo and redo methods. then we switched to a time based undo / redo , which saves the graph state every two seconds. this makes it easier to write new actions and extensions, but still is not finished.
currently it save the graph state in json. it can be other things like our new simplegraph format. we should think about a good format, and the rest is almost done. the code is at:
UndoManager, UndoAction, RedoAction
The reset button resets the color of the graph to a constant color "0". It is not correct when the user changes the color of the vertex.
In my mind the status bar, where the welcome message comes, does not have a suitable size.
I think it should be smaller then the most part of the page used for Graph Drawing.
IsEulerian still doesn't work because isConnected fails due an error on the dfs function on AlgorithmUtils.java, seems that it only gets executed once. (tried debugging it by myself but I am not familiar with java and the project itself yet).
The code of the faulty dfs function it's this one:
public static <VertexType extends BaseVertex, EdgeType extends BaseEdge<VertexType>>
void dfs(BaseGraph<VertexType, EdgeType> g,
int node, ArrayList visit, int parent[]) {
visit.add(node);
ArrayList e = getAdjList(g);
ArrayList neighbors = (ArrayList) e.get(node);
for (Object neighbor1 : neighbors) {
int neighbor = (Integer) neighbor1;
if (parent[neighbor] == -1) {
parent[neighbor] = node;
dfs(g, neighbor, visit, parent);
}
}
}
Hello,
Recently I tried to generate a latex drawing for a graph and I cannot get the same look as the one I generate in the program. Is there something specific I should do to make it work?
In my opinion the regular graph with 16 vertices each of degree 7 is the model for the sudoku 4x4.
Therefore the chromatic number is 4 but GraphtTea says 6.
Who is right?
Thanks
Clicking the download button for Windows causes the following message to appear: We're sorry, but something went wrong.
make a java web start for it
Hi,
I have windows 8 as OS (he systems is 64 bit). I receive this error while installing :
Windows can't find javaw.
The Dijkstra algorithm provides minumum distance 13 between 1 and 6 but actually the minimum distance is 9
java.lang.Throwable: Error while loading graphtea.plugins.main.core.actions.RightClickAction. skipped.
at graphtea.ui.xml.UIHandlerImpl.handle_action(Unknown Source)
at graphtea.ui.xml.UIParser.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at graphtea.ui.xml.UIParser.parse(Unknown Source)
at graphtea.ui.xml.UIParser.parse(Unknown Source)
at graphtea.ui.xml.UIParser.parse(Unknown Source)
at graphtea.ui.UI.loadXML(Unknown Source)
at graphtea.ui.UI.loadXML(Unknown Source)
at graphtea.plugins.main.core.Init.init(Unknown Source)
at graphtea.plugins.main.Init.init(Unknown Source)
at graphtea.platform.plugin.Plugger.load(Unknown Source)
at graphtea.platform.plugin.Plugger.dfs(Unknown Source)
at graphtea.platform.plugin.Plugger.dfs(Unknown Source)
at graphtea.platform.plugin.Plugger.plug(Unknown Source)
at graphtea.platform.Application.loadPlugins(Unknown Source)
at graphtea.platform.Application.run(Unknown Source)
at graphtea.platform.Application.init(Unknown Source)
at graphtea.platform.Application.main(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:65)
at com.exe4j.runtime.WinLauncher.main(WinLauncher.java:101)
at com.install4j.runtime.launcher.WinLauncher.main(WinLauncher.java:26)
After selecting vertex nothing happens,
no tree is shown or calculated.
Using reports though,
an array solution is given (u can choose the starting point)
Using
$ java -version
java version "1.7.0_95"
OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-1~deb8u1)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)
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.