如何在 Python 中使用 ggplot2?
本文章原文托管在語雀,作者是史提芬先森。更多精彩與更新內容,參考原文:https://www.yuque.com/shenweiyan/cookbook/how-to-use-ggplot2-in-python
簡介
由于嚴格執行圖形語法,ggplot2 提供了一種極其直觀且一致的數據繪制方式。 ggplot2 的繪圖方法不僅確保每個繪圖都包含某些基本元素,而且在很大程度上簡化了代碼的可讀性。
?
但是,如果您是 Python 的頻繁使用用戶,那么由于 matplotlib 或 seaborn 等流行繪圖庫中缺乏標準化語法,因此實現圖形語法可能會非常具有挑戰性。 如果您仍想使用圖形語法,那么 Python 包 plotnine 為您提供了另一種選擇。
?
?
圖形語法
如果您不熟悉圖形的語法,這里有一個快速概述:

如您所見,從您的數據開始,有幾個組件構成了圖形的語法。在確定要可視化的數據后,您必須指定您感興趣的變量。例如,您可能希望在 x 軸上顯示一個變量,在 y 軸上顯示另一個變量。第三,你必須定義你想使用什么類型的幾何對象(geometric object,簡稱 geom)。這可以是從條形圖到散點圖或任何其他現有繪圖類型的任何東西。
?
所有的組件中,前三個組件是強制性的。沒有數據,就沒有什么可繪制的。沒有軸定義,也沒有什么可以繪制的。最后,如果不定義幾何對象,您只會看到一個空坐標系。構成圖形語法的其余組件是可選的,可以它們的實現以改進可視化。分面(facet) 指的是子圖(subplots)的規范,也就是說,在單獨的圖中,將數據中的幾個變量挨個繪制出來。統計轉換主要是指在繪圖中包含匯總統計信息,例如中位數或百分位數。坐標描述了可供您使用的不同坐標系。最常用和默認的坐標系是笛卡爾坐標系。根據您要繪制的數據結構,較少使用的坐標系(例如極坐標系)可能會提供更好的數據可視化方式。最后,主題提供了多種選項來設計繪圖的所有非數據元素,例如圖例、背景或注釋。
?
雖然有許多可視化圖形語法的方法,但我特別喜歡我在上面創建的那個,因為它暗示了這些層的可加性以及它們相互構建的事實。如果您曾經使用過 ggplot2,那么您就會熟悉其語法中的“+”,它象征著上述相同的想法。
plotnine
plotnine 是一個 Python 包,允許您使用實現圖形語法的類似 ggplot2 的代碼。 通過這樣做,就像在 ggplot2 中一樣,您可以將數據專門映射到構成可視化的可視對象。 這使您能夠提高代碼的可讀性和結構。 雖然您可以將 matplotlib 的樣式設置為 ggplot,但您無法像在 ggplot2 中那樣在 matplotlib 中實現圖形語法。
?
安裝
在開始之前,您必須安裝 plotnine。 與往常一樣,這樣做有兩個主要選項:pip 和 conda。
# Using pip
pip install plotnine
# Using conda
conda install -c conda-forge plotnine
繪圖
安裝了 plotnine 之后,就可以開始使用圖形語法繪制圖形了。讓我們開始構建一個非常簡單的繪圖,只使用三個必不可少的組成部分:數據、aesthetics 組件和幾何對象。

如您所見,語法非常類似于 ggplot2。首先,我們指定數據源。在我們的例子中,我們使用的數據是典型的 mpg 數據集。接下來,我們定義變量 "class" 將顯示在 x 軸上。最后,我們說,我們想使用大小為 20 的條形圖來可視化我們的數據。讓我們來看看完整的代碼和結果圖:
import pandas as pd
import numpy as np
from pandas.api.types import CategoricalDtype
from plotnine import *
from plotnine.data import mpg
%matplotlib inline
(ggplot(mpg) # defining what data to use
+ aes(x='class') # defining what variable to use
+ geom_bar(size=20) # defining the type of plot to use
)
上面的代碼將產生以下輸出:

雖然這是一個好的開始,但看起來還不是很好。讓我們用圖形的語法的其他組成部分來美化我們的圖形。
(ggplot(mpg)
+ aes(x='class')
+ geom_bar(size=20)
+ coord_flip() # flipping the x- and y-axes
+ labs(title='Number of Vehicles per Class', x='Vehicle Class', y='Number of Vehicles') # customizing labels
)
例如,我們可以使用coord_flip()翻轉坐標軸,并使用labs()自定義繪圖和坐標軸標題以改進我們的繪圖。使用上面的代碼塊,我們的繪圖將如下所示:

繪制多維數據
除了基本的繪圖之外,您還可以在 ggplot2 中完成幾乎所有可以做的事情,比如繪制多維數據。如果你想將三個變量之間的關系可視化,你可以在平面圖上添加美學元素:
(ggplot(mpg)
+ aes(x='displ', y='hwy', color='class')
+ geom_point()
+ labs(title='Engine Displacement vs. Highway Miles per Gallon', x='Engine Displacement, in Litres', y='Highway Miles per Gallon')
)
將 color 添加到 aesthetics 組件中將會促使 plotnine 呈現一個在 x 軸上使用 displ(發動機排量,以升為單位)和在 y 軸上使用 hwy(每加侖高速公路英里數),并根據 class 變量為數據著色的二維圖。我們還可以將幾何對象切換到 geom_point(),這將為我們提供散點圖而不是條形圖。 讓我們來看看會是什么樣子:

總結
如您所見,plotnine 為您提供了在 Python 中利用圖形語法的能力。這增加了代碼的可讀性,并允許您將部分數據專門映射到可視對象。如果您已經熟悉 ggplot2,那么您無需學習任何新知識即可掌握 plotnine。如果沒有,這里是 ggplot2 網站的鏈接,您可以在該網站上找到更多關于圖形語法和所有類型的可用幾何對象的信息。

浙公網安備 33010602011771號