ggsql - Une grammaire graphique pour SQL
(opensource.posit.co)- Outil de visualisation fondé sur la syntaxe SQL, qui combine en un seul flux l’interrogation des données et la construction de graphiques via des clauses comme
VISUALIZE,DRAW,PLACE,SCALEetLABEL - Permet d’associer des colonnes à des propriétés visuelles et de composer, par assemblage de couches, des nuages de points, diagrammes en barres, histogrammes, boxplots et éléments d’annotation dans une même structure
- Transmet directement les résultats de requêtes SQL comme entrée de visualisation, et certaines couches récupèrent uniquement des agrégats via une seule exécution de requête SQL, ce qui favorise le traitement de grands volumes de données
- Conçu comme un exécutable compact et ciblé utilisable sans runtime R ou Python, ce qui le rend adapté à l’intégration avec des outils de reporting orientés code et des assistants d’analyse IA
- La version actuelle est une alpha-release, avec des extensions prévues comme un writer haute performance, des thèmes, l’interactivité, un language server, un formatter et la prise en charge des données spatiales
Présentation de ggsql
- ggsql est une implémentation de la grammar of graphics fondée sur la syntaxe SQL, qui ajoute à SQL des capacités de visualisation structurées
- Utilisable dans Quarto, les notebooks Jupyter, Positron, VS Code, etc.
- Conçu pour permettre aux utilisateurs SQL d’écrire du code de visualisation d’une manière familière
- La structure déclarative et composable des clauses SQL est appliquée aussi à la grammaire de visualisation
- Présente les motivations et des exemples d’usage, tout en développant la syntaxe centrale de ggsql
Exemples de base
-
Premier graphique
- Il est possible de créer un nuage de points avec le jeu de données intégré
penguinsVISUALIZE bill_len AS x, bill_dep AS y FROM ggsql:penguinsDRAW point
- Dans
VISUALIZE, les colonnes de données sont associées à des propriétés visuelles, etDRAW pointcrée une couche de points à partir de cette association de base - Le simple ajout de
species AS colorpermet d’appliquer une distinction par catégories de couleurVISUALIZE bill_len AS x, bill_dep AS y, species AS color FROM ggsql:penguinsDRAW point
- L’ajout de
DRAW smoothpermet de superposer une couche de régression au-dessus de la couche de points- L’association de couleur par espèce est conservée, ce qui génère une ligne distincte pour chaque espèce
- L’approche adopte une composition de composants modulaires plutôt qu’un type de graphique prédéfini
- Il est possible de basculer vers une visualisation totalement différente tout en conservant la même structure
VISUALIZE island AS x, species AS color FROM ggsql:penguinsDRAW bar
- Il est possible de créer un nuage de points avec le jeu de données intégré
-
Exemple complet
- La partie supérieure correspond à une requête SQL classique, et la partie après
VISUALIZEà une requête de visualisation- Dans l’exemple, le backend utilisé est DuckDB
- La partie SQL utilise
astronauts.parquet, avecROW_NUMBER()etQUALIFY, pour ne conserver que la mission la plus récente pour chaque nom - Les deux ensembles sont ensuite combinés
year_of_selection - year_of_birthest calculé commeage, avec l’attribution de la catégorieAge at selectionyear_of_mission - year_of_birthest calculé commeage, avec l’attribution de la catégorieAge at mission- Les deux résultats sont fusionnés avec
UNION ALL
- Dans la requête de visualisation,
age AS xetcategory AS fillsont associés avant d’utiliserDRAW histogramSETTING binwidth => 1, position => 'identity'est spécifié
PLACE ruleajoute une annotation à la position moyenne précalculéex => (34, 44),linetype => 'dotted'
PLACE textajoute des annotations textuellesx => (34, 44, 60)y => (66, 49, 20)- Les libellés incluent
Mean age at selection = 34,Mean age at mission = 44,John Glenn was 77 on his last mission - the oldest person to travel in space! hjust => 'left',vjust => 'top',offset => (10, 0)sont spécifiés
SCALE fill TO accentconvertit les valeurs associées àfillvers la palette de couleursaccent- La clause
LABELcontrôle le titre, le sous-titre, le libellé de l’axe x et celui de la légende- Titre :
How old are astronauts on their most recent mission? - Sous-titre :
Age of astronauts when they were selected and when they were sent on their mission - Axe x :
Age of astronaut (years) fill => null
- Titre :
- La partie supérieure correspond à une requête SQL classique, et la partie après
Structure d’une requête de visualisation
- Avant
VISUALIZE, il s’agit de SQL pur, et la table de résultat n’est pas renvoyée sous forme tabulaire mais transmise directement comme entrée de visualisation - Les tables ou CTE créées dans la partie SQL peuvent être référencées dans la requête de visualisation
- Si les données sont déjà sous une forme adaptée à la visualisation, la partie SQL peut être omise
VISUALIZE year_of_selection AS x, year_of_mission AS y FROM 'astronauts.parquet'
VISUALIZEouVISUALISEmarque la fin de la requête SQL et le début de la requête de visualisation- Les associations relient les colonnes à des propriétés visuelles, c’est-à-dire aux aesthetics
- Dans l’exemple,
agecorrespond à la position sur l’axe x etcategoryà la couleur de remplissage
- Dans l’exemple,
DRAWajoute une couche à la visualisation- Il existe des types simples comme
point, et d’autres commehistogramqui nécessitent des calculs d’agrégation par intervalles - Les couches sont rendues dans l’ordre où elles sont définies
- Il existe des types simples comme
PLACEest une clause sœur deDRAW, dédiée aux annotations, qui utilise des valeurs littérales au lieu de données tabulaires- La visualisation d’exemple se compose de trois couches : une couche d’histogramme, une couche d’annotation par ligne de repère et une couche d’annotation textuelle
- Une couche ne correspond pas nécessairement à un seul objet graphique, et peut rendre plusieurs objets individuels du même type
SCALEest une clause qui convertit les valeurs de données vers des valeurs adaptées à l’aesthetic- Au-delà de la conversion de catégories textuelles en couleurs réelles, elle permet aussi des transformations continues, la définition de breakpoints et la configuration de types d’échelle comme ordinal ou binned
LABELpermet d’ajouter et de modifier des libellés textuels, comme le titre, le sous-titre, les titres d’axes ou de légende
Prendre un peu de recul
- L’exemple ci-dessus contient beaucoup de syntaxe, mais couvre en une seule fois les éléments importants de la grammaire centrale
- De nombreuses requêtes de visualisation peuvent être bien plus simples
- Un exemple de boxplot par sexe pour l’année de naissance est présenté avec
astronauts.parquetVISUALIZE sex AS x, year_of_birth AS y FROM 'astronauts.parquet'DRAW boxplot
- Le code peut être plus long que dans d’autres systèmes de tracé, mais il possède un caractère plus structuré, composable et auto-descriptif
- Ces caractéristiques facilitent l’appropriation du comportement de tous types de graphiques par les utilisateurs, et sont aussi avantageuses pour les futurs assistants de codage LLM
- Il est facile de transformer la même relation en nuage de points avec jitter
DRAW pointSETTING position => 'jitter'
- Il est possible de faire en sorte que le jitter suive la distribution des données pour lui donner le caractère d’un violin plot
SETTING position => 'jitter', distribution => 'density'
- Cette structure syntaxique et cette composabilité facilitent les itérations en analyse exploratoire et en conception de visualisations
Pourquoi ggsql
- Cinq raisons sont avancées pour expliquer le développement de ggsql
- Soutenir les analystes de données et data scientists qui travaillent principalement en SQL
- La forte compatibilité entre SQL et la grammar of graphics
- Construire un outil de visualisation puissant orienté code sans dépendre d’un langage de programmation complet comme R ou Python
- Les excellentes capacités des LLM avec SQL et les possibilités de nouvelles interfaces de visualisation
- Appliquer 18 années d’expérience de développement de ggplot2 sur de nouvelles bases
-
Bonjour, utilisateur SQL
- Pendant que R et Python attiraient l’attention durant la révolution de la data science, SQL a continué de jouer le rôle de socle fiable pour le travail sur les données
- De nombreux professionnels de la donnée utilisent exclusivement SQL, ou principalement SQL
- Pour eux, les options de visualisation existantes sont jugées globalement sous-optimales selon le texte
- Exporter les données pour utiliser R ou Python
- Utiliser des outils BI à interface graphique qui prennent mal en charge la reproductibilité
- Utiliser des outils de visualisation directement dans les requêtes, mais jugés insuffisamment puissants ou ergonomiques
- La syntaxe de ggsql est conçue pour être immédiatement compréhensible par un utilisateur SQL
- Elle exploite les attentes liées à des clauses composables et déclaratives
- ggsql ne vise pas seulement à améliorer la visualisation, mais aussi à attirer les utilisateurs SQL vers l’écosystème de création et de partage de rapports orientés code basé sur Quarto
-
Transformation déclarative des données, visualisation déclarative
- SQL est un langage spécialisé pour manipuler des données relationnelles stockées dans une ou plusieurs tables
- Sa syntaxe repose sur les concepts de l’algèbre relationnelle et offre une manière structurée de penser la manipulation des données
- La sémantique de SQL définit un ensemble d’opérations modulaires déclaratives plutôt que fonctionnelles
- La grammar of graphics est un cadre théorique qui décompose les concepts de visualisation des données en composants modulaires
- Des outils comme ggplot2 transforment ces concepts en implémentations concrètes
- La grammar of graphics définit elle aussi un ensemble d’opérations modulaires déclaratives plutôt que fonctionnelles
- Les deux systèmes ont de nombreux points communs dans leur manière d’aborder leur domaine et permettent de construire naturellement un pipeline complet et puissant, des données brutes à la visualisation finale
-
No runtime, no problem
- ggplot2 nécessite l’installation de R, et plotnine celle de Python
- À l’inverse, un outil de visualisation fondé sur un exécutable unique et ciblé présente des avantages clairs
- Il est plus facile d’intégrer un petit exécutable dans d’autres outils que de devoir embarquer R/Python ou exiger leur installation
- Son périmètre réduit facilite la limitation par sandbox de l’exécution de code malveillant ou accidentel
- Ces caractéristiques rendent ggsql plus attractif pour l’intégration dans des assistants d’analyse IA ou des outils de reporting orientés code exécutant du code dans divers environnements
- S’éloigner des langages interprétés implique aussi des contraintes, mais apporte des bénéfices importants
- L’avantage le plus important est que, grâce à sa structure stricte, le backend peut exécuter l’ensemble du pipeline de données de chaque couche dans une seule requête SQL
- Par exemple, pour tracer un diagramme en barres sur 10 milliards de transactions, seules les valeurs de count de chaque barre sont récupérées depuis le data warehouse, et non l’ensemble des 10 milliards de lignes
- Le même principe s’applique à des types de couches plus complexes comme les boxplots ou les density plots
- Cela contraste avec la plupart des outils de visualisation qui matérialisent d’abord l’ensemble des données avant de calculer et d’afficher le graphique
-
SELECT pod_door FROM bay WHERE closed- Les LLM ont démontré une grande efficacité pour convertir le langage naturel en SQL
- Il est avancé que le même niveau d’efficacité pourrait s’appliquer à ggsql
- Dans
querychat, l’exploration visuelle des données en langage naturel est déjà possible via ggsql - ggsql étant un runtime plus sûr et plus léger que R ou Python, il offre plus de garanties pour déployer des agents de codage en production
-
We are now wise beyond our years
- Les 18 années de développement et de maintenance de ggplot2 représentent 18 années de réflexion accumulée sur la grammaire de visualisation, l’utilisabilité et la conception
- Il n’est pas possible de réinjecter entièrement ce savoir dans ggplot2
- Il faut respecter des décisions anciennes et les attentes des utilisateurs, et même en les remettant en question, cela ne peut se faire que très progressivement
- ggsql est une blank slate
- Un projet construit à partir de zéro
- Un système conçu pour un environnement sans attentes préexistantes sur les outils de visualisation
- Il est indiqué que ce point de départ a apporté un sentiment de liberté et d’énergie au processus de développement, et que cela se ressent dans l’expérience utilisateur
Avenir
- La version actuelle est une alpha-release et n’est pas encore terminée
- Une liste non exhaustive des éléments prévus pour la suite est présentée
- Un nouveau writer haute performance écrit en Rust de zéro
- Une infrastructure de thèmes
- L’interactivité
- Un flux de déploiement de bout en bout de Posit Workbench ou Positron vers Connect
- Un language server ggsql complet et un formatter de code
- La prise en charge des données spatiales
-
Qu’est-ce que cela signifie pour le développement de ggplot2
- Il est mentionné que les utilisateurs de ggplot2 peuvent accueillir l’annonce de ggsql avec un mélange d’inquiétude et d’attente
- À la question de savoir si Posit délaisse ggplot2 pour se concentrer sur ggsql, la réponse est non
- ggplot2 est déjà très mature et stable, mais il est prévu de continuer à le soutenir et à l’étendre
- Il est espéré que le développement de ggsql contribuera aussi à apporter de nouvelles fonctionnalités à ggplot2
En savoir plus
- Pour commencer à utiliser ggsql immédiatement, la section Getting started du site web de ggsql propose un guide d’installation et un tutoriel
- La page de documentation permet de consulter l’ensemble des fonctionnalités prises en charge par ggsql
- Le texte précise également qu’un retour sur l’expérience utilisateur est attendu
Aucun commentaire pour le moment.