Plotly és una llibreria per generar gràfics interactius amb JavaScript.
Introducció
Plotly.js és una llibreria que ens permet crear gràfics interactius.
L'usuari també pot interactuar amb aquests gràfics des del navegador, per obtenir informació addicional que seria més difícil presentar en una imatge fixe, i en general la experiència és més atractiva.
Pots consultar aquest projecte: https://gitlab.com/xtec/typescript/plotly
Entorn de treball
Hi ha dues formes de treballar amb Plotly.
La més clàssica és el projecte de Python Plotly Express
. Aquesta encara és prou comú degut a que va ser la primera que es va crear, i també perquè el seu ús resulta més senzill per a perfils professionals que no tenen prou coneixements de creació de desenvolupament web.
En canvi, a nosaltres com a especialistes en desenvolupament web ens interessa Plotly Javascript
.
Ens interessa delegar la creació del gràfic al client (al navegador, que usa Javascript), ja que pel servidor és molt costós dibuixar gràfics,
el servidor ja té prou feina gestionant grans volums de dades! 😀`
Entorn de treball
Crea un projecte react:
$ bun create vite plot --template react-swc-ts
Afegeix les dependències:
$ bun add plotly.js react-plotly.js
$ bun add --dev @types/plotly.js @types/react-plotly.js
Modifica el fitxer App.tsx
:
import Plot from 'react-plotly.js'
export default function App() {
const data = [
{
x: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
y: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
mode: "lines",
},
];
const layout = { title: "Chart Title" };
return <Plot data={data} layout={layout} />;
}
Ja tens el teu primer gràfic 😀 !
Atributs
Els gràfics "plotly.js" es descriuen de manera declarativa amb objectes JSON.
Per cada aspecte del gràfic (els colors, les quadrícules, les dades, etc.) tens un atribut JSON.
A l'hora de descriure el gràfic els atributs s'agrupen en dues categories:
-
traces
. Objectes que descriuen una única sèrie de dades en un gràfic -
layout
. Atributs que s'apliquen a la resta del gràfic, com ara el títol, l'eix o les anotacions.
Els "traces" es classifiquen per tipus de gràfic (per exemple, "scatter" o "heatmap").
També tens un altre atribut opcional de configuració: config
.
A continuació tens un exemple semblant a l'inicial:
import Plot from 'react-plotly.js'
export default function App() {
const data = [
{
x: [1999, 2000, 2001, 2002],
y: [10, 15, 13, 17],
},
];
const layout = {
xaxis: {
title: {
text: "Year"
}
},
yaxis: {
title: {
text: "Percent"
}
}
};
return <Plot data={data} layout={layout} />;
}
Com a altres llibreries, el tipus de gràfic predefinit és el de línies:
Tipus de gràfics.
En aquest enllaç tens tots els tipus de gràfics que pots utilitzar: https://plotly.com/javascript/
A continuació veurem alguns exemples.
Gràfic de barres
https://plotly.com/javascript/reference/bar/
Crea aquest gràfic de barres:
Dades
x: [1, 2, 3, 4]
y: [5, 10, 2, 8]
import Plot from 'react-plotly.js'
export default function App() {
const data = [
{
x: [1, 2, 3, 4],
y: [5, 10, 2, 8],
type: "bar",
},
]
const layout = {
title: {
text: "Diagrama de barres",
font: {
size: 40
}
}
}
return <Plot data={data} layout={layout} />;
}
També pots crear gràfics de barres apilades.
Aquí tens une exemple amb les dones i homes d'un estudi de l'Alzheimer que es realitzarà en diversos hospitals:
Dades
x: ['Bellvitge', 'Clinic', 'Vall Hebron', 'Del Mar']
y: [7, 10, 8, 12]
y: [8, 11, 6, 9]
import Plot from 'react-plotly.js'
export default function App() {
const data = [
{
type: 'bar',
x: ['Bellvitge', 'Clinic', 'Vall Hebron', 'Del Mar'],
y: [7, 10, 8, 12],
name: 'Homes'
},
{
type: 'bar',
x: ['Bellvitge', 'Clinic', 'Vall Hebron', 'Del Mar'],
y: [8, 11, 6, 9],
name: 'Dones'
}
]
const layout = {
title: {
text: 'Pacients estudi Alzheimer'
},
font: { size: 20 }
};
return <Plot data={data} layout={layout} />;
}
Box
https://plotly.com/javascript/reference/box/
Un dels gràfics més útils en estadística són els plotbox
o diagrames de caixes i cues.
Són tant útils com les corbes gaussianes.
Ens permeten veure a un cop d'ull mesures centrals i de dispersió d'una mostra.
Dades
x: [3, 4, 4, 4, 5, 6, 8, 8, 9, 10]
import Plot from 'react-plotly.js'
export default function App() {
const data = [
{
x: [3, 4, 4, 4, 5, 6, 8, 8, 9, 10],
type: 'box',
name: 'Set 1'
}
]
const layout = {
title: {
text: 'Horizontal Box Plot'
}
}
return <Plot data={data} layout={layout} />;
}
choropleth
https://plotly.com/javascript/tile-county-choropleth/
Plotly també destaca per ser una llibreria que et permet crear gràfics amb mapes
fàcilment.
Imaginem-nos que tenim les taxes d'atur 5 països d'Europa de l'agost del 2024.
const countries = ['Spain', 'France', 'Germany', 'Portugal', 'Italy'];
const unemp_rate = [11.5, 7.5, 3.5, 6.4, 6.2];
Doncs per dibuixar el codi és tant senzill com organitzar les dades al mapa de la següent manera.
- locationmode Atribut literal que permet definir la forma en la que informar els països. Els valors disponibles són:
ISO-3
,USA-states
icountry names
. - locations Llista de noms de països, en el format definit abans.
- z La informació numèrica de cada pais (taxa d'atur en el nostre cas)
- text El text de la llegenda que surt quan ens posem a sobre de cada país.
Aquí teniu més informació sobre els codis ISO-3
:
https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3
Aquesta solució només permet fer gràfics de països.
import Plot from 'react-plotly.js'
export default function App() {
const countries = ['Spain', 'France', 'Germany', 'Portugal', 'Italy']
const unemp_rate = [11.5, 7.5, 3.5, 6.4, 6.2]
const data = [{
type: 'choropleth',
locationmode: 'country names',
locations: countries,
z: unemp_rate,
text: countries,
autocolorscale: true
}]
const layout = {
title: { text: 'Taxa atur (agost 2024)' },
geo: {
scope: 'europe',
projection: { type: 'robinson' }
}
}
return <Plot data={data} layout={layout} />;
}
CSV
https://www.ine.es/dyngs/INEbase/listaoperaciones.htm
https://immunizationdata.who.int/global?topic=&location=
$ bun add papaparse
$ bun add --dev @types/papaparse
- https://www.ine.es/prodyser/microdatos.htm
- https://typescript.tv/hands-on/parsing-csv-files-in-typescript-with-papa-parse/
- https://www.basedash.com/blog/how-to-use-papaparse-with-typescript
- https://www.escuelafrontend.com/data-fetching-con-react
Functions
https://plotly.com/javascript/plotlyjs-function-reference/
TODO
- https://plotly.com/javascript/reference/index/
- https://plotly.com/javascript/react/
- https://open-innovations.org/data/geojson.html
- https://docs.google.com/document/d/1u90XI23NT6qDCb28IIsuUcKAUt_8XNgYe_lKSiT2Zfk
- https://dmitripavlutin.com/javascript-fetch-async-await/
- https://dev.to/colocodes/how-to-debug-a-react-app-51l4
- https://blog.tericcabrel.com/read-csv-node-typescript/
- https://medium.com/@bhanu.mt.1501/api-calls-in-react-js-342a09d5315f
- https://www.c-sharpcorner.com/article/how-to-pretty-print-json-with-reactjs/
- https://www.escuelafrontend.com/data-fetching-con-react