自動美化你的Matplotlib ,使用Seaborn控制圖表的默認值

如果您曾經在 Python 中進行過數據可視化,那麼很可能您使用了 Matplotlib 庫。
這個庫包含了許多繪圖的功能。但是一些概念上簡單的可視化需要大量的代碼才能完成。
而在這個時代,人們希望能夠與圖表進行交互——這是普通 Matplotlib 庫無法提供的功能。
更重要的是,採用默認設置的 Matplotlib 圖表通常看起來很糟糕。

當然,默認的 Matplotlib 設置能夠使得您的可視化視覺效果看起來十分樸素,但是顯然是有點過時的。
它默認的藍色陰影通常難以滿足許多數據科學家的需求。


採取默認設置的柱狀圖


稍加調整的柱狀圖

同時,Matplotlib 的一個不足之處在於它的可定製性。
您可以創建非常複雜的視覺效果,但是不可否認,實現複雜的視覺效果需要很多行代碼,而大部分數據科學家很少有太多時間用於這一方面。

不想每個 plot 都有那個煩人的邊框嗎?
想使用您品牌的調色板而不必每次都指定十六進制代碼嗎?
要對所有圖表標籤使用 Comic Sans 字體嗎?
尋求專業庫的幫助吧。

顏色設置

Matplotlib 中有自帶的顏色系統(例如廣爲人知的“bisque”、“lavenderblush” 和 “lightgoldenrodyellow”),繪圖時可以通過十六進制代碼的形式設置顏色。
可以很方便地自定義調色板。
例如, CB91 字體的背景通過一組預定義的顏色代碼進行設置。

上圖使用到的顏色代碼有:

CB91_Blue = '#2CBDFE'
CB91_Green = '#47DBCD'
CB91_Pink = '#F3A0F2'
CB91_Purple = '#9D2EC5'
CB91_Violet = '#661D98'
CB91_Amber = '#F5B14C'

如果你想創建自己的調色板,有一些有用的工具可以在線幫助。比如 Colormind.io通過深度學習從照片、電影和流行藝術中學習色彩風格,因此色調搭配得很好。

通過上述代碼定義了顏色集,就可以將其聲明爲一個顏色列表,然後更改 Matplotlib 的顏色庫 cycler

color_list = [CB91_Blue, CB91_Pink, CB91_Green, CB91_Amber, CB91_Purple, CB91_Violet]
plt.rcParams['axes.prop_cycle'] = plt.cycler(color=color_list)

現在,就成功替換了 Matplotlib 繪圖所需的默認顏色庫,當新建一個多系列繪圖時,將會在 cycler 中按順序進行檢索並設置各個系列的顏色。

您還可以使用十六進制顏色列表定義漸變顏色,但是需要在列表中定義許多十六進制值(至少40個)。手動創建這麼長的列表可能會很麻煩,這裏我建議使用colordesigner.io自動生成所需列表(只需選擇要漸變的顏色,最大化漸變步數,然後從生成的HTML中提取十六進制代碼)。

如下代碼展示了我使用的一個十六進制顏色列表(介於藍色和紫色):

#A list of hex colours running between blue and purple
CB91_Grad_BP = ['#2cbdfe', '#2fb9fc', '#33b4fa', '#36b0f8',
                '#3aacf6', '#3da8f4', '#41a3f2', '#449ff0',
                '#489bee', '#4b97ec', '#4f92ea', '#528ee8',
                '#568ae6', '#5986e4', '#5c81e2', '#607de0',
                '#6379de', '#6775dc', '#6a70da', '#6e6cd8',
                '#7168d7', '#7564d5', '#785fd3', '#7c5bd1',
                '#7f57cf', '#8353cd', '#864ecb', '#894ac9',
                '#8d46c7', '#9042c5', '#943dc3', '#9739c1',
                '#9b35bf', '#9e31bd', '#a22cbb', '#a528b9',
                '#a924b7', '#ac20b5', '#b01bb3', '#b317b1']

座標軸調整

Seaborn 是一個以 Matplotlib 爲基礎的庫,可以通過一兩行代碼創建更復雜的圖表類型(如 Heatmaps、Violins 和 Joint Plots)。


通過 Seaborn 生成的 heatmap

Seaborn 的一個鮮爲人知的特性是它能夠使用.set方法控制 Matplotlib 默認值設置(改變顏色、座標軸和默認字體)。我們還可以使用 .set_context()方法調整字體大小設置。

詳細資料可以查看官方教程。下面是一個簡單的例子:

import matplotlib.pyplot as plt
import seaborn as sns
sns.set(font=’Franklin Gothic Book’,
        rc={
 ‘axes.axisbelow’: False,
 ‘axes.edgecolor’: ‘lightgrey’,
 ‘axes.facecolor’:None,
 ‘axes.grid’: False,
 ‘axes.labelcolor’: ‘dimgrey’,
 ‘axes.spines.right’: False,
 ‘axes.spines.top’: False,
 ‘figure.facecolor’: ‘white’,
 ‘lines.solid_capstyle’:round,
 ‘patch.edgecolor’: ‘w’,
 ‘patch.force_edgecolor’: True,
 ‘text.color’: ‘dimgrey’,
 ‘xtick.bottom’: False,
 ‘xtick.color’: ‘dimgrey’,
 ‘xtick.direction’: ‘out’,
 ‘xtick.top’: False,
 ‘ytick.color’: ‘dimgrey’,
 ‘ytick.direction’: ‘out’,
 ‘ytick.left’: False,
 ‘ytick.right’: False})
sns.set_context("notebook", rc={"font.size":16,
                                "axes.titlesize":20,
                                "axes.labelsize":18})

定義自己的默認設置文件

每次都將前文所提及的所有設置代碼寫在 Jupyter notebook 前面,會顯得整個代碼不夠簡潔。這一點在需要涉及衆多十六進制顏色聲明時尤其明顯。並且也不利於在多個 notebook 中重複使用。

因此,將相關代碼統一集成到一個代碼文件裏,然後在需要時對其進行調用,是一個十分有效的方法。
這樣每次編寫代碼時,只需要在開始部分引入該 .py 文件即可。

Bring in data visualisation libraries as usual
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
#Bring in our custom settings
#Assumes that cb91visuals.py is in the repo's root folder
from cb91visuals import *

其它技巧

除了顏色、座標軸、字體設置外,Matplotlib/Seaborn 還可以對以下內容進行設置。

  • 圖例框:圖例周圍的小框通常是不必要的,並且增加了視覺上的混亂。可通過以下方式關閉:
plt.legend(frameon=False)
  • 刪除座標軸:有時我們想刪除一個軸,這可以通過 Seaborn 的 destine 方法完成(根據需要指定左、右、上或下):
sns.despine(left=True, bottom=True)
  • 柱狀圖上的數字標籤:這是軟件包中真正應該提供的功能,您可以使用 for looping 和 Matplotlib 的 .text()方法將數字標籤添加到柱狀圖列的頂部。
#Here, 'labels' refers to the bigrams on the y-axis
#i.e. 'Look forward', 'Jó éjt', etc.
#and X is the list of values determining bar length
#Loop through these labels
for n, i in enumerate(labels):
    #Create an axis text object
    ax.text(X[n]-0.003, #X location of text (with adjustment)
            n, #Y location
            s=f'{round(X[n],3)}%', #Required label with formatting
            va='center', #Vertical alignment
            ha='right', #Horizontal alignment
            color='white', #Font colour and size
            fontsize=12)

通過上述代碼實現了在水平柱狀圖上添加數字標籤。


作者:Callum Ballard
deephub翻譯組:Oliver Lee

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章