今天,我們非常興奮地宣布 ggsql 的 Alpha 版本發布。正如其名,ggsql 是基於 SQL 語法實現的圖形語法,為 SQL 帶來豐富、結構化的視覺化支援。它已準備好在 Quarto、Jupyter 筆記本、Positron 和 VS Code 等環境中使用。

在這篇文章中,我們將探討開發此工具的動機,並提供充足的使用範例,希望能讓您對它感到和我們一樣興奮。

在討論「為什麼」之前,讓我們透過一些範例來了解 ggsql 的作用。

為了初步體驗,讓我們從視覺化的「Hello World」開始:一個散佈圖,使用內建的 penguins 資料集:

這不算太難。當然,它有 SQL 的冗長,但這也意味著您可以將繪圖程式碼唸出來並理解其作用。我們可以逐行解析這裡的內容:

有了這個基礎,我們就可以開始為視覺化添加內容了:

我們看到,對映射的單一添加就為圖表增加了帶有顏色的類別。這種繪圖程式碼的漸進演變是圖形語法最大的優勢之一。沒有預定義的圖表類型,只有可以組合、添加和移除的模組化零件。為了進一步強調這一點,讓我們為圖表添加一個平滑的回歸線:

我們在點圖層之上添加了一個新圖層。這個圖層也借用了與點圖層相同的映射。由於我們按物種著色,平滑線會被分成每個物種一條。

我們可以繼續這樣做,添加更多映射,添加或交換圖層,控制比例尺的應用方式等,直到我們得到所需的圖表,無論它多麼簡單或複雜。在上面的範例中,我們可能會發現我們對查看資料收集自三個島嶼的物種分佈更感興趣:

雖然這是完全不同的圖表,但您可以看到先前圖表中很大一部分程式碼在這裡仍然沿用。

在完成了前幾個圖表後,讓我們進入一個完整的範例。它將包含我們以前未見過的零件,但別擔心,我們將在下面逐一介紹,甚至包括我們已經見過的零件。這個範例改編自 Jack Davison 為 TidyTuesday 創建的視覺化。

這段程式碼量很大,但另一方面,我們透過一個範例涵蓋了語法中最重要的大部分方面。

在最高層級,此查詢有兩個部分:SQL 查詢和視覺化查詢。SQL 查詢是從開頭到 VISUALIZE 子句的任何內容。這是標準的 SQL,它接受您的後端接受的任何內容(在本部落格文章中,我們使用 DuckDB 後端)。查詢的結果直接傳遞給視覺化,而不是像您通常預期的那樣以表格形式返回。

由於這篇文章的重點不是教您 SQL,我們將不再花費太多時間討論 SQL 查詢部分。主要 takeaway 是,VISUALIZE 子句之前的任何內容都是純 SQL,任何產生的表格都會被視覺化自動使用,並且在那裡創建的任何表格或 CTE 都可以在視覺化查詢中引用。

正如我們在第一個範例中所見,SQL 查詢部分是可選的。如果您的資料已經是適合繪圖的形狀,您可以跳過它,而在 VISUALIZE 子句中直接命名來源:

現在,讓我們看看視覺化查詢 — 從 VISUALIZE 開始的所有內容。VISUALIZE 標誌著 SQL 查詢的結束和視覺化查詢的開始(或者對於偏好英式拼寫的人來說是 VISUALISE)。它可以獨立存在,或者像我們在這裡一樣,包含一個或多個映射,這些映射將成為所有後續圖層的預設值。映射純粹用於將資料與抽象的視覺屬性關聯起來。映射就像一個 SELECT,您將欄位別名為視覺屬性(在圖形語法中稱為 aesthetics)。在上面的視覺化中,我們說 age 欄位保存用於 x(x 軸位置)的值,category 欄位保存用於 fill(實體的填充顏色)的值。我們還沒有說明如何繪製它。

在 VISUALIZE 查詢之後,我們有一個 DRAW 子句。DRAW 是我們為視覺化添加圖層的方式。ggsql 中有大量不同類型的圖層。有些很直接:例如,point 用於繪製散佈圖。有些更複雜:histogram(我們在這裡使用)需要計算衍生統計數據,如分箱計數。一個視覺化可以包含任意數量的圖層,圖層將按照它們定義的順序渲染。DRAW 有一個兄弟子句叫做 PLACE。它用於註釋,工作方式類似於 DRAW,除了它不從表格獲取數據,而是以提供的文字值獲取。因此,我們的視覺化包含三個圖層:一個顯示我們表格數據的直方圖圖層,一個顯示每個類別預先計算的平均值的規則註釋圖層,以及一個添加視覺化上下文的文本註釋圖層。值得一提的是,一個圖層並不對應一個單獨的圖形實體。就像上面的文本圖層一樣,每個圖層都可以渲染多個獨立的同類型實體,因此無需例如 3 個線條圖層來渲染 3 個不同類別的線條圖。

在 DRAW 和 PLACE 子句之後,我們有一個 SCALE 子句。此子句控制如何將數據值轉換為對 aesthetic 有意義的值。在我們的例子中,category 欄位包含字串「Age at mission」和「Age at selection」,這本身並不直接轉換為顏色值。SCALE fill TO accent 子句告訴 ggsql 在將映射到 fill 的值轉換為實際顏色時使用「accent」調色板。比例尺可用於更多用途,例如對連續數據應用轉換,定義斷點,以及設定特定的比例尺類型(如序數或分箱)。

我們視覺化查詢的最後一個子句是 LABEL,它允許我們添加或修改各種文本標籤,如標題、副標題以及軸和圖例標題。

這內容很多。但這一切都有兩個非常好的好處:

我們已經在上面的範例中看到了較短的視覺化查詢,但讓我們繼續用一個盒狀圖來展示太空人出生年份按性別劃分:

這比上一個圖表程式碼短得多,但仍然,如果您來自不同的繪圖系統,您甚至可能認為這過於冗長(例如,與 boxplot(astronauts.sex, astronauts.year_of_birth) 相比)。是的,它更長,但它也更結構化、更具組合性、更具自我描述性。這些特性(這是其圖形語法傳承的直接結果)意味著您和您未來的 LLM 編碼夥伴將更容易掌握所有類型圖表的運作方式。ggplot2 在 R 生態系統中 18 年的統治地位就是證明。

例如,讓我們將上述圖表更改為顯示相同的關係,作為一個抖動的散佈圖。

或者,也許抖動會跟隨數據的分佈,使其兼具小提琴圖的功能:

正如您所見,語法和組合性使得視覺化迭代非常符合人體工程學,這在探索性分析和視覺化設計中都非常有價值。

從頭開始編寫一個新的視覺化庫是一項艱鉅的任務,您可能會想知道為什麼我們要再次這樣做。一些原因如下:

雖然最初的 R 然後是 Python 吸引了數據科學革命的所有注意力,但 SQL 作為其底層可靠而強大的主力一直在穩步發展。有許多數據工作者僅或主要在 SQL 中工作。他們在視覺化數據方面的選擇在我們看來通常不是最佳的:

我們設計 ggsql 的目標是讓語法對 SQL 使用者來說立即有意義,利用他們對可組合、聲明式子句的期望。

除了提供更好的數據視覺化方式外,ggsql 也是一種邀請 SQL 使用者進入我們基於 Quarto 構建的豐富的基於程式碼的報告生成和共享生態系統的方式。

如果您在閱讀本文時對 SQL 沒有先驗知識,這裡有一個非常簡短的回顧:SQL 是一種領域特定語言,用於操作存儲在一個或多個表格中的關聯數據。其語法基於關聯代數的概念,這是一種結構化的思考數據操作的方法。其語義定義了一組模組化操作,這些操作是聲明的而不是函數式的,允許使用者使用一組定義良好的操作來組合非常強大和自定義的操作。

如果您在閱讀本文時對圖形語法沒有先驗知識,這裡有一個非常簡短的回顧:圖形語法是對數據視覺化概念的理論分解,將其分解為模組化零件。雖然純粹是理論性的,但像 ggplot2 這樣的工具在實踐中實現了這一想法。其語義定義了一組模組化操作,這些操作是聲明的而不是函數式的,允許使用者使用一組定義良好的操作來組合非常強大和自定義的視覺化。

從上述略帶誇張的概述中可以清楚地看出,SQL 和圖形語法在它們各自領域的方法上有很多共同點。結合起來,它們可以為從原始數據到最終視覺化的整個管道提供一個非常強大且自然的解決方案。

為什麼 ggplot2 和 plotnine 分別需要安裝 R 和 Python 很重要?一個單一、專注的可執行文件來處理數據視覺化有明顯的好處:

以上兩點都使得 ggsql 成為整合到 AI 代理輔助數據分析或可能在不同環境中執行程式碼的基於程式碼的報告工具等工具中更具吸引力的選擇。

您可能會認為我們為了擺脫解釋型語言而不得不吞下一些苦果,但這也給了我們很多東西。最重要的是,嚴格的結構意味著我們可以將整個數據管道作為每個圖層的單個 SQL 查詢在後端執行。這意味著,如果您想創建一個包含 100 億筆交易的條形圖,您只需要從數據倉庫中獲取每個條形的計數值,而不是 100 億筆數據行。對於更複雜的圖層類型,如盒狀圖和密度圖,情況也是如此。這與大多數必須先具體化完整數據,然後在其上執行必要計算,然後繪製它的視覺化工具形成了鮮明對比。

LLM 在將自然語言翻譯成 SQL 方面已被證明非常有效,我們相信它們在 ggsql 方面也會同樣有效。我們已經在 querychat 中看到了證據,您現在可以透過 ggsql 使用自然語言視覺化地探索數據。而且,由於 ggsql 比 R 或 Python 運行時更安全、更輕量,您可以更自信地將編碼代理部署到生產環境中。

ggplot2 18 年的開發和維護也意味著 18 年對數據視覺化語法、使用和設計的思考。雖然我們並不自誇,但我們相信這使我們在主題方面擁有專業知識。然而,並非所有這些知識都能被重新注入 ggplot2。許多年前就已確立的決策和期望我們必須遵守,或者至少只能非常緩慢地挑戰(我們偶爾會這樣做)。

ggsql 是一個空白的畫布。不僅僅是因為我們從頭開始構建它,還因為它是為一個沒有視覺化工具既定期望的環境而構建的。我無法強調這感覺多麼解放和令人振奮,而且我確信這在 ggsql 給用戶的感覺中得到了體現。

我們即將結束一篇相當長的公告 — 感謝您的耐心閱讀。在第一行,我們稱之為 Alpha 版本,這意味著我們還沒有完成。為了讓您對 ggsql 的未來感到像對現在的狀態一樣興奮,這裡有一份我們想要添加的功能的非詳盡列表。

如果您是 ggplot2 的現有用戶,您可能帶著恐懼和興奮(或者可能只有其中一種)的心情閱讀了這篇文章。這是否意味著我們在 Posit 將 ggplot2 拋諸腦後,專注於我們的新閃亮玩具?一點也不是!ggplot2 在這一點上已經非常成熟和穩定,但我們將繼續支持並擴展它。我們也希望 ggsql 能夠回報所有進入其開發的 ggplot2 的經驗,為 ggplot2 提供新功能的啟發。

如果您迫不及待想了解更多關於 ggsql 的資訊並開始使用它,您可以前往 ggsql 網站的「入門」部分獲取安裝說明和教程,或者直接前往文件了解 ggsql 的所有功能。我們迫不及待希望您嘗試一下,並聽聽您的使用體驗。

ggsql 0.4.1 增加了對空間繪圖和圖層內數據聚合的支持。請閱讀此發布貼文了解新功能的全部內容。

webR 0.6.0 已發布,帶來了最新版本的 R、LLVM 和 Emscripten 工具鏈的更新、為 WebAssembly 編譯的其他系統庫以及錯誤修復。

querychat 現在支持 ggsql 驅動的視覺化 — 用戶可以提出「顯示給我看」的問題,並直接在聊天中獲得渲染的圖表,以及 SQL 查詢和響應式過濾,所有這些都無需任意代碼執行。

獲取 Posit 開源項目和社區見解的最新更新。

數據科學的開源軟件和工具。

訪問 posit.co 了解我們的企業產品如何讓您更安全、更協作、更大規模地使用開源工具。