eseifert / gral Goto Github PK
View Code? Open in Web Editor NEWFree Java library for displaying plots
License: GNU General Public License v3.0
Free Java library for displaying plots
License: GNU General Public License v3.0
Data sources which are added/removed using the Plot.add()
or Plot.remove()
methods don't get the default renderers in XYPlot
. They are also not shown on/removed from the legend.
Imported from trac ticket 24, created by eseifert on 11-24-2010 at 02:03, last modified: 11-24-2010 at 02:06
If a data source gets added after creating a plot its columns don't get mapped at all and the data source isn't displayed anymore.
Imported from trac ticket 32, created by eseifert on 04-16-2011 at 16:02, last modified: 04-16-2011 at 16:05
All sizes, but especially font sizes, should be set relative to the size of a standard font size (like "em" in typography)
Imported from trac ticket #3
, created by eseifert on 05-23-2010 at 14:11, last modified: 01-24-2014 at 14:04
Currently, it is only possible to receive general change events from data sources. This may require additional filtering taking place at different listeners.
To avoid redundant calls, the respective data sources should invoke more specific methods depending on the type of the data change. Adding data for example could invoke dataAdded
, while changing an existing value would call dataUpdated
.
Imported from trac ticket 33, created by mseifert on 04-16-2011 at 17:08, last modified: 04-17-2011 at 13:26
At the moment there's no way to assign data sources to certain axes (e.g. secondary axes in XYPlot
). There should be a method, method parameter or flag to tell which which dimension (i.e. column in a data source) should be mapped which axis.
Imported from trac ticket 31, created by eseifert on 04-15-2011 at 23:21, last modified: 04-16-2011 at 12:49
BarPlot instances should accept multiple data sources. They could be displayed as parallel bars or as stacked bars.
Imported from trac ticket 17, created by eseifert on 07-20-2010 at 00:42, last modified: 07-20-2010 at 00:42
It should be possible to add new DataSource objects to a plot instance after it has been created. Consequently, it should to allowed to remove existing DataSource objects from a plot.
Imported from trac ticket 15, created by eseifert on 07-20-2010 at 00:38, last modified: 07-20-2010 at 17:49
At the moment pie plots can't display a legend. This is caused by the current architecture: legends can't display a name for values, but only for the different data sources assigned to the plot.
Two steps are necessary to implement this feature:
A way to store labels for data values has to be found. This could be done by storing an additional column with labels in the data source, or by just using the data column as labels in the legend.
A custom implementation of legend has to be added to pie plot that will display the labels.
Imported from trac ticket #50, created by eseifert on 11-27-2011 at 15:23, last modified: 01-21-2012 at 20:54
The current build fails on Mac OS X because it assumes that a Sun/Oracle? JDK is in use.
The attached patch alters the build in the following ways:
so to get a compressed/obfuscated build you would need to do
$ mvn -Pproguard package
and to get the same on a Mac OS X system
$ mvn -Pmacosx,proguard package
Imported from trac ticket 44, created by ianp on 05-31-2011 at 15:09, last modified: 05-31-2011 t 17:37
A new way for configuring plots should be added:
Additionally to adjusting the settings for each element there shuld be a way to pass a single Map
which contains the visual properties for the plot. This would be a kind of stylesheet and could be shared across several plots.
Imported from trac ticket 9, created by eseifert on 05-29-2010 at 18:19, last modified: 05-29-2010 at 18:19
At the moment data values can be displayed in plots like XYPlot
or BarPlot
. However, sometimes it may be desirable to display other values or labels next to the data points.
A new setting for a label column should be added to point renderers.
For text labels a way for storing texts must be found (see #49).
Imported from trac ticket #51, created by eseifert on 11-27-2011 at 15:31, last modified: 11-27-2011 at 16:52
GRAL should be able to import data from JDBC data sources. An JDBC compatible data source should be implemented which can be used in plots.
Additionally a simple buffering scheme could be implemented to avoid unnecessary SQL queries.
Imported from trac ticket 27, created by eseifert on 02-19-2011 at 21:22, last modified: 02-19-2011 at 21:27
Currently, there is a bug that prevents tick marks of custom ticks to be drawn on axes.
Imported from trac ticket 40, created by eseifert on 04-26-2011 at 14:24, last modified: 04-26-2011 at 14:27
There should be an option to enable automatic selection of tick spacing in axes.
Imported from trac ticket #1, created by eseifert on 05-23-2010 at 14:06, last modified: 04-27-2013 at 15:51
BitmapWriter.write(Drawable, OutputStream, double, double, double, double)
creates a BufferedImage
, retrieves a Graphics2D
from it and draws the Drawable
into the image. However, there is currently no way of setting rendering hints for the Graphics2D
, so all drawables will be aliased.
Thanks to rpet for his error report that disclosed this issue.
The plot in exported bitmap images is of size 0 when the plot hasn't been sized before writing. The bitmap image itself has correct size but all elements of the the plot are located at (0,0).
Imported from trac ticket 29, created by eseifert on 04-15-2011 at 15:36, last modified: 04-15-2011 at 22:48
InteractivePanel should get more interactive. Examples:
allow zooming with click, lasso, or by mouse wheel
Set scale of axes.
Imported from trac ticket #4, created by eseifert on 05-23-2010 at 14:14, last modified: 05-30-2010 at 18:47
Add more plot types:
multiple axis plots
circular plots
contour plots
etc.
Imported from trac ticket 5, created by eseifert on 05-23-2010 at 14:16, last modified: 12-10-2013 at 16:25
Just like more complex computations like median or mean, all other statistical data that is not needed to draw a graph should be calculated on-demand.
Imported from trac ticket 38, created by mseifert on 04-17-2011 at 13:24, last modified: 04-22-2011 at 15:49
It should be possible to clip the plotted data to specific shape, e.g. to the plot area. This way data doesn't overlap with ticks or label outside the plot area.
Imported from trac ticket 21, created by eseifert on 10-22-2010 at 14:56, last modified: 10-22-2010 at 19:18
Applying a logarithmic scale to the y-axis of the HistrogramPlot
example causes GRAL to hang.
Imported from trac ticket 41, created by eseifert on 05-10-2011 at 16:12, last modified: 05-10-2011 at 16:19
It should be possible to display large sets of data, e.g. over 100,000 data points. At the moment all data is loaded into memory. The data that is loaded to memory and that is displayed will have to be reduced.
One possibility is to query ranges. Changes the data source interface may be necessary.
The axis isn't shown anymore after changing the axis renderer on a plot which is already displayed.
Imported from trac ticket 42, created by eseifert on 05-11-2011 at 17:01, last modified: 05-11-2011 at 17:03
The current implementation of the Statistics class is very inefficient. When populating a DataTable
by adding rows one by one, the whole statistics data is erased and recalculated. This is especially an issue when dealing with larger data sets, like the ScatterPlot
example does.
Imported from trac ticket 36, created by mseifert on 04-16-2011 at 21:18, last modified: 04-17-2011 at 13:26
At the moment DataSource
is restricted to types that are derived from Number, which is sufficient in most cases. However, GRAL should be able to handle more diverse data in future.
Advantages:
Disadvantages:
Output of DataSource.get(int,int)
method will get more difficult to use, i.e. casting will be necessary.
Sorting of columns may get difficult.
Imported from trac ticket #49, created by eseifert on 11-27-2011 at 15:16, last modified: 11-27-2011 at 15:31
PiePlot
instances should accept multiple data sources. They could be displayed as additional stacked rings.
There should be class diagrams in documentation.
Imported from trac ticket 11, created by eseifert on 05-29-2010 at 18:23, last modified: 05-29-2010 at 18:23
Add support for breaks to line and area renderers, i.e. Not-a-Number (NaN) values should cause a split shape.
Any plan to make GRAL available in a maven repository?
Imported from trac ticket 28, created by Julien on 03-08-2011 at 23:18, last modified: 06-01-2013 at 18:54
Sometimes ticks (major as well as minor) at the end of axes aren't drawn. This is probably caused by rounding erros.
Imported from trac ticket #6, created by eseifert on 05-23-2010 at 14:25, last modified: 07-25-2010 at 21:55
Dragging the plot in an InteractivePanel does not work as intended when an axis renderer has the SHAPE_DIRECTION_SWAPPED enabled. The dragging direction is also swapped then. Maybe this needs to be handled in a special case.
Imported from trac ticket 18, created by eseifert on 07-28-2010 at 22:13, last modified: 07-28-2010 at 22:48
When trying to zoom in or out of the plot in the MemoryUsage
example, the next data update causes the zoom to reset. The user can only see some flicker and nothing changed. The same occurs when trying to scroll in any direction.
To circumvent this, I suggest:
Disabling the scrolling, since the plot auto scrolls
Fix the zoom issue
Imported from trac ticket 34, created by mseifert on 04-16-2011 at 20:59, last modified: 04-24-2011 at 15:02
Add support for linear regressions.
Imported from trac ticket #12, created by eseifert on 05-29-2010 at 18:24, last modified: 04-17-2011 at 13:25
Problem: Calling method 'equals' causes a nullpointerexception in case 'old' hasn't been set before and therefore being null.
@SuppressWarnings("unchecked")
public <T> Comparable<T> set(int col, int row, Comparable<T> value) {
Comparable<T> old;
DataChangeEvent event = null;
synchronized (this) {
old = (Comparable<T>) get(col, row);
if (!old.equals(value)) {
rows.get(row)[col] = value;
event = new DataChangeEvent(this, col, row, old, value);
}
}
if (event != null) {
notifyDataUpdated(event);
}
return old;
}
Solution:
@SuppressWarnings("unchecked")
public <T> Comparable<T> set(int col, int row, Comparable<T> value) {
Comparable<T> old;
DataChangeEvent event = null;
synchronized (this) {
old = (Comparable<T>) get(col, row);
if (old == null || !old.equals(value)) {
rows.get(row)[col] = value;
event = new DataChangeEvent(this, col, row, old, value);
}
}
if (event != null) {
notifyDataUpdated(event);
}
return old;
}
Creating a plot without data sources causes a NullPointerException
because the minimum and maximum values for each axis return null
.
Imported from trac ticket 35, created by eseifert on 04-16-2011 at 21:06, last modified: 04-23-2011 at 01:08
The user should be able to change the visibility of data sources in a plot. This way, data can be added without rendering it or hiding/showing it at runtime.
Imported from trac ticket 14, created by mseifert on 07-19-2010 at 17:43, last modified: 07-19-2010 at 18:28
It should be possible to restrict moving and panning to certain axes.
Imported from trac ticket 23, created by eseifert on 11-24-2010 at 00:00, last modified: 11-24-2010 at 00:04
The key constant SIZE_COLUMN
isn't public and thus cannot be used. It should be made public.
XYPlot provides constants for secondary axes (XYPlot.AXIS_X2
and XYPlot.AXIS_Y2
) but currently adding doesn't work correctly. The plot will display the axis but only on top left of the plot graphics.
The behavior is reproducible using the following code:
Axis y2 = new Axis(0, 24);
plot.setAxis(XYPlot.AXIS_Y2, y2);
LinearRenderer2D renderer = new LinearRenderer2D();
plot.setAxisRenderer(XYPlot.AXIS_Y2, renderer);
Support for secondary axis should be added
Imported from trac ticket 30, created by eseifert on 04-15-2011 at 22:45, last modified: 04-15-2011 at 22:47
If the minimum value of an axis is larger than the position of custom ticks, the ticks still get drawn at the axis' origin.
When trying to plot the following values in the Example source code app Gral hangs/takes a really long time to plot:
20.0,-125.8126857778749
40.0,-107.7508849908641
100.0,-83.87447716883071
200.0,-65.81265257035975
400.0,-47.75082318450755
1000.0,-23.891515853387343
2000.0,-6.8231791863293
2500.0,-3.009346236471874
3000.0,-1.254871041134651
4000.0,-0.25255845707859764
100000,-0.0013795951762697017
200000,-1.0055108990187697E-4
Imported from trac ticket 26, created by larkar on 12-01-2010 at 23:42, last modified: 01-16-2011 at 01:46
At the moment it isn't possible to use columns other than column 2 with SizeablePointRenderer. The setting SIZE_COLUMN is simply ignored.
Imported from trac ticket 20, created by eseifert on 10-10-2010 at 17:25, last modified: 10-10-2010 at 17:29
Hi,
I tried to build a jar file using gradle (2.3). However, it fails:
Download https://jcenter.bintray.com/com/google/code/google-collections/google-collect/snapshot->20080530/google-collect-snapshot-20080530.jar
Download https://jcenter.bintray.com/stax/stax-api/1.0.1/stax-api-1.0.1.jar
Download https://jcenter.bintray.com/org/sonatype/sisu/sisu-guice/2.9.1/sisu-guice-2.9.1-noaop.jar
Download https://jcenter.bintray.com/log4j/log4j/1.2.12/log4j-1.2.12.jar
Download https://jcenter.bintray.com/commons-logging/commons-logging-api/1.1/commons-logging->api-1.1.jar
fatal: Not a git repository (or any of the parent directories): .git
FAILURE: Build failed with an exception.
- Where:
Build file '/home/thorsten/Downloads/gral-master/build.gradle' line: 108- What went wrong:
A problem occurred evaluating root project 'GRAL'.
Process 'command 'git'' finished with non-zero exit value 128
The output --stacktrace is:
- Exception is:
org.gradle.api.GradleScriptException: A problem occurred evaluating root project 'GRAL'.
at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:54)
at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:154)
at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:39)
at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:26)
at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:34)
at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:59)
at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:492)
at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:86)
at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:42)
at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:35)
at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:129)
at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106)
at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86)
at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:80)
at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33)
at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:36)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:51)
at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:169)
at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:237)
at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:210)
at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:35)
at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24)
at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:206)
at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:169)
at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
at org.gradle.launcher.Main.doAction(Main.java:33)
at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:54)
at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:35)
at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
Caused by: org.gradle.process.internal.ExecException: Process 'command 'git'' finished with non-zero exit value 128
at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:365)
at org.gradle.process.internal.DefaultExecAction.execute(DefaultExecAction.java:31)
at org.gradle.api.internal.file.DefaultFileOperations.exec(DefaultFileOperations.java:151)
at org.gradle.api.internal.project.AbstractProject.exec(AbstractProject.java:780)
at org.gradle.groovy.scripts.DefaultScript.exec(DefaultScript.java:201)
at org.gradle.api.Script$exec$0.callCurrent(Unknown Source)
at build_7ywaf999q0ful94t8s3nkopek.getVersionString(/home/thorsten/Downloads/gral-master/build.gradle:108)
at build_7ywaf999q0ful94t8s3nkopek$_run_closure1.doCall(/home/thorsten/Downloads/gral-master/build.gradle:3)
at org.gradle.api.internal.ClosureBackedAction.execute(ClosureBackedAction.java:67)
at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:130)
at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:91)
at org.gradle.api.internal.project.AbstractProject.configure(AbstractProject.java:812)
at org.gradle.api.internal.project.AbstractProject.configure(AbstractProject.java:817)
at org.gradle.api.internal.project.AbstractProject.allprojects(AbstractProject.java:804)
at org.gradle.api.internal.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:225)
at org.gradle.api.internal.BeanDynamicObject.invokeMethod(BeanDynamicObject.java:129)
at org.gradle.api.internal.CompositeDynamicObject.invokeMethod(CompositeDynamicObject.java:147)
at org.gradle.groovy.scripts.BasicScript.methodMissing(BasicScript.java:79)
at build_7ywaf999q0ful94t8s3nkopek.run(/home/thorsten/Downloads/gral-master/build.gradle:1)
at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:52)
... 32 more
The output of --debug is:
[...]
15:14:32.782 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: STARTING
15:14:32.783 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Waiting until process started: command 'git'.
15:14:32.788 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: STARTED
15:14:32.789 [DEBUG] [org.gradle.process.internal.ExecHandleRunner] waiting until streams are handled...
15:14:32.789 [INFO] [org.gradle.process.internal.DefaultExecHandle] Successfully started process 'command 'git''
15:14:32.792 [ERROR] [system.err] fatal: Not a git repository (or any of the parent directories): .git
15:14:32.795 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: FAILED
15:14:32.796 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Process 'command 'git'' finished with exit value 128 (state: FAILED)
15:14:32.798 [DEBUG] [org.gradle.configuration.project.BuildScriptProcessor] Timing: Running the build script took 1.349 secs
15:14:32.813 [ERROR] [org.gradle.BuildExceptionReporter]
15:14:32.813 [ERROR] [org.gradle.BuildExceptionReporter] FAILURE: Build failed with an exception.
15:14:32.814 [ERROR] [org.gradle.BuildExceptionReporter]
15:14:32.815 [ERROR] [org.gradle.BuildExceptionReporter] * Where:
15:14:32.815 [ERROR] [org.gradle.BuildExceptionReporter] Build file '/home/thorsten/Downloads/gral-master/build.gradle' line: 108
15:14:32.815 [ERROR] [org.gradle.BuildExceptionReporter]
15:14:32.816 [ERROR] [org.gradle.BuildExceptionReporter] * What went wrong:
15:14:32.816 [ERROR] [org.gradle.BuildExceptionReporter] A problem occurred evaluating root project 'GRAL'.
15:14:32.817 [ERROR] [org.gradle.BuildExceptionReporter] > Process 'command 'git'' finished with non-zero exit value 128
15:14:32.817 [ERROR] [org.gradle.BuildExceptionReporter]
15:14:32.817 [ERROR] [org.gradle.BuildExceptionReporter] * Try:
15:14:32.818 [ERROR] [org.gradle.BuildExceptionReporter] Run with --stacktrace option to get the stack trace.
15:14:32.819 [LIFECYCLE] [org.gradle.BuildResultLogger]
15:14:32.820 [LIFECYCLE] [org.gradle.BuildResultLogger] BUILD FAILED
15:14:32.821 [LIFECYCLE] [org.gradle.BuildResultLogger]
15:14:32.822 [LIFECYCLE] [org.gradle.BuildResultLogger] Total time: 3.922 secs
15:14:32.825 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on buildscript class cache for settings file '/home/thorsten/Downloads/gral-master/settings.gradle' (/home/>thorsten/.gradle/caches/2.3/scripts/settings_9sdx9cd1l1b5yi58opf1ubpx0/SettingsScript/buildscript).
15:14:32.826 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on no_buildscript class cache for settings file '/home/thorsten/Downloads/gral-master/settings.gradle' (/home/>thorsten/.gradle/caches/2.3/scripts/settings_9sdx9cd1l1b5yi58opf1ubpx0/SettingsScript/no_buildscript).
[...]
Add support for three-dimensional plots, e.g. 3d bar plot, 3d pie plot, or 3d scatter plot
When a new axis renderer (e.g. LinearRenderer2D
instead of LogarithmicRenderer2D
) is set on a plot in an InteractivePanel
, panning, zooming or resetting the view doesn't work correctly.
Imported from trac ticket 43, created by eseifert on 05-11-2011 at 17:26, last modified: 04-29-2013 at 19:47
Most text elements in GRAL are lacking a way to set a font.
Imported from trac ticket 39, created by eseifert on 04-24-2011 at 17:54, last modified: 04-24-2011 at 18:02
The statistics package in the gral core could need partial reworks and optimisations. This ticket is a summary for these tasks.
Imported from trac ticket 37, created by mseifert on 04-17-2011 at 13:18, last modified: 04-17-2011 at 13:28
Since r321 major ticks aren't drawn anymore although TICK
setting is enabled.
Add category support to axis instead of regular ticks.
Imported from trac ticket 2, created by eseifert on 05-23-2010 at 14:08, last modified: 01-20-2014 at 16:35
Review and simplify API by implementing more examples. Write tests were necessary.
Imported from trac ticket #8, created by eseifert on 05-23-2010 at 16:51, last modified: 01-24-2014 at 14:51
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.