Skip to content
Snippets Groups Projects
README.md 12.6 KiB
Newer Older
## [![XChart](https://raw.githubusercontent.com/timmolter/XChart/develop/etc/XChart_64_64.png)](http://knowm.org/open-source/xchart) XChart
Tim Molter's avatar
Tim Molter committed
XChart is a light weight Java library for plotting data.
Tim Molter's avatar
Tim Molter committed

Tim Molter's avatar
Tim Molter committed
## Description
Tim Molter's avatar
Tim Molter committed
XChart is a light-weight and convenient library for plotting data designed to go from data to chart in the least amount of time possible and to take the guess-work out of customizing the chart style.
timmolter's avatar
timmolter committed

Tim Molter's avatar
Tim Molter committed
## Simplest Example
Tim Molter's avatar
Tim Molter committed

Tim Molter's avatar
Tim Molter committed
Create a `XYChart` instance via `QuickChart`, add a series of data to it, and either display it or save it as a bitmap.  
Tim Molter's avatar
Tim Molter committed
```java

Tim Molter's avatar
Tim Molter committed
    double[] xData = new double[] { 0.0, 1.0, 2.0 };
    double[] yData = new double[] { 2.0, 1.0, 0.0 };
Tim Molter's avatar
Tim Molter committed
    // Create Chart
Tim Molter's avatar
Tim Molter committed
    XYChart chart = QuickChart.getChart("Sample Chart", "X", "Y", "y(x)", xData, yData);
Tim Molter's avatar
Tim Molter committed

    // Show it
    new SwingWrapper(chart).displayChart();

    // Save it
Tim Molter's avatar
Tim Molter committed
    BitmapEncoder.saveBitmap(chart, "./Sample_Chart", BitmapFormat.PNG);
Tim Molter's avatar
Tim Molter committed

Tim Molter's avatar
Tim Molter committed
    // or save it in high-res
Tim Molter's avatar
Tim Molter committed
    BitmapEncoder.saveBitmapWithDPI(chart, "./Sample_Chart_300_DPI", BitmapFormat.PNG, 300);
Tim Molter's avatar
Tim Molter committed
```
Tim Molter's avatar
Tim Molter committed

Tim Molter's avatar
Tim Molter committed
![](https://raw.githubusercontent.com/timmolter/XChart/develop/etc/XChart_Simplest.png)

Tim Molter's avatar
Tim Molter committed
Create a `XYChart` via a `XYChartBuilder`, style chart, add a series to it, style series, and display chart.
    XYChart chart = new XYChartBuilder().width(600).height(500).title("Gaussian Blobs").xAxisTitle("X").yAxisTitle("Y").build();

    // Customize Chart
    chart.getStyler().setDefaultSeriesRenderStyle(ChartXYSeriesRenderStyle.Scatter);
    chart.getStyler().setChartTitleVisible(false);
    chart.getStyler().setLegendPosition(LegendPosition.InsideSW);
    chart.getStyler().setMarkerSize(16);

    // Series
    chart.addSeries("Gaussian Blob 1", getGaussian(1000, 1, 10), getGaussian(1000, 1, 10));
    XYSeries series = chart.addSeries("Gaussian Blob 2", getGaussian(1000, 1, 10), getGaussian(1000, 0, 5));
    series.setMarker(SeriesMarkers.DIAMOND);

    new SwingWrapper(chart).displayChart();
```

![](https://raw.githubusercontent.com/timmolter/XChart/develop/etc/XChart_Intermediate.png)

## Advanced Example

Tim Molter's avatar
Tim Molter committed
Create a `XYChart` via a `XYChartBuilder`, style chart, add a series to it, add chart to `XChartPanel`, embed in Java Swing App, and display GUI.
    final XYChart chart = new XYChartBuilder().width(600).height(400).title("Area Chart").xAxisTitle("X").yAxisTitle("Y").build();

    // Customize Chart
    chart.getStyler().setLegendPosition(LegendPosition.InsideNE);
    chart.getStyler().setDefaultSeriesRenderStyle(XYSeriesRenderStyle.Area);

    // Series
    chart.addSeries("a", new double[] { 0, 3, 5, 7, 9 }, new double[] { -3, 5, 9, 6, 5 });
    chart.addSeries("b", new double[] { 0, 2, 4, 6, 9 }, new double[] { -1, 6, 4, 0, 4 });
    chart.addSeries("c", new double[] { 0, 1, 3, 8, 9 }, new double[] { -2, -1, 1, 0, 1 });

    // Schedule a job for the event-dispatching thread:
    // creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {

      @Override
      public void run() {

        // Create and set up the window.
        JFrame frame = new JFrame("Advanced Example");
        frame.setLayout(new BorderLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // chart
        JPanel chartPanel = new XChartPanel<XYChart>(chart);
        frame.add(chartPanel, BorderLayout.CENTER);
        // label
        JLabel label = new JLabel("Blah blah blah.", SwingConstants.CENTER);
        frame.add(label, BorderLayout.SOUTH);

        // Display the window.
        frame.pack();
        frame.setVisible(true);
      }
    });
```

![](https://raw.githubusercontent.com/timmolter/XChart/develop/etc/XChart_Advanced.png)

To make it real-time, simply call `updateXYSeries` on the `XYChart` instance to update the series data, followed by `revalidate()` and `repaint()` on the `XChartPanel` instance to repaint.
Tim Molter's avatar
Tim Molter committed

Tim Molter's avatar
Tim Molter committed
## Features
Tim Molter's avatar
Tim Molter committed

* [x] No required additional dependencies
Tim Molter's avatar
Tim Molter committed
* [x] ~179KB Jar
Tim Molter's avatar
Tim Molter committed
* [x] Line charts
* [x] Scatter charts
* [x] Area charts
* [x] Bar charts
* [x] Histogram charts
Tim Molter's avatar
Tim Molter committed
* [x] Pie charts
* [x] Donut charts
* [x] Bubble charts
Tim Molter's avatar
Tim Molter committed
* [x] Stick charts
Tim Molter's avatar
Tim Molter committed
* [x] Error bars
* [x] Logarithmic axes
* [x] Number, Date, Bubble and Category X-Axis
Tim Molter's avatar
Tim Molter committed
* [x] Multiple series
* [x] Extensive customization
Tim Molter's avatar
Tim Molter committed
* [x] Themes - XChart, GGPlot2, Matlab
Tim Molter's avatar
Tim Molter committed
* [x] Right-click, Save-As...
* [x] User-defined axes range
* [x] Custom legend placement
* [x] CSV import and export
* [x] High resolution chart export
Tim Molter's avatar
Tim Molter committed
* [x] Export as PNG, JPG, BMP, GIF with custom DPI setting
Tim Molter's avatar
Tim Molter committed
* [x] Export SVG, EPS and PDF using optional `de.erichseifert.vectorgraphics2d` library
Tim Molter's avatar
Tim Molter committed
* [x] Real-time charts
* [x] Java 6 and up
Tim Molter's avatar
Tim Molter committed

Tim Molter's avatar
Tim Molter committed
## Chart Types

Currently, there are three major chart types: `XYChart`, `CategoryChart` and `PieChart`. Each type has its corresponding `ChartBuilder`, `Styler` and `Series`.
Tim Molter's avatar
Tim Molter committed

| Chart Type | Builder | Styler | Series | Allowed X-Axis Data Types | Default Series Render Style |
|---|---|---|---|---|---|
| XYChart | XYChartBuilder | XYStyler | XYSeries | Number, Date | Line |
| CategoryChart | CategoryChartBuilder | CategoryStyler | CategorySeries | Number, Date, String | Bar |
Tim Molter's avatar
Tim Molter committed
| PieChart | PieChartBuilder | PieStyler | PieSeries | String | Pie |
Tim Molter's avatar
Tim Molter committed
| BubbleChart | BubbleChartBuilder | BubbleStyler | BubbleSeries | Number, Date  | Round |
Tim Molter's avatar
Tim Molter committed

The different Stylers contain chart styling methods specific to the corresponding chart type as well as common styling methods common across all chart types.

### XYChart
![](https://raw.githubusercontent.com/timmolter/XChart/develop/etc/XYChart.png)
`XYChart` charts take Date or Number data types for the X-Axis and Number data types for the Y-Axis. For both axes, the tick marks are auto generated to span the range and domain of the data in evenly-spaced intervals. 
Tim Molter's avatar
Tim Molter committed

Series render styles include: `Line`, `Scatter` and `Area`.

### CategoryChart 
![](https://raw.githubusercontent.com/timmolter/XChart/develop/etc/CategoryChart.png)
`CategoryChart` charts take Date, Number or String data types for the X-Axis and Number data types for the Y-Axis. For the X-Axis, each category is given its own tick mark.  
Tim Molter's avatar
Tim Molter committed

Series render styles include: `Bar`, `Line`, `Scatter`, `Area` and `Stick`.

### PieChart
![](https://raw.githubusercontent.com/timmolter/XChart/develop/etc/PieChart.png)
`PieChart` charts take String data types for the pie slice name and Number data types for the pie slice value.  
Tim Molter's avatar
Tim Molter committed
Series render styles include: `Pie` and `Donut`.

### BubbleChart

Tim Molter's avatar
Tim Molter committed
![](https://raw.githubusercontent.com/timmolter/XChart/develop/etc/XChart_Bubble_Chart.png)
Tim Molter's avatar
Tim Molter committed
`BubbleChart` charts take Date or Number data types for the X-Axis and Number data types for the Y-Axis and bubble sizes. 
Tim Molter's avatar
Tim Molter committed

Series render styles include: `Round` and in the near future `Square`.
Tim Molter's avatar
Tim Molter committed
## Real-time Java Charts using XChart

![](https://raw.githubusercontent.com/timmolter/XChart/develop/etc/XChart_SimpleRealtime.gif)
Tim Molter's avatar
Tim Molter committed

Creating real-time charts is as simple as calling `updateXYSeries` for one or more series objects through the `XYChart` instance and triggering a redraw of the `JPanel` containing the chart. This works for all chart types including `XYChart`, `CategoryChart`, `BubbleChart` and `PieChart`, for which example source code can be found here: <https://github.com/timmolter/XChart/tree/develop/xchart-demo/src/main/java/org/knowm/xchart/demo/charts/realtime>. Examples demonstrate using the `SwingWrapper` with `repaintChart()` method as well as `XChartPanel` with `revalidate()` and `repaint()`. 

The following sample code used to generate the above real-time chart can be found [here](https://github.com/timmolter/XChart/blob/develop/xchart-demo/src/main/java/org/knowm/xchart/standalone/SimpleRealTime.java).

```java
public class SimpleRealTime {

  public static void main(String[] args) throws Exception {

    double phase = 0;
    double[][] initdata = getSineData(phase);

    // Create Chart
    final XYChart chart = QuickChart.getChart("Simple XChart Real-time Demo", "Radians", "Sine", "sine", initdata[0], initdata[1]);

    // Show it
    final SwingWrapper<XYChart> sw = new SwingWrapper<XYChart>(chart);
    sw.displayChart();

    while (true) {

      phase += 2 * Math.PI * 2 / 20.0;

      Thread.sleep(100);

      final double[][] data = getSineData(phase);

      javax.swing.SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {

          chart.updateXYSeries("sine", data[0], data[1], null);
          sw.repaintChart();
        }
      });
    }

  }

  private static double[][] getSineData(double phase) {

    double[] xData = new double[100];
    double[] yData = new double[100];
    for (int i = 0; i < xData.length; i++) {
      double radians = phase + (2 * Math.PI / xData.length * i);
      xData[i] = radians;
      yData[i] = Math.sin(radians);
    }
    return new double[][] { xData, yData };
  }
}
```
Tim Molter's avatar
Tim Molter committed

Tim Molter's avatar
Tim Molter committed
## Chart Customization

All the styling options can be found in one of two possible places: 1) the Chart's `Styler` or 2) the series' `set` methods. With this chart customization design, all customization options can be quickly "discovered" using an IDE's built in "Content Assist". With centralized styling like this, there is no need to hunt around the entire charting API to find that one customization you're looking for - it's all right in one spot!

![](https://raw.githubusercontent.com/timmolter/XChart/develop/etc/XChart_Chart_Customization.png)
 
![](https://raw.githubusercontent.com/timmolter/XChart/develop/etc/XChart_Series_Customization.png)
 
## Chart Themes

XChart ships with three different themes: Default `XChart`, `GGPlot2` and `Matlab`. Using a different theme is as simple as setting the Chart's theme with the `theme` method of the `ChartBuilder`.

    XYChart chart = new XYChartBuilder().width(800).height(600).theme(ChartTheme.Matlab).build();
Tim Molter's avatar
Tim Molter committed

![](https://raw.githubusercontent.com/timmolter/XChart/develop/etc/XChart_Themes.png)

Tim Molter's avatar
Tim Molter committed
## What's Next?

Now go ahead and [study some more examples](http://knowm.org/open-source/xchart/xchart-example-code/), [download the thing](http://knowm.org/open-source/xchart/xchart-change-log) and [provide feedback](https://github.com/timmolter/XChart/issues).
Tim Molter's avatar
Tim Molter committed
## Getting Started
Tim Molter's avatar
Tim Molter committed
### Non-Maven
Download Jar: http://knowm.org/open-source/xchart/xchart-change-log
timmolter's avatar
timmolter committed

Tim Molter's avatar
Tim Molter committed
### Maven
Tim Molter's avatar
Tim Molter committed
The XChart release artifacts are hosted on Maven Central.
Tim Molter's avatar
Tim Molter committed

Tim Molter's avatar
Tim Molter committed
Add the XChart library as a dependency to your pom.xml file:
timmolter's avatar
timmolter committed

Tim Molter's avatar
Tim Molter committed
```xml
timmolter's avatar
timmolter committed
    <dependency>
        <groupId>org.knowm.xchart</groupId>
Tim Molter's avatar
Tim Molter committed
        <artifactId>xchart</artifactId>
        <version>3.2.0</version>
timmolter's avatar
timmolter committed
    </dependency>
Tim Molter's avatar
Tim Molter committed
```
Tim Molter's avatar
Tim Molter committed
For snapshots, add the following to your pom.xml file:
Tim Molter's avatar
Tim Molter committed

Tim Molter's avatar
Tim Molter committed
```xml
Tim Molter's avatar
Tim Molter committed
    <repository>
Tim Molter's avatar
Tim Molter committed
      <id>sonatype-oss-snapshot</id>
Tim Molter's avatar
Tim Molter committed
      <snapshots/>
      <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    </repository>
Tim Molter's avatar
Tim Molter committed
    <dependency>
      <groupId>org.knowm.xchart</groupId>
Tim Molter's avatar
Tim Molter committed
      <artifactId>xchart</artifactId>
      <version>3.2.1-SNAPSHOT</version>
Tim Molter's avatar
Tim Molter committed
    </dependency>
Tim Molter's avatar
Tim Molter committed
```
Tim Molter's avatar
Tim Molter committed
Snapshots can be manually downloaded from Sonatyope: [https://oss.sonatype.org/content/groups/public/org/knowm/xchart/xchart/](https://oss.sonatype.org/content/groups/public/org/knowm/xchart/xchart/)
Tim Molter's avatar
Tim Molter committed

### SBT

To use XChart with the Scala Build Tool (SBT) add the following to your build.sbt

```scala
libraryDependencies += "org.knowm.xchart" % "xchart" % "3.2.0" exclude("de.erichseifert.vectorgraphics2d", "VectorGraphics2D") withSources()
Tim Molter's avatar
Tim Molter committed
## Building

#### general

    mvn clean package  
Tim Molter's avatar
Tim Molter committed
    mvn javadoc:aggregate  

#### maven-license-plugin

    mvn license:check
    mvn license:format
    mvn license:remove
Tim Molter's avatar
Tim Molter committed

## Running Demo
Tim Molter's avatar
Tim Molter committed
    cd /path/to/xchart-demo/jar/
    java -cp xchart-demo-3.2.0.jar:xchart-3.2.0.jar org.knowm.xchart.demo.XChartDemo
Tim Molter's avatar
Tim Molter committed

![](https://raw.githubusercontent.com/timmolter/XChart/develop/etc/XChart_Demo.png)

Tim Molter's avatar
Tim Molter committed
## Bugs
Tim Molter's avatar
Tim Molter committed
Please report any bugs or submit feature requests to [XChart's Github issue tracker](https://github.com/timmolter/XChart/issues).  
Tim Molter's avatar
Tim Molter committed

Tim Molter's avatar
Tim Molter committed
## Continuous Integration
[![Build Status](https://travis-ci.org/timmolter/XChart.png?branch=develop)](https://travis-ci.org/timmolter/XChart.png)  
Tim Molter's avatar
Tim Molter committed
[Build History](https://travis-ci.org/timmolter/XChart/builds)  
Tim Molter's avatar
Tim Molter committed

## Donations

Donate with Bitcoin: [1JVyTP9v9z54dALuhDTZDQfS6FUjcKjPgZ](https://blockchain.info/address/1JVyTP9v9z54dALuhDTZDQfS6FUjcKjPgZ)

All donations will be used to pay bounties for new features, refactoring, etc. Please consider donating or even posting your own bounties on our [Issues Page](https://github.com/timmolter/xchart/issues?state=open). Open bounties and bounties paid thus far can be found on Knowm's [bounties](http://knowm.org/open-source/) page.
Tim Molter's avatar
Tim Molter committed

## Release Information

We will announce new releases on our [Twitter page](https://twitter.com/Knowmorg).