Usando PlotlyJS Wraper
Usando PlotlyJS Wraper
El Plotly Java Wrapper es una biblioteca no oficial que facilita la creación de gráficos de
Plotly en Java al generar archivos HTML de manera programática. Aunque el gráfico no se
muestra directamente en la interfaz de usuario de la aplicación de escritorio, puedes abrir el
archivo HTML en un navegador embebido (como JavaFX WebView o JxBrowser) o un
navegador externo.
Aquí tienes un ejemplo paso a paso de cómo usar el Plotly Java Wrapper para generar un
gráfico sencillo de barras en Java:
<dependency>
<groupId>tech.tablesaw</groupId>
<artifactId>tablesaw-jsplot</artifactId>
<version>0.38.2</version>
</dependency>
Nota: Esta biblioteca está basada en Tablesaw, que integra Plotly para visualización en aplicaciones
Java.
Aquí hay un ejemplo de código para crear un gráfico de barras usando Plotly Java Wrapper
y guardarlo como un archivo HTML.
import tech.tablesaw.api.Table;
import tech.tablesaw.plotly.Plot;
import tech.tablesaw.plotly.api.BarPlot;
import tech.tablesaw.plotly.components.Figure;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
try {
.addColumns(
tech.tablesaw.api.StringColumn.create("País", countries),
);
saveFigureAsHtml(figure, outputFilePath);
} catch (IOException e) {
e.printStackTrace();
}
private static void saveFigureAsHtml(Figure figure, String filePath) throws IOException {
writer.write(Plot.show(figure).html());
Este código:
Después de ejecutar este código, deberías tener un archivo HTML con el gráfico de barras.
Puedes abrirlo en un navegador para ver el gráfico o usar un visor web embebido en Java
(como WebView en JavaFX).
Para mostrar el archivo HTML generado en una aplicación de escritorio, usa JavaFX
WebView:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import java.io.File;
public class DisplayChartApp extends Application {
@Override
webEngine.load(file.toURI().toString());
stage.setScene(scene);
stage.show();
launch(args);
Aquí tienes un ejemplo donde creamos dos gráficos con Tablesaw y Plotly, los
combinamos en un archivo HTML y los insertamos usando asJavaScript().
<dependency>
<groupId>tech.tablesaw</groupId>
<artifactId>tablesaw-jsplot</artifactId>
<version>0.38.2</version>
</dependency>
Aquí, vamos a:
import tech.tablesaw.api.Table;
import tech.tablesaw.plotly.Plot;
import tech.tablesaw.plotly.api.BarPlot;
import tech.tablesaw.plotly.components.Figure;
import java.io.FileWriter;
import java.io.IOException;
try {
int[] gdp = {21137, 1736, 2829, 3846, 2707}; // PIB en miles de millones de USD
.addColumns(
tech.tablesaw.api.StringColumn.create("País", countries),
);
.addColumns(
tech.tablesaw.api.StringColumn.create("País", countries),
);
Figure gdpFigure = BarPlot.create("PIB por País", data2, "País", "PIB (miles de millones de
USD)");
// Obtener los scripts JavaScript de los gráficos
createMultiPlotHtml(populationJs, gdpJs);
} catch (IOException e) {
e.printStackTrace();
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>MultiPlot Example</title>
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
</head>
<body>
%s
%s
</script>
</body>
</html>
""".formatted(populationJs, gdpJs);
writer.write(htmlContent);
1. Preparación de Datos: Creamos dos conjuntos de datos (uno para población y otro
para PIB) y los almacenamos en tablas Tablesaw.
2. Creación de Gráficos: Generamos un gráfico de barras para la población y otro
para el PIB.
3. Exportación a JavaScript: Usamos asJavascript("elementId") para cada
gráfico. Este método genera el código JavaScript necesario para dibujar los gráficos
en un div específico de la página HTML.
4. Generación del HTML: Creamos el HTML principal, que incluye:
o Un script para cargar Plotly.js desde un CDN.
o Dos elementos <div> (populationPlot y gdpPlot) donde se mostrarán los
gráficos.
o Un script de JavaScript que incluye los códigos generados con
asJavaScript() para mostrar ambos gráficos en la misma página.
Resultado
Para generar la página web con los gráficos usando un Servlet en Java, ajustaremos el
código para crear una clase servlet que genere el contenido HTML dinámicamente y lo
envíe al navegador del cliente.
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>tech.tablesaw</groupId>
<artifactId>tablesaw-jsplot</artifactId>
<version>0.38.2</version>
</dependency>
</dependencies>
El siguiente código crea un servlet que genera dos gráficos (población y PIB) y los incluye
en la respuesta HTML usando asJavaScript().
import tech.tablesaw.api.Table;
import tech.tablesaw.plotly.Plot;
import tech.tablesaw.plotly.api.BarPlot;
import tech.tablesaw.plotly.components.Figure;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/multiPlotServlet")
@Override
response.setContentType("text/html");
out.println("""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>MultiPlot Example</title>
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
</head>
<body>
<script>
%s
%s
</script>
</body>
</html>
""".formatted(populationJs, gdpJs));
.addColumns(
tech.tablesaw.api.StringColumn.create("País", countries),
return Plot.show(figure).asJavascript("populationPlot");
.addColumns(
tech.tablesaw.api.StringColumn.create("País", countries),
);
Figure figure = BarPlot.create("PIB por País", data, "País", "PIB (miles de millones de USD)");
return Plot.show(figure).asJavascript("gdpPlot");
Esto debería mostrar la página generada dinámicamente con ambos gráficos de Plotly.js
embebidos, renderizados mediante JavaScript.