Skip to content

Commit 115e3d8

Browse files
committed
Add IOPlugin to save AbstractPlot as SVG
1 parent a283f3f commit 115e3d8

3 files changed

Lines changed: 118 additions & 0 deletions

File tree

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@
128128
<groupId>org.jfree</groupId>
129129
<artifactId>jfreechart</artifactId>
130130
</dependency>
131+
<dependency>
132+
<groupId>org.jfree</groupId>
133+
<artifactId>jfreesvg</artifactId>
134+
<version>3.2</version>
135+
</dependency>
131136
<dependency>
132137
<groupId>net.imglib2</groupId>
133138
<artifactId>imglib2-ij</artifactId>
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package net.imagej.plot.io;
2+
3+
import net.imagej.plot.AbstractPlot;
4+
import org.jfree.chart.JFreeChart;
5+
import org.jfree.graphics2d.svg.SVGGraphics2D;
6+
import org.jfree.graphics2d.svg.SVGUtils;
7+
import org.scijava.convert.ConvertService;
8+
import org.scijava.io.AbstractIOPlugin;
9+
import org.scijava.io.IOPlugin;
10+
import org.scijava.plugin.Parameter;
11+
import org.scijava.plugin.Plugin;
12+
13+
import java.awt.*;
14+
import java.io.File;
15+
import java.io.IOException;
16+
17+
/**
18+
* Plugin that can write {@link AbstractPlot} as SVG file.
19+
*
20+
* @author Matthias Arzt
21+
*/
22+
@Plugin(type = IOPlugin.class)
23+
public class AbstractPlotSvgIOPlugin extends AbstractIOPlugin<AbstractPlot> {
24+
25+
@Parameter
26+
ConvertService convertService;
27+
28+
@Override
29+
public boolean supportsOpen(String source) {
30+
return false;
31+
}
32+
33+
@Override
34+
public boolean supportsSave(String destination) {
35+
return destination.endsWith(".svg");
36+
}
37+
38+
@Override
39+
public boolean supportsSave(Object data, String destination) {
40+
return supportsSave(destination) &&
41+
data instanceof AbstractPlot &&
42+
convertService.supports(data, JFreeChart.class);
43+
}
44+
45+
@Override
46+
public AbstractPlot open(String source) throws IOException {
47+
throw new UnsupportedOperationException();
48+
}
49+
50+
@Override
51+
public void save(AbstractPlot data, String destination) throws IOException {
52+
if(!supportsSave(data, destination))
53+
throw new IllegalArgumentException();
54+
JFreeChart chart = convertService.convert(data, JFreeChart.class);
55+
SVGGraphics2D g = new SVGGraphics2D(data.getPreferredWidth(), data.getPreferredWidth());
56+
chart.draw(g, new Rectangle(0, 0, g.getWidth(), g.getHeight()));
57+
SVGUtils.writeToSVG(new File(destination), g.getSVGElement());
58+
}
59+
60+
@Override
61+
public Class<AbstractPlot> getDataType() {
62+
return AbstractPlot.class;
63+
}
64+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package net.imagej.plot;
2+
3+
import org.scijava.Context;
4+
import org.scijava.io.IOService;
5+
import org.scijava.plugin.Parameter;
6+
7+
import java.io.IOException;
8+
import java.nio.file.Path;
9+
import java.nio.file.Paths;
10+
import java.util.List;
11+
import java.util.stream.Collectors;
12+
import java.util.stream.IntStream;
13+
14+
/**
15+
* @author
16+
*/
17+
public class PlotToSvgDemo {
18+
19+
@Parameter
20+
private PlotService plotService;
21+
22+
@Parameter
23+
private IOService ioService;
24+
25+
public static void main(String... args) throws IOException {
26+
PlotToSvgDemo demo = new PlotToSvgDemo();
27+
new Context().inject(demo);
28+
demo.run();
29+
}
30+
31+
private void run() throws IOException {
32+
Path path = Paths.get(System.getProperty("user.home"), "chart.svg");
33+
AbstractPlot plot = getExamplePlot();
34+
ioService.save(plot, path.toString());
35+
}
36+
37+
private AbstractPlot getExamplePlot() {
38+
XYPlot plot = plotService.newXYPlot();
39+
plot.setTitle("Hello World!");
40+
plot.xAxis().setLabel("x");
41+
plot.yAxis().setLabel("y");
42+
List<Double> xs = IntStream.rangeClosed(0, 100).mapToObj(x -> (double) x * 2. * Math.PI / 100.).collect(Collectors.toList());
43+
List<Double> ys = xs.stream().map(Math::sin).collect(Collectors.toList());
44+
XYSeries series = plot.addXYSeries();
45+
series.setLabel("y = sin(x)");
46+
series.setValues( xs, ys );
47+
return plot;
48+
}
49+
}

0 commit comments

Comments
 (0)